73 lines
2.0 KiB
Go
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
|
|
}
|