Files
scannerbot/server/grpc/message.go
T

73 lines
2.0 KiB
Go

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
}