tangled
alpha
login
or
join now
back
round
3
view raw
appview: state: dedup profile pages
#504
merged
opened by
ptr.pet
4 months ago
targeting
master
from
[deleted fork]
: followers-following-list
rename existing ProfilePage to ProfileHomePage
Signed-off-by: dusk
y.bera003.06@protonmail.com
options
unified
split
Changed files
+94
-98
appview
pages
pages.go
state
profile.go
+2
-2
appview/pages/pages.go
···
407
407
return p.execute("repo/fork", w, params)
408
408
}
409
409
410
410
-
type ProfilePageParams struct {
410
410
+
type ProfileHomePageParams struct {
411
411
LoggedInUser *oauth.User
412
412
Repos []db.Repo
413
413
CollaboratingRepos []db.Repo
···
426
426
Profile *db.Profile
427
427
}
428
428
429
429
-
func (p *Pages) ProfilePage(w io.Writer, params ProfilePageParams) error {
429
429
+
func (p *Pages) ProfileHomePage(w io.Writer, params ProfileHomePageParams) error {
430
430
return p.execute("user/profile", w, params)
431
431
}
432
432
+92
-96
appview/state/profile.go
···
25
25
tabVal := r.URL.Query().Get("tab")
26
26
switch tabVal {
27
27
case "":
28
28
-
s.profilePage(w, r)
28
28
+
s.profileHomePage(w, r)
29
29
case "repos":
30
30
s.reposPage(w, r)
31
31
case "followers":
···
35
35
}
36
36
}
37
37
38
38
-
func (s *State) profilePage(w http.ResponseWriter, r *http.Request) {
38
38
+
type ProfilePageParams struct {
39
39
+
Id identity.Identity
40
40
+
LoggedInUser *oauth.User
41
41
+
Card pages.ProfileCard
42
42
+
}
43
43
+
44
44
+
func (s *State) profilePage(w http.ResponseWriter, r *http.Request) *ProfilePageParams {
39
45
didOrHandle := chi.URLParam(r, "user")
40
46
if didOrHandle == "" {
41
41
-
http.Error(w, "Bad request", http.StatusBadRequest)
42
42
-
return
47
47
+
http.Error(w, "bad request", http.StatusBadRequest)
48
48
+
return nil
43
49
}
44
50
45
51
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
46
52
if !ok {
47
47
-
s.pages.Error404(w)
48
48
-
return
53
53
+
log.Printf("malformed middleware")
54
54
+
w.WriteHeader(http.StatusInternalServerError)
55
55
+
return nil
56
56
+
}
57
57
+
did := ident.DID.String()
58
58
+
59
59
+
profile, err := db.GetProfile(s.db, did)
60
60
+
if err != nil {
61
61
+
log.Printf("getting profile data for %s: %s", did, err)
49
62
}
50
63
51
51
-
profile, err := db.GetProfile(s.db, ident.DID.String())
64
64
+
followersCount, followingCount, err := db.GetFollowerFollowingCount(s.db, did)
52
65
if err != nil {
53
53
-
log.Printf("getting profile data for %s: %s", ident.DID.String(), err)
66
66
+
log.Printf("getting follow stats for %s: %s", did, err)
54
67
}
55
68
69
69
+
loggedInUser := s.oauth.GetUser(r)
70
70
+
followStatus := db.IsNotFollowing
71
71
+
if loggedInUser != nil {
72
72
+
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, did)
73
73
+
}
74
74
+
75
75
+
return &ProfilePageParams{
76
76
+
Id: ident,
77
77
+
LoggedInUser: loggedInUser,
78
78
+
Card: pages.ProfileCard{
79
79
+
UserDid: did,
80
80
+
UserHandle: ident.Handle.String(),
81
81
+
Profile: profile,
82
82
+
FollowStatus: followStatus,
83
83
+
FollowersCount: followersCount,
84
84
+
FollowingCount: followingCount,
85
85
+
},
86
86
+
}
87
87
+
}
88
88
+
89
89
+
func (s *State) profileHomePage(w http.ResponseWriter, r *http.Request) {
90
90
+
pageWithProfile := s.profilePage(w, r)
91
91
+
if pageWithProfile == nil {
92
92
+
return
93
93
+
}
94
94
+
95
95
+
id := pageWithProfile.Id
56
96
repos, err := db.GetRepos(
57
97
s.db,
58
98
0,
59
59
-
db.FilterEq("did", ident.DID.String()),
99
99
+
db.FilterEq("did", id.DID),
60
100
)
61
101
if err != nil {
62
62
-
log.Printf("getting repos for %s: %s", ident.DID.String(), err)
102
102
+
log.Printf("getting repos for %s: %s", id.DID, err)
63
103
}
64
104
105
105
+
profile := pageWithProfile.Card.Profile
65
106
// filter out ones that are pinned
66
107
pinnedRepos := []db.Repo{}
67
108
for i, r := range repos {
···
76
117
}
77
118
}
78
119
79
79
-
collaboratingRepos, err := db.CollaboratingIn(s.db, ident.DID.String())
120
120
+
collaboratingRepos, err := db.CollaboratingIn(s.db, id.DID.String())
80
121
if err != nil {
81
81
-
log.Printf("getting collaborating repos for %s: %s", ident.DID.String(), err)
122
122
+
log.Printf("getting collaborating repos for %s: %s", id.DID, err)
82
123
}
83
124
84
125
pinnedCollaboratingRepos := []db.Repo{}
···
89
130
}
90
131
}
91
132
92
92
-
timeline, err := db.MakeProfileTimeline(s.db, ident.DID.String())
133
133
+
timeline, err := db.MakeProfileTimeline(s.db, id.DID.String())
93
134
if err != nil {
94
94
-
log.Printf("failed to create profile timeline for %s: %s", ident.DID.String(), err)
135
135
+
log.Printf("failed to create profile timeline for %s: %s", id.DID, err)
95
136
}
96
137
97
97
-
followers, following, err := db.GetFollowerFollowingCount(s.db, ident.DID.String())
98
98
-
if err != nil {
99
99
-
log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
138
138
+
var didsToResolve []string
139
139
+
for _, r := range collaboratingRepos {
140
140
+
didsToResolve = append(didsToResolve, r.Did)
100
141
}
101
101
-
102
102
-
loggedInUser := s.oauth.GetUser(r)
103
103
-
followStatus := db.IsNotFollowing
104
104
-
if loggedInUser != nil {
105
105
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
142
142
+
for _, byMonth := range timeline.ByMonth {
143
143
+
for _, pe := range byMonth.PullEvents.Items {
144
144
+
didsToResolve = append(didsToResolve, pe.Repo.Did)
145
145
+
}
146
146
+
for _, ie := range byMonth.IssueEvents.Items {
147
147
+
didsToResolve = append(didsToResolve, ie.Metadata.Repo.Did)
148
148
+
}
149
149
+
for _, re := range byMonth.RepoEvents {
150
150
+
didsToResolve = append(didsToResolve, re.Repo.Did)
151
151
+
if re.Source != nil {
152
152
+
didsToResolve = append(didsToResolve, re.Source.Did)
153
153
+
}
154
154
+
}
106
155
}
107
156
108
157
now := time.Now()
109
158
startOfYear := time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.UTC)
110
159
punchcard, err := db.MakePunchcard(
111
160
s.db,
112
112
-
db.FilterEq("did", ident.DID.String()),
161
161
+
db.FilterEq("did", id.DID),
113
162
db.FilterGte("date", startOfYear.Format(time.DateOnly)),
114
163
db.FilterLte("date", now.Format(time.DateOnly)),
115
164
)
116
165
if err != nil {
117
117
-
log.Println("failed to get punchcard for did", "did", ident.DID.String(), "err", err)
166
166
+
log.Println("failed to get punchcard for did", "did", id.DID, "err", err)
118
167
}
119
168
120
120
-
s.pages.ProfilePage(w, pages.ProfilePageParams{
121
121
-
LoggedInUser: loggedInUser,
169
169
+
s.pages.ProfileHomePage(w, pages.ProfileHomePageParams{
170
170
+
LoggedInUser: pageWithProfile.LoggedInUser,
122
171
Repos: pinnedRepos,
123
172
CollaboratingRepos: pinnedCollaboratingRepos,
124
124
-
Card: pages.ProfileCard{
125
125
-
UserDid: ident.DID.String(),
126
126
-
UserHandle: ident.Handle.String(),
127
127
-
Profile: profile,
128
128
-
FollowStatus: followStatus,
129
129
-
FollowersCount: followers,
130
130
-
FollowingCount: following,
131
131
-
},
132
132
-
Punchcard: punchcard,
133
133
-
ProfileTimeline: timeline,
173
173
+
Card: pageWithProfile.Card,
174
174
+
Punchcard: punchcard,
175
175
+
ProfileTimeline: timeline,
134
176
})
135
177
}
136
178
137
179
func (s *State) reposPage(w http.ResponseWriter, r *http.Request) {
138
138
-
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
139
139
-
if !ok {
140
140
-
s.pages.Error404(w)
180
180
+
pageWithProfile := s.profilePage(w, r)
181
181
+
if pageWithProfile == nil {
141
182
return
142
183
}
143
184
144
144
-
profile, err := db.GetProfile(s.db, ident.DID.String())
145
145
-
if err != nil {
146
146
-
log.Printf("getting profile data for %s: %s", ident.DID.String(), err)
147
147
-
}
148
148
-
185
185
+
id := pageWithProfile.Id
149
186
repos, err := db.GetRepos(
150
187
s.db,
151
188
0,
152
152
-
db.FilterEq("did", ident.DID.String()),
189
189
+
db.FilterEq("did", id.DID),
153
190
)
154
191
if err != nil {
155
155
-
log.Printf("getting repos for %s: %s", ident.DID.String(), err)
156
156
-
}
157
157
-
158
158
-
loggedInUser := s.oauth.GetUser(r)
159
159
-
followStatus := db.IsNotFollowing
160
160
-
if loggedInUser != nil {
161
161
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
162
162
-
}
163
163
-
164
164
-
followers, following, err := db.GetFollowerFollowingCount(s.db, ident.DID.String())
165
165
-
if err != nil {
166
166
-
log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
192
192
+
log.Printf("getting repos for %s: %s", id.DID, err)
167
193
}
168
194
169
195
s.pages.ReposPage(w, pages.ReposPageParams{
170
170
-
LoggedInUser: loggedInUser,
196
196
+
LoggedInUser: pageWithProfile.LoggedInUser,
171
197
Repos: repos,
172
172
-
Card: pages.ProfileCard{
173
173
-
UserDid: ident.DID.String(),
174
174
-
UserHandle: ident.Handle.String(),
175
175
-
Profile: profile,
176
176
-
FollowStatus: followStatus,
177
177
-
FollowersCount: followers,
178
178
-
FollowingCount: following,
179
179
-
},
198
198
+
Card: pageWithProfile.Card,
180
199
})
181
200
}
182
201
···
187
206
}
188
207
189
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 {
190
190
-
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
191
191
-
if !ok {
192
192
-
s.pages.Error404(w)
209
209
+
pageWithProfile := s.profilePage(w, r)
210
210
+
if pageWithProfile == nil {
193
211
return nil
194
212
}
195
195
-
did := ident.DID.String()
196
213
197
197
-
profile, err := db.GetProfile(s.db, did)
198
198
-
if err != nil {
199
199
-
log.Printf("getting profile data for %s: %s", did, err)
200
200
-
}
214
214
+
id := pageWithProfile.Id
201
215
202
202
-
loggedInUser := s.oauth.GetUser(r)
203
203
-
204
204
-
follows, err := fetchFollows(s.db, did)
216
216
+
follows, err := fetchFollows(s.db, id.DID.String())
205
217
if err != nil {
206
206
-
log.Printf("getting followers for %s: %s", did, err)
218
218
+
log.Printf("getting followers for %s: %s", id.DID, err)
207
219
}
208
220
209
221
if len(follows) == 0 {
···
221
233
return nil
222
234
}
223
235
236
236
+
loggedInUser := pageWithProfile.LoggedInUser
224
237
var loggedInUserFollowing map[string]struct{}
225
238
if loggedInUser != nil {
226
239
following, err := db.GetFollowing(s.db, loggedInUser.Did)
···
265
278
})
266
279
}
267
280
268
268
-
followStatus := db.IsNotFollowing
269
269
-
if loggedInUser != nil {
270
270
-
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, did)
271
271
-
}
272
272
-
273
273
-
followersCount, followingCount, err := db.GetFollowerFollowingCount(s.db, did)
274
274
-
if err != nil {
275
275
-
log.Printf("getting follow stats followers for %s: %s", did, err)
276
276
-
}
277
277
-
278
281
return &FollowsPageParams{
279
282
LoggedInUser: loggedInUser,
280
283
Follows: followCards,
281
281
-
Card: pages.ProfileCard{
282
282
-
UserDid: did,
283
283
-
UserHandle: ident.Handle.String(),
284
284
-
Profile: profile,
285
285
-
FollowStatus: followStatus,
286
286
-
FollowersCount: followersCount,
287
287
-
FollowingCount: followingCount,
288
288
-
},
284
284
+
Card: pageWithProfile.Card,
289
285
}
290
286
}
291
287