this repo has no description
at main 86 lines 2.5 kB view raw
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}