server: implement messages and gRPC support for creating messages
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user