feat(pagination): paginate activity and progress lists

This commit is contained in:
2026-05-02 15:32:10 -04:00
parent 75c872264f
commit 00faf9cea8
15 changed files with 341 additions and 59 deletions

View File

@@ -25,12 +25,12 @@ func (s *Server) GetActivity(ctx context.Context, request GetActivityRequestObje
documentID = *request.Params.DocumentId
}
offset := int64(0)
if request.Params.Offset != nil {
offset = *request.Params.Offset
page := int64(1)
if request.Params.Page != nil {
page = *request.Params.Page
}
limit := int64(100)
limit := int64(25)
if request.Params.Limit != nil {
limit = *request.Params.Limit
}
@@ -39,13 +39,33 @@ func (s *Server) GetActivity(ctx context.Context, request GetActivityRequestObje
UserID: auth.UserName,
DocFilter: docFilter,
DocumentID: documentID,
Offset: offset,
Offset: (page - 1) * limit,
Limit: limit,
})
if err != nil {
return GetActivity500JSONResponse{Code: 500, Message: err.Error()}, nil
}
// Get Total Count
total, err := s.db.Queries.GetActivityCount(ctx, database.GetActivityCountParams{
UserID: auth.UserName,
DocFilter: docFilter,
DocumentID: documentID,
})
if err != nil {
return GetActivity500JSONResponse{Code: 500, Message: err.Error()}, nil
}
// Calculate Pagination
var nextPage *int64
var previousPage *int64
if page*limit < total {
nextPage = ptrOf(page + 1)
}
if page > 1 {
previousPage = ptrOf(page - 1)
}
apiActivities := make([]Activity, len(activities))
for i, a := range activities {
// Convert StartTime from interface{} to string
@@ -70,7 +90,12 @@ func (s *Server) GetActivity(ctx context.Context, request GetActivityRequestObje
}
response := ActivityResponse{
Activities: apiActivities,
Activities: apiActivities,
Page: page,
Limit: limit,
Total: total,
NextPage: nextPage,
PreviousPage: previousPage,
}
return GetActivity200JSONResponse(response), nil
}

View File

@@ -158,7 +158,12 @@ type Activity struct {
// ActivityResponse defines model for ActivityResponse.
type ActivityResponse struct {
Activities []Activity `json:"activities"`
Activities []Activity `json:"activities"`
Limit int64 `json:"limit"`
NextPage *int64 `json:"next_page,omitempty"`
Page int64 `json:"page"`
PreviousPage *int64 `json:"previous_page,omitempty"`
Total int64 `json:"total"`
}
// BackupType defines model for BackupType.
@@ -470,7 +475,7 @@ type UsersResponse struct {
type GetActivityParams struct {
DocFilter *bool `form:"doc_filter,omitempty" json:"doc_filter,omitempty"`
DocumentId *string `form:"document_id,omitempty" json:"document_id,omitempty"`
Offset *int64 `form:"offset,omitempty" json:"offset,omitempty"`
Page *int64 `form:"page,omitempty" json:"page,omitempty"`
Limit *int64 `form:"limit,omitempty" json:"limit,omitempty"`
}
@@ -740,11 +745,11 @@ func (siw *ServerInterfaceWrapper) GetActivity(w http.ResponseWriter, r *http.Re
return
}
// ------------- Optional query parameter "offset" -------------
// ------------- Optional query parameter "page" -------------
err = runtime.BindQueryParameterWithOptions("form", true, false, "offset", r.URL.Query(), &params.Offset, runtime.BindQueryParameterOptions{Type: "integer", Format: "int64"})
err = runtime.BindQueryParameterWithOptions("form", true, false, "page", r.URL.Query(), &params.Page, runtime.BindQueryParameterOptions{Type: "integer", Format: "int64"})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err})
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "page", Err: err})
return
}

View File

@@ -33,16 +33,16 @@ func (s *Server) GetDocuments(ctx context.Context, request GetDocumentsRequestOb
limit = *request.Params.Limit
}
search := ""
if request.Params.Search != nil {
search = "%" + *request.Params.Search + "%"
var search *string
if request.Params.Search != nil && *request.Params.Search != "" {
search = ptrOf("%" + *request.Params.Search + "%")
}
rows, err := s.db.Queries.GetDocumentsWithStats(
ctx,
database.GetDocumentsWithStatsParams{
UserID: auth.UserName,
Query: &search,
Query: search,
Deleted: ptrOf(false),
Offset: (page - 1) * limit,
Limit: limit,
@@ -52,7 +52,19 @@ func (s *Server) GetDocuments(ctx context.Context, request GetDocumentsRequestOb
return GetDocuments500JSONResponse{Code: 500, Message: err.Error()}, nil
}
total := int64(len(rows))
// Get Total Count
total, err := s.db.Queries.GetDocumentsWithStatsCount(
ctx,
database.GetDocumentsWithStatsCountParams{
Query: search,
Deleted: ptrOf(false),
},
)
if err != nil {
return GetDocuments500JSONResponse{Code: 500, Message: err.Error()}, nil
}
// Calculate Pagination
var nextPage *int64
var previousPage *int64
if page*limit < total {
@@ -219,7 +231,6 @@ func (s *Server) EditDocument(ctx context.Context, request EditDocumentRequestOb
doc := docs[0]
apiDoc := Document{
Id: doc.ID,
Title: *doc.Title,
@@ -561,7 +572,6 @@ func (s *Server) UploadDocumentCover(ctx context.Context, request UploadDocument
doc := docs[0]
apiDoc := Document{
Id: doc.ID,
Title: *doc.Title,

View File

@@ -350,8 +350,26 @@ components:
type: array
items:
$ref: '#/components/schemas/Activity'
page:
type: integer
format: int64
limit:
type: integer
format: int64
next_page:
type: integer
format: int64
previous_page:
type: integer
format: int64
total:
type: integer
format: int64
required:
- activities
- page
- limit
- total
Device:
type: object
@@ -1174,18 +1192,18 @@ paths:
in: query
schema:
type: string
- name: offset
- name: page
in: query
schema:
type: integer
format: int64
default: 0
default: 1
- name: limit
in: query
schema:
type: integer
format: int64
default: 100
default: 25
security:
- BearerAuth: []
responses:

View File

@@ -2,7 +2,6 @@ package v1
import (
"context"
"math"
"time"
log "github.com/sirupsen/logrus"
@@ -43,13 +42,21 @@ func (s *Server) GetProgressList(ctx context.Context, request GetProgressListReq
return GetProgressList500JSONResponse{Code: 500, Message: "Database error"}, nil
}
total := int64(len(progress))
// Get Total Count
total, err := s.db.Queries.GetProgressCount(ctx, database.GetProgressCountParams{
UserID: auth.UserName,
DocFilter: filter.DocFilter,
DocumentID: filter.DocumentID,
})
if err != nil {
log.Error("GetProgressCount DB Error:", err)
return GetProgressList500JSONResponse{Code: 500, Message: "Database error"}, nil
}
// Calculate Pagination
var nextPage *int64
var previousPage *int64
// Calculate total pages
totalPages := int64(math.Ceil(float64(total) / float64(limit)))
if page < totalPages {
if page*limit < total {
nextPage = ptrOf(page + 1)
}
if page > 1 {