Subject: [PATCH links] Fixing missing query string options when paginating org links.

From: Peter Sanchez <[email-masked]>
Date: Tue, 1 Apr 2025 18:53:31 -0600

Fixes: https://todo.code.netlandish.com/~netlandish/links/104
Signed-off-by: Peter Sanchez <[email-masked]>
---
 admin/routes.go   | 12 ++++++------
 billing/routes.go |  4 ++--
 core/routes.go    |  6 +++---
 helpers.go        | 29 ++++++++++++++++-------------
 list/routes.go    | 12 ++++++------
 short/routes.go   |  4 ++--
 6 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/admin/routes.go b/admin/routes.go
index 3184bb8..1e730b1 100644
--- a/admin/routes.go
+++ b/admin/routes.go
@@ -1165,11 +1165,11 @@ func (s *Service) DomainList(c echo.Context) error {
 		return err
 	}
 	if result.Organizations.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", query, result.Organizations.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Organizations.PageInfo.Cursor, "next")
 	}
 
 	if result.Organizations.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", query, result.Organizations.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Organizations.PageInfo.Cursor, "prev")
 	}
 	gmap["domains"] = result.Organizations.Result
 	return s.Render(c, http.StatusOK, "admin_domains_list.html", gmap)
@@ -1242,11 +1242,11 @@ func (s *Service) OrgList(c echo.Context) error {
 		return err
 	}
 	if result.Organizations.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", query, result.Organizations.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Organizations.PageInfo.Cursor, "next")
 	}
 
 	if result.Organizations.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", query, result.Organizations.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Organizations.PageInfo.Cursor, "prev")
 	}
 	gmap["orgs"] = result.Organizations.Result
 	return s.Render(c, http.StatusOK, "admin_organization_list.html", gmap)
@@ -1631,11 +1631,11 @@ func (s *Service) UserList(c echo.Context) error {
 		return err
 	}
 	if result.GetUsers.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", query, result.GetUsers.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.GetUsers.PageInfo.Cursor, "next")
 	}
 
 	if result.GetUsers.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", query, result.GetUsers.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.GetUsers.PageInfo.Cursor, "prev")
 	}
 	gmap["users"] = result.GetUsers.Result
 	return s.Render(c, http.StatusOK, "admin_user_list.html", gmap)
diff --git a/billing/routes.go b/billing/routes.go
index 9699849..5fd4e83 100644
--- a/billing/routes.go
+++ b/billing/routes.go
@@ -281,11 +281,11 @@ func (s *Service) SubscriptionHistory(c echo.Context) error {
 	}
 
 	if result.Payments.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", "", result.Payments.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Payments.PageInfo.Cursor, "next")
 	}
 
 	if result.Payments.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", "", result.Payments.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Payments.PageInfo.Cursor, "prev")
 	}
 	return s.Render(c, http.StatusOK, "billing_history.html", gmap)
 
diff --git a/core/routes.go b/core/routes.go
index 5d2995b..d6bdf55 100644
--- a/core/routes.go
+++ b/core/routes.go
@@ -2254,11 +2254,11 @@ func (s *Service) OrgLinksList(c echo.Context) error {
 	}
 
 	if result.OrgLinks.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", tag, search, result.OrgLinks.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.OrgLinks.PageInfo.Cursor, "next")
 	}
 
 	if result.OrgLinks.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", tag, search, result.OrgLinks.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.OrgLinks.PageInfo.Cursor, "prev")
 	}
 	if navFlag == "recent" {
 		gmap["title"] = lt.Translate("Recent Links")
@@ -3249,7 +3249,7 @@ func (s *Service) FollowToggle(c echo.Context) error {
 	orgSlug := c.Param("slug")
 	action := c.Param("action")
 	var q string
-	result := make(map[string]interface{})
+	result := make(map[string]any)
 	switch action {
 	case "follow":
 		q = `mutation Follow($orgSlug: String!) {
diff --git a/helpers.go b/helpers.go
index 9f86203..4e944c0 100644
--- a/helpers.go
+++ b/helpers.go
@@ -480,16 +480,19 @@ func ParsePendingBaseURLs(ctx context.Context, userAgent string) error {
 }
 
 // GetPaginationParams returns the params needed for cursor pagination
-func GetPaginationParams(pagination, tag, search, cursor string) template.URL {
-	queryParams := make(url.Values)
-	queryParams.Set(pagination, cursor)
-	if tag != "" {
-		queryParams.Set("tag", tag)
+func GetPaginationParams(c echo.Context, pagvar, cursor string, exclude ...string) template.URL {
+	q := make(url.Values)
+	oldq := c.QueryParams()
+	for k, val := range oldq {
+		if k == pagvar || slices.Contains(exclude, k) {
+			continue
+		}
+		for _, v := range val {
+			q.Add(k, v)
+		}
 	}
-	if search != "" {
-		queryParams.Set("q", search)
-	}
-	return template.URL(queryParams.Encode())
+	q.Set(pagvar, cursor)
+	return template.URL(q.Encode())
 }
 
 // Maps a list of domain by their levels (user, system, domain)
@@ -784,7 +787,7 @@ func NewTagQuery(t, c string) *TagQuery {
 	}
 }
 
-func (t TagQuery) GetSubQuery(inputTag, inputExcludeTag *string) (string, []interface{}, error) {
+func (t TagQuery) GetSubQuery(inputTag, inputExcludeTag *string) (string, []any, error) {
 	var tags = make([]string, 0)
 	if inputTag != nil && *inputTag != "" {
 		tag := strings.Replace(*inputTag, " ", "", -1)
@@ -942,7 +945,7 @@ func IsRegistrationEnabled(c echo.Context) bool {
 
 // Render is just a helper to always include base.html in our template
 // renderings.
-func Render(c echo.Context, code int, name string, data interface{}) error {
+func Render(c echo.Context, code int, name string, data any) error {
 	gctx := c.(*server.Context)
 	tmpl, err := gctx.NewTemplate(
 		TemplateFS,
@@ -1338,11 +1341,11 @@ func FetchAuditLogs(c echo.Context, userID int,
 		"listId":  listID,
 	}
 	if result.AuditLogs.PageInfo.HasPrevPage {
-		gmap["prevURL"] = GetPaginationParams("prev", "", "", result.AuditLogs.PageInfo.Cursor)
+		gmap["prevURL"] = GetPaginationParams(c, "prev", result.AuditLogs.PageInfo.Cursor, "next")
 	}
 
 	if result.AuditLogs.PageInfo.HasNextPage {
-		gmap["nextURL"] = GetPaginationParams("next", "", "", result.AuditLogs.PageInfo.Cursor)
+		gmap["nextURL"] = GetPaginationParams(c, "next", result.AuditLogs.PageInfo.Cursor, "prev")
 	}
 
 	return gmap, nil
diff --git a/list/routes.go b/list/routes.go
index 09af3f9..1271fbf 100644
--- a/list/routes.go
+++ b/list/routes.go
@@ -591,11 +591,11 @@ func (s *Service) ListingLinksManage(c echo.Context) error {
 		"org":          org,
 	}
 	if result.Listing.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", "", result.Listing.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Listing.PageInfo.Cursor, "next")
 	}
 
 	if result.Listing.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", "", result.Listing.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Listing.PageInfo.Cursor, "prev")
 	}
 	return s.Render(c, http.StatusOK, "listing_link_list.html", gmap)
 }
@@ -1118,11 +1118,11 @@ func (s *Service) ListingList(c echo.Context) error {
 		"autoCompleteOrgID": org.ID,
 	}
 	if result.Listings.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", tag, "", result.Listings.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Listings.PageInfo.Cursor, "next")
 	}
 
 	if result.Listings.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", tag, "", result.Listings.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Listings.PageInfo.Cursor, "prev")
 	}
 	return s.Render(c, http.StatusOK, "listing_list.html", gmap)
 }
@@ -1621,11 +1621,11 @@ func (r *DetailService) ListDetail(c echo.Context) error {
 		"query":        template.URL(query.Encode()),
 	}
 	if result.Listing.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", "", "", result.Listing.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.Listing.PageInfo.Cursor, "next")
 	}
 
 	if result.Listing.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", "", "", result.Listing.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.Listing.PageInfo.Cursor, "prev")
 	}
 	srv := gctx.Server
 	req := c.Request()
diff --git a/short/routes.go b/short/routes.go
index 5fce7cd..96d1106 100644
--- a/short/routes.go
+++ b/short/routes.go
@@ -180,11 +180,11 @@ func (s *Service) LinkShortList(c echo.Context) error {
 	}
 
 	if result.LinkShorts.PageInfo.HasPrevPage {
-		gmap["prevURL"] = links.GetPaginationParams("prev", tag, "", result.LinkShorts.PageInfo.Cursor)
+		gmap["prevURL"] = links.GetPaginationParams(c, "prev", result.LinkShorts.PageInfo.Cursor, "next")
 	}
 
 	if result.LinkShorts.PageInfo.HasNextPage {
-		gmap["nextURL"] = links.GetPaginationParams("next", tag, "", result.LinkShorts.PageInfo.Cursor)
+		gmap["nextURL"] = links.GetPaginationParams(c, "next", result.LinkShorts.PageInfo.Cursor, "prev")
 	}
 	return s.Render(c, http.StatusOK, "link_short_list.html", gmap)
 }
-- 
2.47.2