Skip to content

feat: cursor pagination /api/users#537

Merged
greatest0fallt1me merged 1 commit into
Predictify-org:mainfrom
dragespips:task/users-cursor-v7
Jul 26, 2026
Merged

feat: cursor pagination /api/users#537
greatest0fallt1me merged 1 commit into
Predictify-org:mainfrom
dragespips:task/users-cursor-v7

Conversation

@dragespips

Copy link
Copy Markdown
Contributor

Implements GET /api/users with keyset pagination over (created_at, id) for stable, efficient listing of all registered users.

Changes:

  • src/services/userService.ts: add listUsers() + UserListRow type
    • Keyset WHERE: (created_at < cursorTime) OR (created_at = cursorTime AND id < cursorId)
    • Sort: DESC created_at, DESC id
    • Fetch limit+1 to detect next page without a COUNT query
    • Reuses encodeCursor/decodeCursor from src/utils/cursor.ts
  • src/routes/users.ts: add GET / handler
    • zod validation for cursor (optional) and limit (1–100, default 20)
    • Returns { data: UserListRow[], nextCursor: string | null }
    • Invalid/tampered cursor forwarded to service (graceful restart from page 1)
  • src/openapi/registry.ts: register GET /api/users (operationId: listUsers)
    • Documents cursor, limit query params and UserListRow schema
  • tests/usersList.test.ts: 14 focused unit tests (no live DB)
    • Happy paths, limit validation, cursor threading, error propagation

closes #408

Implements GET /api/users with keyset pagination over (created_at, id)
for stable, efficient listing of all registered users.

Changes:
- src/services/userService.ts: add listUsers() + UserListRow type
  - Keyset WHERE: (created_at < cursorTime) OR (created_at = cursorTime AND id < cursorId)
  - Sort: DESC created_at, DESC id
  - Fetch limit+1 to detect next page without a COUNT query
  - Reuses encodeCursor/decodeCursor from src/utils/cursor.ts
- src/routes/users.ts: add GET / handler
  - zod validation for cursor (optional) and limit (1–100, default 20)
  - Returns { data: UserListRow[], nextCursor: string | null }
  - Invalid/tampered cursor forwarded to service (graceful restart from page 1)
- src/openapi/registry.ts: register GET /api/users (operationId: listUsers)
  - Documents cursor, limit query params and UserListRow schema
- tests/usersList.test.ts: 14 focused unit tests (no live DB)
  - Happy paths, limit validation, cursor threading, error propagation
@greatest0fallt1me

Copy link
Copy Markdown
Contributor

Merged via direct push to main (admin)

@greatest0fallt1me
greatest0fallt1me merged commit 2f1ad86 into Predictify-org:main Jul 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add cursor pagination on /api/users (v7)

2 participants