From b8ad3654c150f9a8baa9d62638029766c1c52b91 Mon Sep 17 00:00:00 2001 From: Josh Freda Date: Tue, 2 Apr 2024 10:44:23 -0500 Subject: [PATCH] Add pagination for projects API --- internal/api/v2/projects.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/internal/api/v2/projects.go b/internal/api/v2/projects.go index dd405a89c..ecbd0699b 100644 --- a/internal/api/v2/projects.go +++ b/internal/api/v2/projects.go @@ -17,6 +17,7 @@ import ( ) const ( + defaultHitsPerPage = 24 MaxRecentlyViewedProjects = 10 ) @@ -76,9 +77,35 @@ func ProjectsHandler(srv server.Server) http.Handler { // Get query parameters. q := r.URL.Query() + hitsPerPageParam := q.Get("hitsPerPage") + pageParam := q.Get("page") statusParam := q.Get("status") titleParam := q.Get("title") + // Set default values for page and hitsPerPage parameters. + page := 1 + hitsPerPage := defaultHitsPerPage + + // Parse page parameter. + if pageParam != "" { + p, err := strconv.Atoi(pageParam) + if err != nil { + http.Error(w, "Invalid page parameter", http.StatusBadRequest) + return + } + page = p + } + + // Parse perPage parameter. + if hitsPerPageParam != "" { + hpp, err := strconv.Atoi(hitsPerPageParam) + if err != nil { + http.Error(w, "Invalid hitsPerPage parameter", http.StatusBadRequest) + return + } + hitsPerPage = hpp + } + // Build status condition for database query. var cond models.Project if statusParam != "" { @@ -96,8 +123,11 @@ func ProjectsHandler(srv server.Server) http.Handler { // Get projects from database. projs := []models.Project{} + offset := (page - 1) * hitsPerPage if err := srv.DB. Where("title ILIKE ?", fmt.Sprintf("%%%s%%", titleParam)). + Offset(offset). + Limit(hitsPerPage). Find(&projs, cond). Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {