reaction_service.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package v1
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc/codes"
  6. "google.golang.org/grpc/status"
  7. "google.golang.org/protobuf/types/known/emptypb"
  8. v1pb "github.com/usememos/memos/proto/gen/api/v1"
  9. storepb "github.com/usememos/memos/proto/gen/store"
  10. "github.com/usememos/memos/store"
  11. )
  12. func (s *APIV1Service) ListMemoReactions(ctx context.Context, request *v1pb.ListMemoReactionsRequest) (*v1pb.ListMemoReactionsResponse, error) {
  13. reactions, err := s.Store.ListReactions(ctx, &store.FindReaction{
  14. ContentID: &request.Name,
  15. })
  16. if err != nil {
  17. return nil, status.Errorf(codes.Internal, "failed to list reactions")
  18. }
  19. response := &v1pb.ListMemoReactionsResponse{
  20. Reactions: []*v1pb.Reaction{},
  21. }
  22. for _, reaction := range reactions {
  23. reactionMessage, err := s.convertReactionFromStore(ctx, reaction)
  24. if err != nil {
  25. return nil, status.Errorf(codes.Internal, "failed to convert reaction")
  26. }
  27. response.Reactions = append(response.Reactions, reactionMessage)
  28. }
  29. return response, nil
  30. }
  31. func (s *APIV1Service) UpsertMemoReaction(ctx context.Context, request *v1pb.UpsertMemoReactionRequest) (*v1pb.Reaction, error) {
  32. user, err := s.GetCurrentUser(ctx)
  33. if err != nil {
  34. return nil, status.Errorf(codes.Internal, "failed to get current user")
  35. }
  36. reaction, err := s.Store.UpsertReaction(ctx, &store.Reaction{
  37. CreatorID: user.ID,
  38. ContentID: request.Reaction.ContentId,
  39. ReactionType: storepb.ReactionType(request.Reaction.ReactionType),
  40. })
  41. if err != nil {
  42. return nil, status.Errorf(codes.Internal, "failed to upsert reaction")
  43. }
  44. reactionMessage, err := s.convertReactionFromStore(ctx, reaction)
  45. if err != nil {
  46. return nil, status.Errorf(codes.Internal, "failed to convert reaction")
  47. }
  48. return reactionMessage, nil
  49. }
  50. func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error) {
  51. if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{
  52. ID: request.ReactionId,
  53. }); err != nil {
  54. return nil, status.Errorf(codes.Internal, "failed to delete reaction")
  55. }
  56. return &emptypb.Empty{}, nil
  57. }
  58. func (s *APIV1Service) convertReactionFromStore(ctx context.Context, reaction *store.Reaction) (*v1pb.Reaction, error) {
  59. creator, err := s.Store.GetUser(ctx, &store.FindUser{
  60. ID: &reaction.CreatorID,
  61. })
  62. if err != nil {
  63. return nil, err
  64. }
  65. return &v1pb.Reaction{
  66. Id: reaction.ID,
  67. Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID),
  68. ContentId: reaction.ContentID,
  69. ReactionType: v1pb.Reaction_Type(reaction.ReactionType),
  70. }, nil
  71. }