diff --git a/appview/db/star.go b/appview/db/star.go index 86bc6fbe..0285c819 100644 --- a/appview/db/star.go +++ b/appview/db/star.go @@ -11,6 +11,7 @@ import ( "github.com/bluesky-social/indigo/atproto/syntax" "tangled.org/core/appview/models" + "tangled.org/core/appview/pagination" "tangled.org/core/orm" ) @@ -165,7 +166,7 @@ func GetStarStatuses(e Execer, userDid string, subjectAts []syntax.ATURI) (map[s // GetRepoStars return a list of stars each holding target repository. // If there isn't known repo with starred at-uri, those stars will be ignored. -func GetRepoStars(e Execer, limit int, filters ...orm.Filter) ([]models.RepoStar, error) { +func GetRepoStars(e Execer, page pagination.Page, filters ...orm.Filter) ([]models.RepoStar, error) { var conditions []string var args []any for _, filter := range filters { @@ -178,9 +179,9 @@ func GetRepoStars(e Execer, limit int, filters ...orm.Filter) ([]models.RepoStar whereClause = " where " + strings.Join(conditions, " and ") } - limitClause := "" - if limit != 0 { - limitClause = fmt.Sprintf(" limit %d", limit) + pageClause := "" + if page.Limit != 0 { + pageClause = fmt.Sprintf(" limit %d offset %d", page.Limit, page.Offset) } repoQuery := fmt.Sprintf( @@ -190,7 +191,7 @@ func GetRepoStars(e Execer, limit int, filters ...orm.Filter) ([]models.RepoStar order by created desc %s`, whereClause, - limitClause, + pageClause, ) rows, err := e.Query(repoQuery, args...) if err != nil { diff --git a/appview/db/timeline.go b/appview/db/timeline.go index e75c35d7..1da9ab61 100644 --- a/appview/db/timeline.go +++ b/appview/db/timeline.go @@ -151,7 +151,7 @@ func getTimelineStars(e Execer, limit int, loggedInUserDid string, userIsFollowi filters = append(filters, orm.FilterIn("did", userIsFollowing)) } - stars, err := GetRepoStars(e, limit, filters...) + stars, err := GetRepoStars(e, pagination.Page{Limit: limit}, filters...) if err != nil { return nil, err } diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 541f34ef..f862a868 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -665,6 +665,8 @@ type ProfileStarredParams struct { LoggedInUser *oauth.MultiAccountUser Repos []models.Repo Card *ProfileCard + Page pagination.Page + Total int Active string } diff --git a/appview/pages/templates/user/starred.html b/appview/pages/templates/user/starred.html index c5e178cf..0e516c66 100644 --- a/appview/pages/templates/user/starred.html +++ b/appview/pages/templates/user/starred.html @@ -3,6 +3,15 @@ {{ define "profileContent" }}
{{ block "starredRepos" . }}{{ end }} + {{ if gt .Total .Page.Limit }} + {{ $handle := resolve .Card.UserDid }} + {{ template "fragments/pagination" (dict + "Page" .Page + "TotalCount" .Total + "BasePath" (printf "/%s" $handle) + "QueryParams" (queryParams "tab" "starred") + ) }} + {{ end }}
{{ end }} diff --git a/appview/state/profile.go b/appview/state/profile.go index 4b4a88a8..12cf2ae7 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -37,7 +37,9 @@ func (s *State) Profile(w http.ResponseWriter, r *http.Request) { case "following": s.followingPage(w, r) case "starred": - s.starredPage(w, r) + middleware. + Paginate(http.HandlerFunc(s.starredPage)). + ServeHTTP(w, r) case "strings": s.stringsPage(w, r) default: @@ -320,6 +322,9 @@ func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "starredPage") + page := pagination.FromContext(r.Context()) + l = l.With("page", page) + profile, err := s.profile(r) if err != nil { l.Error("failed to build profile card", "err", err) @@ -328,7 +333,7 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { } l = l.With("profileDid", profile.UserDid) - stars, err := db.GetRepoStars(s.db, 0, orm.FilterEq("did", profile.UserDid)) + stars, err := db.GetRepoStars(s.db, page, orm.FilterEq("did", profile.UserDid)) if err != nil { l.Error("failed to get stars", "err", err) s.pages.Error500(w) @@ -342,8 +347,13 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { err = s.pages.ProfileStarred(w, pages.ProfileStarredParams{ LoggedInUser: s.oauth.GetMultiAccountUser(r), Repos: repos, + Total: int(profile.Stats.StarredCount), Card: profile, + Page: page, }) + if err != nil { + l.Error("failed to render", "err", err) + } } func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) {