memos/server/router/api/v1/memo_relation_service.go

115 lines
3.5 KiB
Go
Raw Normal View History

2024-04-28 00:44:29 +08:00
package v1
import (
"context"
2024-03-19 21:53:44 +08:00
"fmt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
2024-04-27 22:02:15 +08:00
"google.golang.org/protobuf/types/known/emptypb"
2024-04-28 00:44:29 +08:00
v1pb "github.com/usememos/memos/proto/gen/api/v1"
"github.com/usememos/memos/store"
)
2024-04-28 00:44:29 +08:00
func (s *APIV1Service) SetMemoRelations(ctx context.Context, request *v1pb.SetMemoRelationsRequest) (*emptypb.Empty, error) {
2024-03-18 23:23:53 +08:00
id, err := ExtractMemoIDFromName(request.Name)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
}
referenceType := store.MemoRelationReference
// Delete all reference relations first.
if err := s.Store.DeleteMemoRelation(ctx, &store.DeleteMemoRelation{
2024-03-18 23:23:53 +08:00
MemoID: &id,
Type: &referenceType,
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete memo relation")
}
for _, relation := range request.Relations {
// Ignore reflexive relations.
2024-03-19 21:53:44 +08:00
if request.Name == relation.RelatedMemo {
continue
}
// Ignore comment relations as there's no need to update a comment's relation.
// Inserting/Deleting a comment is handled elsewhere.
2024-04-28 00:44:29 +08:00
if relation.Type == v1pb.MemoRelation_COMMENT {
continue
}
2024-03-19 21:53:44 +08:00
relatedMemoID, err := ExtractMemoIDFromName(relation.RelatedMemo)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid related memo name: %v", err)
}
if _, err := s.Store.UpsertMemoRelation(ctx, &store.MemoRelation{
2024-03-18 23:23:53 +08:00
MemoID: id,
2024-03-19 21:53:44 +08:00
RelatedMemoID: relatedMemoID,
Type: convertMemoRelationTypeToStore(relation.Type),
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to upsert memo relation")
}
}
2024-04-27 22:02:15 +08:00
return &emptypb.Empty{}, nil
}
2024-04-28 00:44:29 +08:00
func (s *APIV1Service) ListMemoRelations(ctx context.Context, request *v1pb.ListMemoRelationsRequest) (*v1pb.ListMemoRelationsResponse, error) {
2024-03-18 23:23:53 +08:00
id, err := ExtractMemoIDFromName(request.Name)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
}
2024-04-28 00:44:29 +08:00
relationList := []*v1pb.MemoRelation{}
tempList, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
2024-03-18 23:23:53 +08:00
MemoID: &id,
})
if err != nil {
return nil, err
}
for _, relation := range tempList {
relationList = append(relationList, convertMemoRelationFromStore(relation))
}
tempList, err = s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
2024-03-18 23:23:53 +08:00
RelatedMemoID: &id,
})
if err != nil {
return nil, err
}
for _, relation := range tempList {
relationList = append(relationList, convertMemoRelationFromStore(relation))
}
2024-04-28 00:44:29 +08:00
response := &v1pb.ListMemoRelationsResponse{
Relations: relationList,
}
return response, nil
}
2024-04-28 00:44:29 +08:00
func convertMemoRelationFromStore(memoRelation *store.MemoRelation) *v1pb.MemoRelation {
return &v1pb.MemoRelation{
2024-03-19 21:53:44 +08:00
Memo: fmt.Sprintf("%s%d", MemoNamePrefix, memoRelation.MemoID),
RelatedMemo: fmt.Sprintf("%s%d", MemoNamePrefix, memoRelation.RelatedMemoID),
Type: convertMemoRelationTypeFromStore(memoRelation.Type),
}
}
2024-04-28 00:44:29 +08:00
func convertMemoRelationTypeFromStore(relationType store.MemoRelationType) v1pb.MemoRelation_Type {
switch relationType {
case store.MemoRelationReference:
2024-04-28 00:44:29 +08:00
return v1pb.MemoRelation_REFERENCE
case store.MemoRelationComment:
2024-04-28 00:44:29 +08:00
return v1pb.MemoRelation_COMMENT
default:
2024-04-28 00:44:29 +08:00
return v1pb.MemoRelation_TYPE_UNSPECIFIED
}
}
2024-04-28 00:44:29 +08:00
func convertMemoRelationTypeToStore(relationType v1pb.MemoRelation_Type) store.MemoRelationType {
switch relationType {
2024-04-28 00:44:29 +08:00
case v1pb.MemoRelation_REFERENCE:
return store.MemoRelationReference
2024-04-28 00:44:29 +08:00
case v1pb.MemoRelation_COMMENT:
return store.MemoRelationComment
default:
return store.MemoRelationReference
}
}