forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package state
2
3import (
4 "fmt"
5 "log"
6 "net/http"
7
8 "github.com/go-chi/chi/v5"
9 "tangled.sh/tangled.sh/core/appview/db"
10 "tangled.sh/tangled.sh/core/appview/pages"
11)
12
13func (s *State) ProfilePage(w http.ResponseWriter, r *http.Request) {
14 didOrHandle := chi.URLParam(r, "user")
15 if didOrHandle == "" {
16 http.Error(w, "Bad request", http.StatusBadRequest)
17 return
18 }
19
20 ident, err := s.resolver.ResolveIdent(r.Context(), didOrHandle)
21 if err != nil {
22 log.Printf("resolving identity: %s", err)
23 w.WriteHeader(http.StatusNotFound)
24 return
25 }
26
27 repos, err := db.GetAllReposByDid(s.db, ident.DID.String())
28 if err != nil {
29 log.Printf("getting repos for %s: %s", ident.DID.String(), err)
30 }
31
32 collaboratingRepos, err := db.CollaboratingIn(s.db, ident.DID.String())
33 if err != nil {
34 log.Printf("getting collaborating repos for %s: %s", ident.DID.String(), err)
35 }
36
37 timeline, err := db.MakeProfileTimeline(s.db, ident.DID.String())
38 if err != nil {
39 log.Printf("failed to create profile timeline for %s: %s", ident.DID.String(), err)
40 }
41
42 var didsToResolve []string
43 for _, r := range collaboratingRepos {
44 didsToResolve = append(didsToResolve, r.Did)
45 }
46 for _, evt := range timeline {
47 if evt.Repo != nil {
48 if evt.Repo.Source != "" {
49 didsToResolve = append(didsToResolve, evt.Source.Did)
50 }
51 }
52 didsToResolve = append(didsToResolve, evt.Repo.Did)
53 }
54
55 resolvedIds := s.resolver.ResolveIdents(r.Context(), didsToResolve)
56 didHandleMap := make(map[string]string)
57 for _, identity := range resolvedIds {
58 if !identity.Handle.IsInvalidHandle() {
59 didHandleMap[identity.DID.String()] = fmt.Sprintf("@%s", identity.Handle.String())
60 } else {
61 didHandleMap[identity.DID.String()] = identity.DID.String()
62 }
63 }
64
65 followers, following, err := db.GetFollowerFollowing(s.db, ident.DID.String())
66 if err != nil {
67 log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
68 }
69
70 loggedInUser := s.auth.GetUser(r)
71 followStatus := db.IsNotFollowing
72 if loggedInUser != nil {
73 followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
74 }
75
76 profileAvatarUri, err := GetAvatarUri(ident.Handle.String())
77 if err != nil {
78 log.Println("failed to fetch bsky avatar", err)
79 }
80
81 s.pages.ProfilePage(w, pages.ProfilePageParams{
82 LoggedInUser: loggedInUser,
83 UserDid: ident.DID.String(),
84 UserHandle: ident.Handle.String(),
85 Repos: repos,
86 CollaboratingRepos: collaboratingRepos,
87 ProfileStats: pages.ProfileStats{
88 Followers: followers,
89 Following: following,
90 },
91 FollowStatus: db.FollowStatus(followStatus),
92 DidHandleMap: didHandleMap,
93 AvatarUri: profileAvatarUri,
94 ProfileTimeline: timeline,
95 })
96}