memo_service_converter.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package v1
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/pkg/errors"
  7. "google.golang.org/protobuf/types/known/timestamppb"
  8. "github.com/usememos/gomark/parser"
  9. "github.com/usememos/gomark/parser/tokenizer"
  10. v1pb "github.com/usememos/memos/proto/gen/api/v1"
  11. storepb "github.com/usememos/memos/proto/gen/store"
  12. "github.com/usememos/memos/store"
  13. )
  14. func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Memo) (*v1pb.Memo, error) {
  15. displayTs := memo.CreatedTs
  16. workspaceMemoRelatedSetting, err := s.Store.GetWorkspaceMemoRelatedSetting(ctx)
  17. if err != nil {
  18. return nil, errors.Wrap(err, "failed to get workspace memo related setting")
  19. }
  20. if workspaceMemoRelatedSetting.DisplayWithUpdateTime {
  21. displayTs = memo.UpdatedTs
  22. }
  23. name := fmt.Sprintf("%s%d", MemoNamePrefix, memo.ID)
  24. memoMessage := &v1pb.Memo{
  25. Name: name,
  26. Uid: memo.UID,
  27. State: convertStateFromStore(memo.RowStatus),
  28. Creator: fmt.Sprintf("%s%d", UserNamePrefix, memo.CreatorID),
  29. CreateTime: timestamppb.New(time.Unix(memo.CreatedTs, 0)),
  30. UpdateTime: timestamppb.New(time.Unix(memo.UpdatedTs, 0)),
  31. DisplayTime: timestamppb.New(time.Unix(displayTs, 0)),
  32. Content: memo.Content,
  33. Visibility: convertVisibilityFromStore(memo.Visibility),
  34. Pinned: memo.Pinned,
  35. }
  36. if memo.Payload != nil {
  37. memoMessage.Tags = memo.Payload.Tags
  38. memoMessage.Property = convertMemoPropertyFromStore(memo.Payload.Property)
  39. memoMessage.Location = convertLocationFromStore(memo.Payload.Location)
  40. }
  41. if memo.ParentID != nil {
  42. parent := fmt.Sprintf("%s%d", MemoNamePrefix, *memo.ParentID)
  43. memoMessage.Parent = &parent
  44. }
  45. listMemoRelationsResponse, err := s.ListMemoRelations(ctx, &v1pb.ListMemoRelationsRequest{Name: name})
  46. if err != nil {
  47. return nil, errors.Wrap(err, "failed to list memo relations")
  48. }
  49. memoMessage.Relations = listMemoRelationsResponse.Relations
  50. listMemoResourcesResponse, err := s.ListMemoResources(ctx, &v1pb.ListMemoResourcesRequest{Name: name})
  51. if err != nil {
  52. return nil, errors.Wrap(err, "failed to list memo resources")
  53. }
  54. memoMessage.Resources = listMemoResourcesResponse.Resources
  55. listMemoReactionsResponse, err := s.ListMemoReactions(ctx, &v1pb.ListMemoReactionsRequest{Name: name})
  56. if err != nil {
  57. return nil, errors.Wrap(err, "failed to list memo reactions")
  58. }
  59. memoMessage.Reactions = listMemoReactionsResponse.Reactions
  60. nodes, err := parser.Parse(tokenizer.Tokenize(memo.Content))
  61. if err != nil {
  62. return nil, errors.Wrap(err, "failed to parse content")
  63. }
  64. memoMessage.Nodes = convertFromASTNodes(nodes)
  65. snippet, err := getMemoContentSnippet(memo.Content)
  66. if err != nil {
  67. return nil, errors.Wrap(err, "failed to get memo content snippet")
  68. }
  69. memoMessage.Snippet = snippet
  70. return memoMessage, nil
  71. }
  72. func convertMemoPropertyFromStore(property *storepb.MemoPayload_Property) *v1pb.MemoProperty {
  73. if property == nil {
  74. return nil
  75. }
  76. return &v1pb.MemoProperty{
  77. HasLink: property.HasLink,
  78. HasTaskList: property.HasTaskList,
  79. HasCode: property.HasCode,
  80. HasIncompleteTasks: property.HasIncompleteTasks,
  81. }
  82. }
  83. func convertLocationFromStore(location *storepb.MemoPayload_Location) *v1pb.Location {
  84. if location == nil {
  85. return nil
  86. }
  87. return &v1pb.Location{
  88. Placeholder: location.Placeholder,
  89. Latitude: location.Latitude,
  90. Longitude: location.Longitude,
  91. }
  92. }
  93. func convertLocationToStore(location *v1pb.Location) *storepb.MemoPayload_Location {
  94. if location == nil {
  95. return nil
  96. }
  97. return &storepb.MemoPayload_Location{
  98. Placeholder: location.Placeholder,
  99. Latitude: location.Latitude,
  100. Longitude: location.Longitude,
  101. }
  102. }
  103. func convertVisibilityFromStore(visibility store.Visibility) v1pb.Visibility {
  104. switch visibility {
  105. case store.Private:
  106. return v1pb.Visibility_PRIVATE
  107. case store.Protected:
  108. return v1pb.Visibility_PROTECTED
  109. case store.Public:
  110. return v1pb.Visibility_PUBLIC
  111. default:
  112. return v1pb.Visibility_VISIBILITY_UNSPECIFIED
  113. }
  114. }
  115. func convertVisibilityToStore(visibility v1pb.Visibility) store.Visibility {
  116. switch visibility {
  117. case v1pb.Visibility_PRIVATE:
  118. return store.Private
  119. case v1pb.Visibility_PROTECTED:
  120. return store.Protected
  121. case v1pb.Visibility_PUBLIC:
  122. return store.Public
  123. default:
  124. return store.Private
  125. }
  126. }