mirror of https://github.com/usememos/memos
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
package v1
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"google.golang.org/grpc/codes"
 | 
						|
	"google.golang.org/grpc/status"
 | 
						|
	"google.golang.org/protobuf/types/known/emptypb"
 | 
						|
	"google.golang.org/protobuf/types/known/timestamppb"
 | 
						|
 | 
						|
	v1pb "github.com/usememos/memos/proto/gen/api/v1"
 | 
						|
	"github.com/usememos/memos/store"
 | 
						|
)
 | 
						|
 | 
						|
func (s *APIV1Service) ListMemoReactions(ctx context.Context, request *v1pb.ListMemoReactionsRequest) (*v1pb.ListMemoReactionsResponse, error) {
 | 
						|
	reactions, err := s.Store.ListReactions(ctx, &store.FindReaction{
 | 
						|
		ContentID: &request.Name,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		return nil, status.Errorf(codes.Internal, "failed to list reactions")
 | 
						|
	}
 | 
						|
 | 
						|
	response := &v1pb.ListMemoReactionsResponse{
 | 
						|
		Reactions: []*v1pb.Reaction{},
 | 
						|
	}
 | 
						|
	for _, reaction := range reactions {
 | 
						|
		reactionMessage := convertReactionFromStore(reaction)
 | 
						|
		response.Reactions = append(response.Reactions, reactionMessage)
 | 
						|
	}
 | 
						|
	return response, nil
 | 
						|
}
 | 
						|
 | 
						|
func (s *APIV1Service) UpsertMemoReaction(ctx context.Context, request *v1pb.UpsertMemoReactionRequest) (*v1pb.Reaction, error) {
 | 
						|
	user, err := s.GetCurrentUser(ctx)
 | 
						|
	if err != nil {
 | 
						|
		return nil, status.Errorf(codes.Internal, "failed to get current user")
 | 
						|
	}
 | 
						|
	if user == nil {
 | 
						|
		return nil, status.Errorf(codes.Unauthenticated, "user not authenticated")
 | 
						|
	}
 | 
						|
	reaction, err := s.Store.UpsertReaction(ctx, &store.Reaction{
 | 
						|
		CreatorID:    user.ID,
 | 
						|
		ContentID:    request.Reaction.ContentId,
 | 
						|
		ReactionType: request.Reaction.ReactionType,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		return nil, status.Errorf(codes.Internal, "failed to upsert reaction")
 | 
						|
	}
 | 
						|
 | 
						|
	reactionMessage := convertReactionFromStore(reaction)
 | 
						|
 | 
						|
	return reactionMessage, nil
 | 
						|
}
 | 
						|
 | 
						|
func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error) {
 | 
						|
	reactionID, err := ExtractReactionIDFromName(request.Name)
 | 
						|
	if err != nil {
 | 
						|
		return nil, status.Errorf(codes.InvalidArgument, "invalid reaction name: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{
 | 
						|
		ID: reactionID,
 | 
						|
	}); err != nil {
 | 
						|
		return nil, status.Errorf(codes.Internal, "failed to delete reaction")
 | 
						|
	}
 | 
						|
 | 
						|
	return &emptypb.Empty{}, nil
 | 
						|
}
 | 
						|
 | 
						|
func convertReactionFromStore(reaction *store.Reaction) *v1pb.Reaction {
 | 
						|
	reactionUID := fmt.Sprintf("%d", reaction.ID)
 | 
						|
	return &v1pb.Reaction{
 | 
						|
		Name:         fmt.Sprintf("%s%s", ReactionNamePrefix, reactionUID),
 | 
						|
		Creator:      fmt.Sprintf("%s%d", UserNamePrefix, reaction.CreatorID),
 | 
						|
		ContentId:    reaction.ContentID,
 | 
						|
		ReactionType: reaction.ReactionType,
 | 
						|
		CreateTime:   timestamppb.New(time.Unix(reaction.CreatedTs, 0)),
 | 
						|
	}
 | 
						|
}
 |