this repo has no description
1package server
2
3import (
4 "errors"
5
6 "github.com/labstack/echo/v4"
7 vyletdatabase "github.com/vylet-app/go/database/proto"
8 "github.com/vylet-app/go/generated/handlers"
9 "github.com/vylet-app/go/generated/vylet"
10 "github.com/vylet-app/go/internal/helpers"
11)
12
13func (s *Server) GraphGetActorFollowersRequiresAuth() bool {
14 return false
15}
16
17func (s *Server) HandleGraphGetActorFollowers(e echo.Context, input *handlers.GraphGetActorFollowersInput) (*vylet.GraphGetActorFollowers_Output, *echo.HTTPError) {
18 ctx := e.Request().Context()
19
20 logger := s.logger.With("name", "HandleGraphGetActorFollowers")
21
22 if input.Limit != nil && (*input.Limit < 1 || *input.Limit > 100) {
23 return nil, NewValidationError("limit", "limit must be between 1 and 100")
24 } else if input.Limit == nil {
25 input.Limit = helpers.ToInt64Ptr(25)
26 }
27
28 did, _, err := s.fetchDidHandleFromActor(ctx, input.Actor)
29 if err != nil {
30 if errors.Is(err, ErrActorNotValid) {
31 return nil, NewValidationError("author", "author must be a valid DID or handle")
32 }
33 logger.Error("error did from actor", "err", err)
34 return nil, ErrInternalServerErr
35 }
36
37 resp, err := s.client.Follow.GetFollowersByActor(ctx, &vyletdatabase.GetFollowersByActorRequest{
38 Did: did,
39 Limit: *input.Limit,
40 Cursor: input.Cursor,
41 })
42 if err != nil {
43 logger.Error("error getting followers", "err", err)
44 return nil, ErrInternalServerErr
45 }
46
47 dids := make([]string, 0, len(resp.Followers))
48 for _, f := range resp.Followers {
49 dids = append(dids, f.SubjectDid)
50 }
51
52 profiles, err := s.getProfiles(ctx, dids)
53 if err != nil {
54 logger.Error("error getting profiles", "err", err)
55 return nil, ErrInternalServerErr
56 }
57
58 sortedProfiles := make([]*vylet.ActorDefs_ProfileView, 0, len(profiles))
59 for _, did := range dids {
60 profile, ok := profiles[did]
61 if !ok {
62 logger.Warn("unable to find profile", "did", did)
63 continue
64 }
65 sortedProfiles = append(sortedProfiles, profile)
66 }
67
68 return &vylet.GraphGetActorFollowers_Output{
69 Profiles: sortedProfiles,
70 Cursor: resp.Cursor,
71 }, nil
72}