back interdiff of round #2 and #1

appview: improve pagination.Page usage #519

closed
opened by ptr.pet targeting master from [deleted fork]: pipeline-paginated
files
appview
db
issues
middleware
notifications
pages
templates
goodfirstissues
notifications
repo
issues
pagination
repo
state
ERROR
appview/db/issues.go

Failed to calculate interdiff for this file.

REBASED
appview/issues/issues.go

This patch was likely rebased, as context lines do not match.

REBASED
appview/issues/router.go

This patch was likely rebased, as context lines do not match.

ERROR
appview/middleware/middleware.go

Failed to calculate interdiff for this file.

ERROR
appview/pages/pages.go

Failed to calculate interdiff for this file.

ERROR
appview/pages/templates/repo/issues/issues.html

Failed to calculate interdiff for this file.

REBASED
appview/pagination/page.go

This patch was likely rebased, as context lines do not match.

REBASED
appview/repo/feed.go

This patch was likely rebased, as context lines do not match.

NEW
appview/db/notifications.go
··· 68 68 limit ? offset ? 69 69 `, whereClause) 70 70 71 - args = append(args, page.Limit, page.Offset) 71 + args = append(args, page.Count, page.Count*page.No+1) 72 72 73 73 rows, err := e.QueryContext(context.Background(), query, args...) 74 74 if err != nil { ··· 142 142 limit ? offset ? 143 143 `, whereClause) 144 144 145 - args = append(args, page.Limit, page.Offset) 145 + args = append(args, page.Count, page.Count*page.No+1) 146 146 147 147 rows, err := e.QueryContext(context.Background(), query, args...) 148 148 if err != nil { ··· 247 247 248 248 // GetNotifications retrieves notifications with filters 249 249 func GetNotifications(e Execer, filters ...filter) ([]*models.Notification, error) { 250 - return GetNotificationsPaginated(e, pagination.FirstPage(), filters...) 250 + return GetNotificationsPaginated(e, pagination.Page{No: 0, Count: 30}, filters...) 251 251 } 252 252 253 253 func CountNotifications(e Execer, filters ...filter) (int64, error) {
NEW
appview/notifications/notifications.go
··· 34 34 35 35 r.Group(func(r chi.Router) { 36 36 r.Use(middleware.AuthMiddleware(n.oauth)) 37 - r.With(middleware.Paginate).Get("/", n.notificationsPage) 37 + r.With(middleware.Paginate(30)).Get("/", n.notificationsPage) 38 38 r.Post("/{id}/read", n.markRead) 39 39 r.Post("/read-all", n.markAllRead) 40 40 r.Delete("/{id}", n.deleteNotification) ··· 49 49 page, ok := r.Context().Value("page").(pagination.Page) 50 50 if !ok { 51 51 log.Println("failed to get page") 52 - page = pagination.FirstPage() 52 + page = pagination.Page{No: 0, Count: 30} 53 53 } 54 54 55 55 total, err := db.CountNotifications( ··· 61 61 n.pages.Error500(w) 62 62 return 63 63 } 64 + paginate := pagination.NewFromPage(page, int(total)) 64 65 65 66 notifications, err := db.GetNotificationsWithEntities( 66 67 n.db, ··· 84 85 LoggedInUser: user, 85 86 Notifications: notifications, 86 87 UnreadCount: unreadCount, 87 - Page: page, 88 + Pagination: paginate, 88 89 Total: total, 89 90 }) 90 91 }
NEW
appview/pages/templates/goodfirstissues/index.html
··· 130 130 </div> 131 131 {{ end }} 132 132 133 - {{ if or (gt .Page.Offset 0) (eq (len .RepoGroups) .Page.Limit) }} 133 + {{ if or .Pagination.HasPreviousPage .Pagination.HasNextPage }} 134 134 <div class="flex justify-center mt-8"> 135 135 <div class="flex gap-2"> 136 - {{ if gt .Page.Offset 0 }} 137 - {{ $prev := .Page.Previous }} 136 + {{ if .Pagination.HasPreviousPage }} 137 + {{ $prev := .Pagination.PreviousPage }} 138 138 <a 139 139 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 140 140 hx-boost="true" 141 - href="/goodfirstissues?offset={{ $prev.Offset }}&limit={{ $prev.Limit }}" 141 + href="/goodfirstissues?page={{ add $prev.No 1 }}&count={{ $prev.Count }}" 142 142 > 143 143 {{ i "chevron-left" "w-4 h-4" }} 144 144 previous ··· 147 147 <div></div> 148 148 {{ end }} 149 149 150 - {{ if eq (len .RepoGroups) .Page.Limit }} 151 - {{ $next := .Page.Next }} 150 + {{ if .Pagination.HasNextPage }} 151 + {{ $next := .Pagination.NextPage }} 152 152 <a 153 153 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 154 154 hx-boost="true" 155 - href="/goodfirstissues?offset={{ $next.Offset }}&limit={{ $next.Limit }}" 155 + href="/goodfirstissues?page={{ add $next.No 1 }}&count={{ $next.Count }}" 156 156 > 157 157 next 158 158 {{ i "chevron-right" "w-4 h-4" }}
NEW
appview/pages/templates/notifications/list.html
··· 35 35 36 36 {{ define "pagination" }} 37 37 <div class="flex justify-end mt-4 gap-2"> 38 - {{ if gt .Page.Offset 0 }} 39 - {{ $prev := .Page.Previous }} 38 + {{ if .Pagination.HasPreviousPage }} 39 + {{ $prev := .Pagination.PreviousPage }} 40 40 <a 41 41 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 42 42 hx-boost="true" 43 - href = "/notifications?offset={{ $prev.Offset }}&limit={{ $prev.Limit }}" 43 + href = "/notifications?page={{ add $prev.No 1 }}&count={{ $prev.Count }}" 44 44 > 45 45 {{ i "chevron-left" "w-4 h-4" }} 46 46 previous ··· 49 49 <div></div> 50 50 {{ end }} 51 51 52 - {{ $next := .Page.Next }} 53 - {{ if lt $next.Offset .Total }} 54 - {{ $next := .Page.Next }} 52 + {{ if .Pagination.HasNextPage }} 53 + {{ $next := .Pagination.NextPage }} 55 54 <a 56 55 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 57 56 hx-boost="true" 58 - href = "/notifications?offset={{ $next.Offset }}&limit={{ $next.Limit }}" 57 + href = "/notifications?page={{ add $next.No 1 }}&count={{ $next.Count }}" 59 58 > 60 59 next 61 60 {{ i "chevron-right" "w-4 h-4" }}
NEW
appview/state/gfi.go
··· 20 20 21 21 page, ok := r.Context().Value("page").(pagination.Page) 22 22 if !ok { 23 - page = pagination.FirstPage() 23 + page = pagination.Page{No: 0, Count: 30} 24 24 } 25 25 26 26 goodFirstIssueLabel := fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "good-first-issue") ··· 37 37 LoggedInUser: user, 38 38 RepoGroups: []*models.RepoGroup{}, 39 39 LabelDefs: make(map[string]*models.LabelDefinition), 40 - Page: page, 40 + Pagination: pagination.NewFromPage(page, 0), 41 41 }) 42 42 return 43 43 } ··· 50 50 allIssues, err := db.GetIssuesPaginated( 51 51 s.db, 52 52 pagination.Page{ 53 - Limit: 500, 53 + No: 0, 54 + Count: 500, 54 55 }, 55 56 db.FilterIn("repo_at", repoUris), 56 57 db.FilterEq("open", 1), ··· 61 62 return 62 63 } 63 64 65 + pagination := pagination.NewFromPage(page, len(allIssues)) 66 + 64 67 var goodFirstIssues []models.Issue 65 68 for _, issue := range allIssues { 66 69 if issue.Labels.ContainsLabel(goodFirstIssueLabel) { ··· 98 101 return sortedGroups[i].Repo.Name < sortedGroups[j].Repo.Name 99 102 }) 100 103 101 - groupStart := page.Offset 102 - groupEnd := page.Offset + page.Limit 104 + groupStart := page.Count * page.No 105 + groupEnd := page.Count * (page.No + 1) 103 106 if groupStart > len(sortedGroups) { 104 107 groupStart = len(sortedGroups) 105 108 } ··· 145 148 LoggedInUser: user, 146 149 RepoGroups: paginatedGroups, 147 150 LabelDefs: labelDefsMap, 148 - Page: page, 151 + Pagination: pagination, 149 152 GfiLabel: labelDefsMap[goodFirstIssueLabel], 150 153 }) 151 154 }