package http import ( "net/http" "strconv" "strings" "primaya-api/cpone-middleware/internal/repository" ) const ( defaultLayananPerPage = 15 maxLayananPerPage = 1000 ) type LayananPaginationResponse struct { CurrentPage int `json:"current_page"` Data []repository.LayananDepartemen `json:"data"` FirstPageURL string `json:"first_page_url"` From *int `json:"from"` LastPage int `json:"last_page"` LastPageURL string `json:"last_page_url"` Links map[string]any `json:"links"` NextPageURL *string `json:"next_page_url"` Total int `json:"total"` PerPage int `json:"per_page"` } func (h Handler) ListLayanan(w http.ResponseWriter, r *http.Request) { pageNumber := layananPageNumber(r) perPage := layananPageSize(r) search := strings.TrimSpace(r.URL.Query().Get("search")) departemenID := strings.TrimSpace(r.URL.Query().Get("departemen_id")) page, err := h.layananRepository(r.Context()).ListLayanan(r.Context(), repository.LayananListParams{ Page: pageNumber, PerPage: perPage, Search: search, DepartemenID: departemenID, }) if err != nil { WriteJSON(w, http.StatusInternalServerError, Response{ Success: false, Message: "internal server error", Data: nil, }) return } lastPage := (page.Total + perPage - 1) / perPage if lastPage < 1 { lastPage = 1 } var from *int if len(page.Items) > 0 { value := (pageNumber-1)*perPage + 1 from = &value } var nextPageURL *string if pageNumber < lastPage { value := currentRequestURL(r, pageNumber+1) nextPageURL = &value } WriteJSON(w, http.StatusOK, LayananPaginationResponse{ CurrentPage: pageNumber, Data: page.Items, FirstPageURL: "", From: from, LastPage: lastPage, LastPageURL: "", Links: map[string]any{}, NextPageURL: nextPageURL, Total: page.Total, PerPage: perPage, }) } func layananPageSize(r *http.Request) int { perPage, err := strconv.Atoi(r.URL.Query().Get("per_page")) if err != nil || perPage < 1 { return defaultLayananPerPage } if perPage > maxLayananPerPage { return maxLayananPerPage } return perPage } func layananPageNumber(r *http.Request) int { page, err := strconv.Atoi(r.URL.Query().Get("page")) if err != nil || page < 1 { return 1 } return page }