Monorepo for Tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview/state: paginate starred repos page in user profiles

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by tangled.org d404bb76 c6b95ed9

+30 -8
+6 -5
appview/db/star.go
··· 11 11 12 12 "github.com/bluesky-social/indigo/atproto/syntax" 13 13 "tangled.org/core/appview/models" 14 + "tangled.org/core/appview/pagination" 14 15 "tangled.org/core/orm" 15 16 ) 16 17 ··· 165 166 166 167 // GetRepoStars return a list of stars each holding target repository. 167 168 // If there isn't known repo with starred at-uri, those stars will be ignored. 168 - func GetRepoStars(e Execer, limit int, filters ...orm.Filter) ([]models.RepoStar, error) { 169 + func GetRepoStars(e Execer, page pagination.Page, filters ...orm.Filter) ([]models.RepoStar, error) { 169 170 var conditions []string 170 171 var args []any 171 172 for _, filter := range filters { ··· 178 179 whereClause = " where " + strings.Join(conditions, " and ") 179 180 } 180 181 181 - limitClause := "" 182 - if limit != 0 { 183 - limitClause = fmt.Sprintf(" limit %d", limit) 182 + pageClause := "" 183 + if page.Limit != 0 { 184 + pageClause = fmt.Sprintf(" limit %d offset %d", page.Limit, page.Offset) 184 185 } 185 186 186 187 repoQuery := fmt.Sprintf( ··· 190 191 order by created desc 191 192 %s`, 192 193 whereClause, 193 - limitClause, 194 + pageClause, 194 195 ) 195 196 rows, err := e.Query(repoQuery, args...) 196 197 if err != nil {
+1 -1
appview/db/timeline.go
··· 151 151 filters = append(filters, orm.FilterIn("did", userIsFollowing)) 152 152 } 153 153 154 - stars, err := GetRepoStars(e, limit, filters...) 154 + stars, err := GetRepoStars(e, pagination.Page{Limit: limit}, filters...) 155 155 if err != nil { 156 156 return nil, err 157 157 }
+2
appview/pages/pages.go
··· 665 665 LoggedInUser *oauth.MultiAccountUser 666 666 Repos []models.Repo 667 667 Card *ProfileCard 668 + Page pagination.Page 669 + Total int 668 670 Active string 669 671 } 670 672
+9
appview/pages/templates/user/starred.html
··· 3 3 {{ define "profileContent" }} 4 4 <div id="all-repos" class="md:col-span-8 order-2 md:order-2"> 5 5 {{ block "starredRepos" . }}{{ end }} 6 + {{ if gt .Total .Page.Limit }} 7 + {{ $handle := resolve .Card.UserDid }} 8 + {{ template "fragments/pagination" (dict 9 + "Page" .Page 10 + "TotalCount" .Total 11 + "BasePath" (printf "/%s" $handle) 12 + "QueryParams" (queryParams "tab" "starred") 13 + ) }} 14 + {{ end }} 6 15 </div> 7 16 {{ end }} 8 17
+12 -2
appview/state/profile.go
··· 37 37 case "following": 38 38 s.followingPage(w, r) 39 39 case "starred": 40 - s.starredPage(w, r) 40 + middleware. 41 + Paginate(http.HandlerFunc(s.starredPage)). 42 + ServeHTTP(w, r) 41 43 case "strings": 42 44 s.stringsPage(w, r) 43 45 default: ··· 320 322 func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { 321 323 l := s.logger.With("handler", "starredPage") 322 324 325 + page := pagination.FromContext(r.Context()) 326 + l = l.With("page", page) 327 + 323 328 profile, err := s.profile(r) 324 329 if err != nil { 325 330 l.Error("failed to build profile card", "err", err) ··· 328 333 } 329 334 l = l.With("profileDid", profile.UserDid) 330 335 331 - stars, err := db.GetRepoStars(s.db, 0, orm.FilterEq("did", profile.UserDid)) 336 + stars, err := db.GetRepoStars(s.db, page, orm.FilterEq("did", profile.UserDid)) 332 337 if err != nil { 333 338 l.Error("failed to get stars", "err", err) 334 339 s.pages.Error500(w) ··· 342 347 err = s.pages.ProfileStarred(w, pages.ProfileStarredParams{ 343 348 LoggedInUser: s.oauth.GetMultiAccountUser(r), 344 349 Repos: repos, 350 + Total: int(profile.Stats.StarredCount), 345 351 Card: profile, 352 + Page: page, 346 353 }) 354 + if err != nil { 355 + l.Error("failed to render", "err", err) 356 + } 347 357 } 348 358 349 359 func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) {