package grpc import ( "bytes" "context" "log/slog" "time" "git.dubyatp.xyz/dubyatp/scannerbot/server/api" pb "git.dubyatp.xyz/dubyatp/scannerbot/server/proto" "github.com/google/uuid" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type MessageServer struct { pb.UnimplementedMessageServiceServer } func (s *MessageServer) SendMessage(ctx context.Context, req *pb.SendMessageRequest) (*pb.SendMessageResponse, error) { slog.Debug("grpc: entering SendMessage handler") channelID, err := uuid.Parse(req.ChannelId) if err != nil { slog.Error("grpc: invalid channel_id", "error", err) return nil, status.Errorf(codes.InvalidArgument, "invalid channel_id: %v", err) } channel, err := api.DBGetChannel(channelID.String()) if err != nil { slog.Error("grpc: channel not found", "channelid", channelID, "error", err) return nil, status.Errorf(codes.NotFound, "channel not found") } filename := req.AudioFilename if filename == "" { filename = channelID.String() + ".wav" } audio, err := api.Store.Save(filename, bytes.NewReader(req.Audio)) if err != nil { slog.Error("grpc: failed to save audio file", "error", err) return nil, status.Errorf(codes.Internal, "failed to save audio file") } if err := api.DBAddFile(audio); err != nil { slog.Error("grpc: failed to persist audio file record", "error", err) return nil, status.Errorf(codes.Internal, "failed to persist audio file") } msg := &api.Message{ ID: uuid.New(), Channel: *channel, Created: time.Now(), Content: req.Content, Audio: *audio, } if err := api.DBAddMessage(msg); err != nil { slog.Error("grpc: failed to persist message", "error", err) return nil, status.Errorf(codes.Internal, "failed to persist message") } slog.Debug("grpc: message saved", "messageid", msg.ID, "channelid", channelID) return &pb.SendMessageResponse{ Id: msg.ID.String(), ChannelId: channel.ID.String(), Created: msg.Created.Format(time.RFC3339), Content: msg.Content, AudioId: audio.ID.String(), }, nil }