package v1 import ( "context" "fmt" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" v1pb "github.com/usememos/memos/proto/gen/api/v1" storepb "github.com/usememos/memos/proto/gen/store" "github.com/usememos/memos/store" ) func (s *APIV1Service) ListMemoReactions(ctx context.Context, request *v1pb.ListMemoReactionsRequest) (*v1pb.ListMemoReactionsResponse, error) { reactions, err := s.Store.ListReactions(ctx, &store.FindReaction{ ContentID: &request.Name, }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to list reactions") } response := &v1pb.ListMemoReactionsResponse{ Reactions: []*v1pb.Reaction{}, } for _, reaction := range reactions { reactionMessage, err := s.convertReactionFromStore(ctx, reaction) if err != nil { return nil, status.Errorf(codes.Internal, "failed to convert reaction") } response.Reactions = append(response.Reactions, reactionMessage) } return response, nil } func (s *APIV1Service) UpsertMemoReaction(ctx context.Context, request *v1pb.UpsertMemoReactionRequest) (*v1pb.Reaction, error) { user, err := s.GetCurrentUser(ctx) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get current user") } reaction, err := s.Store.UpsertReaction(ctx, &store.Reaction{ CreatorID: user.ID, ContentID: request.Reaction.ContentId, ReactionType: storepb.ReactionType(request.Reaction.ReactionType), }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to upsert reaction") } reactionMessage, err := s.convertReactionFromStore(ctx, reaction) if err != nil { return nil, status.Errorf(codes.Internal, "failed to convert reaction") } return reactionMessage, nil } func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error) { if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{ ID: request.ReactionId, }); err != nil { return nil, status.Errorf(codes.Internal, "failed to delete reaction") } return &emptypb.Empty{}, nil } func (s *APIV1Service) convertReactionFromStore(ctx context.Context, reaction *store.Reaction) (*v1pb.Reaction, error) { creator, err := s.Store.GetUser(ctx, &store.FindUser{ ID: &reaction.CreatorID, }) if err != nil { return nil, err } return &v1pb.Reaction{ Id: reaction.ID, Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID), ContentId: reaction.ContentID, ReactionType: v1pb.Reaction_Type(reaction.ReactionType), }, nil }