activity_service.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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/timestamppb"
  9. v1pb "github.com/usememos/memos/proto/gen/api/v1"
  10. storepb "github.com/usememos/memos/proto/gen/store"
  11. "github.com/usememos/memos/store"
  12. )
  13. func (s *APIV1Service) GetActivity(ctx context.Context, request *v1pb.GetActivityRequest) (*v1pb.Activity, error) {
  14. activityID, err := ExtractActivityIDFromName(request.Name)
  15. if err != nil {
  16. return nil, status.Errorf(codes.InvalidArgument, "invalid activity name: %v", err)
  17. }
  18. activity, err := s.Store.GetActivity(ctx, &store.FindActivity{
  19. ID: &activityID,
  20. })
  21. if err != nil {
  22. return nil, status.Errorf(codes.Internal, "failed to get activity: %v", err)
  23. }
  24. activityMessage, err := s.convertActivityFromStore(ctx, activity)
  25. if err != nil {
  26. return nil, status.Errorf(codes.Internal, "failed to convert activity from store: %v", err)
  27. }
  28. return activityMessage, nil
  29. }
  30. func (s *APIV1Service) convertActivityFromStore(ctx context.Context, activity *store.Activity) (*v1pb.Activity, error) {
  31. payload, err := s.convertActivityPayloadFromStore(ctx, activity.Payload)
  32. if err != nil {
  33. return nil, status.Errorf(codes.Internal, "failed to convert activity payload from store: %v", err)
  34. }
  35. return &v1pb.Activity{
  36. Name: fmt.Sprintf("%s%d", ActivityNamePrefix, activity.ID),
  37. Creator: fmt.Sprintf("%s%d", UserNamePrefix, activity.CreatorID),
  38. Type: activity.Type.String(),
  39. Level: activity.Level.String(),
  40. CreateTime: timestamppb.New(time.Unix(activity.CreatedTs, 0)),
  41. Payload: payload,
  42. }, nil
  43. }
  44. func (s *APIV1Service) convertActivityPayloadFromStore(ctx context.Context, payload *storepb.ActivityPayload) (*v1pb.ActivityPayload, error) {
  45. v2Payload := &v1pb.ActivityPayload{}
  46. if payload.MemoComment != nil {
  47. memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
  48. ID: &payload.MemoComment.MemoId,
  49. ExcludeContent: true,
  50. })
  51. if err != nil {
  52. return nil, status.Errorf(codes.Internal, "failed to get memo: %v", err)
  53. }
  54. relatedMemo, err := s.Store.GetMemo(ctx, &store.FindMemo{
  55. ID: &payload.MemoComment.RelatedMemoId,
  56. ExcludeContent: true,
  57. })
  58. if err != nil {
  59. return nil, status.Errorf(codes.Internal, "failed to get related memo: %v", err)
  60. }
  61. v2Payload.MemoComment = &v1pb.ActivityMemoCommentPayload{
  62. Memo: fmt.Sprintf("%s%s", MemoNamePrefix, memo.UID),
  63. RelatedMemo: fmt.Sprintf("%s%s", MemoNamePrefix, relatedMemo.UID),
  64. }
  65. }
  66. if payload.VersionUpdate != nil {
  67. v2Payload.VersionUpdate = &v1pb.ActivityVersionUpdatePayload{
  68. Version: payload.VersionUpdate.Version,
  69. }
  70. }
  71. return v2Payload, nil
  72. }