this repo has no description
1package server
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "github.com/labstack/echo/v4"
9 vyletdatabase "github.com/vylet-app/go/database/proto"
10 "github.com/vylet-app/go/generated/handlers"
11 "github.com/vylet-app/go/generated/vylet"
12 "github.com/vylet-app/go/internal/helpers"
13)
14
15func (s *Server) getLikesBySubject(ctx context.Context, subjectUri string, limit int64, cursor *string) ([]*vylet.FeedGetSubjectLikes_Like, *string, error) {
16 logger := s.logger.With("name", "getLikesBySubject", "uri", subjectUri)
17
18 resp, err := s.client.Like.GetLikesBySubject(ctx, &vyletdatabase.GetLikesBySubjectRequest{
19 SubjectUri: subjectUri,
20 Limit: limit,
21 Cursor: cursor,
22 })
23 if err != nil {
24 return nil, nil, fmt.Errorf("failed to get likes by subject: %w", err)
25 }
26
27 dids := make([]string, 0, len(resp.Likes))
28 for _, like := range resp.Likes {
29 dids = append(dids, like.AuthorDid)
30 }
31
32 profiles, err := s.getProfiles(ctx, dids)
33 if err != nil {
34 return nil, nil, fmt.Errorf("failed to get profiles for subject: %w", err)
35 }
36
37 likes := make([]*vylet.FeedGetSubjectLikes_Like, 0, len(resp.Likes))
38 for _, like := range resp.Likes {
39 profile, ok := profiles[like.AuthorDid]
40 if !ok {
41 logger.Warn("failed to find profile for like", "did", like.AuthorDid, "uri", like.Uri)
42 continue
43 }
44
45 likes = append(likes, &vylet.FeedGetSubjectLikes_Like{
46 Actor: profile,
47 CreatedAt: like.CreatedAt.AsTime().Format(time.RFC3339Nano),
48 IndexedAt: like.IndexedAt.AsTime().Format(time.RFC3339Nano),
49 })
50 }
51
52 return likes, resp.Cursor, nil
53}
54
55func (s *Server) FeedGetSubjectLikesRequiresAuth() bool {
56 return false
57}
58
59func (s *Server) HandleFeedGetSubjectLikes(e echo.Context, input *handlers.FeedGetSubjectLikesInput) (*vylet.FeedGetSubjectLikes_Output, *echo.HTTPError) {
60 ctx := e.Request().Context()
61
62 logger := s.logger.With("name", "HandleFeedGetSubjectLikes")
63
64 if input.Uri == "" {
65 return nil, NewValidationError("uri", "URI must be provided")
66 }
67
68 if input.Limit != nil && (*input.Limit < 1 || *input.Limit > 100) {
69 return nil, NewValidationError("limit", "limit must be between 1 and 100")
70 } else if input.Limit == nil {
71 input.Limit = helpers.ToInt64Ptr(25)
72 }
73
74 logger = logger.With("uri", input.Uri)
75
76 likes, cursor, err := s.getLikesBySubject(ctx, input.Uri, *input.Limit, input.Cursor)
77 if err != nil {
78 logger.Error("failed to get subject likes", "err", err)
79 return nil, ErrInternalServerErr
80 }
81
82 return &vylet.FeedGetSubjectLikes_Output{
83 Likes: likes,
84 Cursor: cursor,
85 }, nil
86}