inbox_service.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package v1
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "google.golang.org/grpc/codes"
  7. "google.golang.org/grpc/status"
  8. "google.golang.org/protobuf/types/known/emptypb"
  9. "google.golang.org/protobuf/types/known/timestamppb"
  10. v1pb "github.com/usememos/memos/proto/gen/api/v1"
  11. "github.com/usememos/memos/store"
  12. )
  13. func (s *APIV1Service) ListInboxes(ctx context.Context, _ *v1pb.ListInboxesRequest) (*v1pb.ListInboxesResponse, error) {
  14. user, err := s.GetCurrentUser(ctx)
  15. if err != nil {
  16. return nil, status.Errorf(codes.Internal, "failed to get user")
  17. }
  18. inboxes, err := s.Store.ListInboxes(ctx, &store.FindInbox{
  19. ReceiverID: &user.ID,
  20. })
  21. if err != nil {
  22. return nil, status.Errorf(codes.Internal, "failed to list inbox: %v", err)
  23. }
  24. response := &v1pb.ListInboxesResponse{
  25. Inboxes: []*v1pb.Inbox{},
  26. }
  27. for _, inbox := range inboxes {
  28. inboxMessage := convertInboxFromStore(inbox)
  29. if inboxMessage.Type == v1pb.Inbox_TYPE_UNSPECIFIED {
  30. continue
  31. }
  32. response.Inboxes = append(response.Inboxes, inboxMessage)
  33. }
  34. return response, nil
  35. }
  36. func (s *APIV1Service) UpdateInbox(ctx context.Context, request *v1pb.UpdateInboxRequest) (*v1pb.Inbox, error) {
  37. if request.UpdateMask == nil || len(request.UpdateMask.Paths) == 0 {
  38. return nil, status.Errorf(codes.InvalidArgument, "update mask is required")
  39. }
  40. inboxID, err := ExtractInboxIDFromName(request.Inbox.Name)
  41. if err != nil {
  42. return nil, status.Errorf(codes.InvalidArgument, "invalid inbox name: %v", err)
  43. }
  44. update := &store.UpdateInbox{
  45. ID: inboxID,
  46. }
  47. for _, field := range request.UpdateMask.Paths {
  48. if field == "status" {
  49. if request.Inbox.Status == v1pb.Inbox_STATUS_UNSPECIFIED {
  50. return nil, status.Errorf(codes.InvalidArgument, "status is required")
  51. }
  52. update.Status = convertInboxStatusToStore(request.Inbox.Status)
  53. }
  54. }
  55. inbox, err := s.Store.UpdateInbox(ctx, update)
  56. if err != nil {
  57. return nil, status.Errorf(codes.Internal, "failed to update inbox: %v", err)
  58. }
  59. return convertInboxFromStore(inbox), nil
  60. }
  61. func (s *APIV1Service) DeleteInbox(ctx context.Context, request *v1pb.DeleteInboxRequest) (*emptypb.Empty, error) {
  62. inboxID, err := ExtractInboxIDFromName(request.Name)
  63. if err != nil {
  64. return nil, status.Errorf(codes.InvalidArgument, "invalid inbox name: %v", err)
  65. }
  66. if err := s.Store.DeleteInbox(ctx, &store.DeleteInbox{
  67. ID: inboxID,
  68. }); err != nil {
  69. return nil, status.Errorf(codes.Internal, "failed to update inbox: %v", err)
  70. }
  71. return &emptypb.Empty{}, nil
  72. }
  73. func convertInboxFromStore(inbox *store.Inbox) *v1pb.Inbox {
  74. return &v1pb.Inbox{
  75. Name: fmt.Sprintf("%s%d", InboxNamePrefix, inbox.ID),
  76. Sender: fmt.Sprintf("%s%d", UserNamePrefix, inbox.SenderID),
  77. Receiver: fmt.Sprintf("%s%d", UserNamePrefix, inbox.ReceiverID),
  78. Status: convertInboxStatusFromStore(inbox.Status),
  79. CreateTime: timestamppb.New(time.Unix(inbox.CreatedTs, 0)),
  80. Type: v1pb.Inbox_Type(inbox.Message.Type),
  81. ActivityId: inbox.Message.ActivityId,
  82. }
  83. }
  84. func convertInboxStatusFromStore(status store.InboxStatus) v1pb.Inbox_Status {
  85. switch status {
  86. case store.UNREAD:
  87. return v1pb.Inbox_UNREAD
  88. case store.ARCHIVED:
  89. return v1pb.Inbox_ARCHIVED
  90. default:
  91. return v1pb.Inbox_STATUS_UNSPECIFIED
  92. }
  93. }
  94. func convertInboxStatusToStore(status v1pb.Inbox_Status) store.InboxStatus {
  95. switch status {
  96. case v1pb.Inbox_UNREAD:
  97. return store.UNREAD
  98. case v1pb.Inbox_ARCHIVED:
  99. return store.ARCHIVED
  100. default:
  101. return store.UNREAD
  102. }
  103. }