···
tabVal := r.URL.Query().Get("tab")
28
+
s.profileHomePage(w, r)
···
38
-
func (s *State) profilePage(w http.ResponseWriter, r *http.Request) {
38
+
type ProfilePageParams struct {
39
+
Id identity.Identity
40
+
LoggedInUser *oauth.User
41
+
Card pages.ProfileCard
44
+
func (s *State) profilePage(w http.ResponseWriter, r *http.Request) *ProfilePageParams {
didOrHandle := chi.URLParam(r, "user")
41
-
http.Error(w, "Bad request", http.StatusBadRequest)
47
+
http.Error(w, "bad request", http.StatusBadRequest)
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
53
+
log.Printf("malformed middleware")
54
+
w.WriteHeader(http.StatusInternalServerError)
57
+
did := ident.DID.String()
59
+
profile, err := db.GetProfile(s.db, did)
61
+
log.Printf("getting profile data for %s: %s", did, err)
51
-
profile, err := db.GetProfile(s.db, ident.DID.String())
64
+
followStats, err := db.GetFollowerFollowingCount(s.db, did)
53
-
log.Printf("getting profile data for %s: %s", ident.DID.String(), err)
66
+
log.Printf("getting follow stats for %s: %s", did, err)
69
+
loggedInUser := s.oauth.GetUser(r)
70
+
followStatus := db.IsNotFollowing
71
+
if loggedInUser != nil {
72
+
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, did)
75
+
return &ProfilePageParams{
77
+
LoggedInUser: loggedInUser,
78
+
Card: pages.ProfileCard{
80
+
UserHandle: ident.Handle.String(),
82
+
FollowStatus: followStatus,
83
+
FollowersCount: followStats.Followers,
84
+
FollowingCount: followStats.Following,
89
+
func (s *State) profileHomePage(w http.ResponseWriter, r *http.Request) {
90
+
pageWithProfile := s.profilePage(w, r)
91
+
if pageWithProfile == nil {
95
+
id := pageWithProfile.Id
repos, err := db.GetRepos(
59
-
db.FilterEq("did", ident.DID.String()),
99
+
db.FilterEq("did", id.DID),
62
-
log.Printf("getting repos for %s: %s", ident.DID.String(), err)
102
+
log.Printf("getting repos for %s: %s", id.DID, err)
105
+
profile := pageWithProfile.Card.Profile
// filter out ones that are pinned
pinnedRepos := []db.Repo{}
for i, r := range repos {
···
79
-
collaboratingRepos, err := db.CollaboratingIn(s.db, ident.DID.String())
120
+
collaboratingRepos, err := db.CollaboratingIn(s.db, id.DID.String())
81
-
log.Printf("getting collaborating repos for %s: %s", ident.DID.String(), err)
122
+
log.Printf("getting collaborating repos for %s: %s", id.DID, err)
pinnedCollaboratingRepos := []db.Repo{}
···
92
-
timeline, err := db.MakeProfileTimeline(s.db, ident.DID.String())
133
+
timeline, err := db.MakeProfileTimeline(s.db, id.DID.String())
94
-
log.Printf("failed to create profile timeline for %s: %s", ident.DID.String(), err)
135
+
log.Printf("failed to create profile timeline for %s: %s", id.DID, err)
97
-
followers, following, err := db.GetFollowerFollowingCount(s.db, ident.DID.String())
99
-
log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
138
+
var didsToResolve []string
139
+
for _, r := range collaboratingRepos {
140
+
didsToResolve = append(didsToResolve, r.Did)
102
-
loggedInUser := s.oauth.GetUser(r)
103
-
followStatus := db.IsNotFollowing
104
-
if loggedInUser != nil {
105
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
142
+
for _, byMonth := range timeline.ByMonth {
143
+
for _, pe := range byMonth.PullEvents.Items {
144
+
didsToResolve = append(didsToResolve, pe.Repo.Did)
146
+
for _, ie := range byMonth.IssueEvents.Items {
147
+
didsToResolve = append(didsToResolve, ie.Metadata.Repo.Did)
149
+
for _, re := range byMonth.RepoEvents {
150
+
didsToResolve = append(didsToResolve, re.Repo.Did)
151
+
if re.Source != nil {
152
+
didsToResolve = append(didsToResolve, re.Source.Did)
startOfYear := time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.UTC)
punchcard, err := db.MakePunchcard(
112
-
db.FilterEq("did", ident.DID.String()),
161
+
db.FilterEq("did", id.DID),
db.FilterGte("date", startOfYear.Format(time.DateOnly)),
db.FilterLte("date", now.Format(time.DateOnly)),
117
-
log.Println("failed to get punchcard for did", "did", ident.DID.String(), "err", err)
166
+
log.Println("failed to get punchcard for did", "did", id.DID, "err", err)
120
-
s.pages.ProfilePage(w, pages.ProfilePageParams{
121
-
LoggedInUser: loggedInUser,
169
+
s.pages.ProfileHomePage(w, pages.ProfileHomePageParams{
170
+
LoggedInUser: pageWithProfile.LoggedInUser,
CollaboratingRepos: pinnedCollaboratingRepos,
124
-
Card: pages.ProfileCard{
125
-
UserDid: ident.DID.String(),
126
-
UserHandle: ident.Handle.String(),
128
-
FollowStatus: followStatus,
129
-
FollowersCount: followers,
130
-
FollowingCount: following,
132
-
Punchcard: punchcard,
133
-
ProfileTimeline: timeline,
173
+
Card: pageWithProfile.Card,
174
+
Punchcard: punchcard,
175
+
ProfileTimeline: timeline,
func (s *State) reposPage(w http.ResponseWriter, r *http.Request) {
138
-
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
140
-
s.pages.Error404(w)
180
+
pageWithProfile := s.profilePage(w, r)
181
+
if pageWithProfile == nil {
144
-
profile, err := db.GetProfile(s.db, ident.DID.String())
146
-
log.Printf("getting profile data for %s: %s", ident.DID.String(), err)
185
+
id := pageWithProfile.Id
repos, err := db.GetRepos(
152
-
db.FilterEq("did", ident.DID.String()),
189
+
db.FilterEq("did", id.DID),
155
-
log.Printf("getting repos for %s: %s", ident.DID.String(), err)
158
-
loggedInUser := s.oauth.GetUser(r)
159
-
followStatus := db.IsNotFollowing
160
-
if loggedInUser != nil {
161
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
164
-
followers, following, err := db.GetFollowerFollowingCount(s.db, ident.DID.String())
166
-
log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
192
+
log.Printf("getting repos for %s: %s", id.DID, err)
s.pages.ReposPage(w, pages.ReposPageParams{
170
-
LoggedInUser: loggedInUser,
196
+
LoggedInUser: pageWithProfile.LoggedInUser,
172
-
Card: pages.ProfileCard{
173
-
UserDid: ident.DID.String(),
174
-
UserHandle: ident.Handle.String(),
176
-
FollowStatus: followStatus,
177
-
FollowersCount: followers,
178
-
FollowingCount: following,
198
+
Card: pageWithProfile.Card,
···
189
-
func (s *State) followPage(w http.ResponseWriter, r *http.Request, fetchFollows func(db.Execer, string) ([]db.Follow, error), extractDid func(db.Follow) string) *FollowsPageParams {
190
-
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
192
-
s.pages.Error404(w)
195
-
did := ident.DID.String()
197
-
profile, err := db.GetProfile(s.db, did)
199
-
log.Printf("getting profile data for %s: %s", did, err)
208
+
func (s *State) followPage(w http.ResponseWriter, r *http.Request, fetchFollows func(db.Execer, string) ([]db.Follow, error), extractDid func(db.Follow) string) (FollowsPageParams, error) {
209
+
pageWithProfile := s.profilePage(w, r)
210
+
if pageWithProfile == nil {
211
+
return FollowsPageParams{}, nil
202
-
loggedInUser := s.oauth.GetUser(r)
214
+
id := pageWithProfile.Id
215
+
loggedInUser := pageWithProfile.LoggedInUser
204
-
follows, err := fetchFollows(s.db, did)
217
+
follows, err := fetchFollows(s.db, id.DID.String())
206
-
log.Printf("getting followers for %s: %s", did, err)
219
+
log.Printf("getting followers for %s: %s", id.DID, err)
220
+
return FollowsPageParams{}, err
224
+
return FollowsPageParams{
225
+
LoggedInUser: loggedInUser,
226
+
Follows: []pages.FollowCard{},
227
+
Card: pageWithProfile.Card,
followDids := make([]string, 0, len(follows))
···
profiles, err := db.GetProfiles(s.db, db.FilterIn("did", followDids))
log.Printf("getting profile for %s: %s", followDids, err)
239
+
return FollowsPageParams{}, err
242
+
followStatsMap, err := db.GetFollowerFollowingCounts(s.db, followDids)
244
+
log.Printf("getting follow counts for %s: %s", followDids, err)
245
+
return FollowsPageParams{}, err
var loggedInUserFollowing map[string]struct{}
following, err := db.GetFollowing(s.db, loggedInUser.Did)
252
+
return FollowsPageParams{}, err
loggedInUserFollowing = make(map[string]struct{}, len(following))
···
followCards := make([]pages.FollowCard, 0, len(follows))
for _, did := range followDids {
240
-
followersCount, followingCount, err := db.GetFollowerFollowingCount(s.db, did)
242
-
log.Printf("getting follow stats for %s: %s", did, err)
264
+
followStats, exists := followStatsMap[did]
266
+
followStats = db.FollowStats{}
followStatus := db.IsNotFollowing
if loggedInUserFollowing != nil {
···
followCards = append(followCards, pages.FollowCard{
FollowStatus: followStatus,
262
-
FollowersCount: followersCount,
263
-
FollowingCount: followingCount,
286
+
FollowersCount: followStats.Followers,
287
+
FollowingCount: followStats.Following,
268
-
followStatus := db.IsNotFollowing
269
-
if loggedInUser != nil {
270
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, did)
273
-
followersCount, followingCount, err := db.GetFollowerFollowingCount(s.db, did)
275
-
log.Printf("getting follow stats followers for %s: %s", did, err)
278
-
return &FollowsPageParams{
292
+
return FollowsPageParams{
LoggedInUser: loggedInUser,
281
-
Card: pages.ProfileCard{
283
-
UserHandle: ident.Handle.String(),
285
-
FollowStatus: followStatus,
286
-
FollowersCount: followersCount,
287
-
FollowingCount: followingCount,
295
+
Card: pageWithProfile.Card,
func (s *State) followersPage(w http.ResponseWriter, r *http.Request) {
293
-
followPage := s.followPage(w, r, db.GetFollowers, func(f db.Follow) string { return f.UserDid })
300
+
followPage, err := s.followPage(w, r, db.GetFollowers, func(f db.Follow) string { return f.UserDid })
302
+
s.pages.Notice(w, "all-followers", "Failed to load followers")
s.pages.FollowersPage(w, pages.FollowersPageParams{
LoggedInUser: followPage.LoggedInUser,
···
func (s *State) followingPage(w http.ResponseWriter, r *http.Request) {
303
-
followPage := s.followPage(w, r, db.GetFollowing, func(f db.Follow) string { return f.SubjectDid })
314
+
followPage, err := s.followPage(w, r, db.GetFollowing, func(f db.Follow) string { return f.SubjectDid })
316
+
s.pages.Notice(w, "all-following", "Failed to load following")
s.pages.FollowingPage(w, pages.FollowingPageParams{
LoggedInUser: followPage.LoggedInUser,