feat: add BaseCRUDRepository, BaseCRUDService, BaseCRUDResource, PaginatedResponse #1

Merged
claude-bot-01 merged 2 commits from feat/basecrud-baseresource into main 2026-03-29 15:50:02 +00:00

Summary

Moves BaseCRUDRepository, BaseCRUDService, BaseCRUDResource, and PaginatedResponse from print-estimate-api to the shared repository library.

Changes

  • Added repository.sql.crud_repo.BaseCRUDRepository — combined Create/Get/Update repo with count() support
  • Added repository.crud.service.BaseCRUDService — generic service with list_entities, get_entity, create_entity, update_entity, delete_entity
  • Added repository.crud.resource.BaseCRUDResource — FastAPI class-based view for CRUD endpoints (requires repository[fastapi] extra)
  • Added repository.crud.schemas.PaginatedResponse — typed paginated list response
  • Added repository.exceptions.OffsetExceededError — raised when pagination offset exceeds total
  • Bumped version to 1.8.0
  • BaseCRUDResource import is conditional on FastAPI being installed

Tests

  • 99 tests pass (14 new CRUD tests)

Closes DCR-20

## Summary Moves `BaseCRUDRepository`, `BaseCRUDService`, `BaseCRUDResource`, and `PaginatedResponse` from `print-estimate-api` to the shared `repository` library. ### Changes - Added `repository.sql.crud_repo.BaseCRUDRepository` — combined Create/Get/Update repo with `count()` support - Added `repository.crud.service.BaseCRUDService` — generic service with `list_entities`, `get_entity`, `create_entity`, `update_entity`, `delete_entity` - Added `repository.crud.resource.BaseCRUDResource` — FastAPI class-based view for CRUD endpoints (requires `repository[fastapi]` extra) - Added `repository.crud.schemas.PaginatedResponse` — typed paginated list response - Added `repository.exceptions.OffsetExceededError` — raised when pagination offset exceeds total - Bumped version to `1.8.0` - `BaseCRUDResource` import is conditional on FastAPI being installed ### Tests - 99 tests pass (14 new CRUD tests) Closes DCR-20
Migrate CRUD base classes from print-estimate-api into the repository
library so they can be shared across all services.

- `BaseCRUDRepository` (sql/crud_repo.py): combines Create/Get/Update
  async SQL repos and adds a `count(q)` method. Override
  `default_query()` for soft-delete filtering.
- `BaseCRUDService` (crud/service.py): generic service wrapping
  `BaseCRUDRepository` with list/get/create/update/delete operations,
  offset pagination, and filter support. Raises `OffsetExceededError`
  on out-of-range offsets.
- `BaseCRUDResource` (crud/resource.py): FastAPI CBV resource that
  auto-registers list/get/create/update/delete routes via
  `__init_subclass__`. Requires the new `fastapi` optional extra.
- `PaginatedResponse` (crud/schemas.py): generic paginated wrapper
  with items, total, offset, limit.
- `OffsetExceededError` added to exceptions hierarchy.
- Version bumped to 1.8.0; `fastapi` and `all` extras updated.
- Full test coverage in tests/test_crud.py (14 new tests).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
fix: make BaseCRUDResource import conditional on fastapi extra
All checks were successful
CI Pipeline - Development / Code Quality Check (pull_request) Successful in 20m59s
CI Pipeline - Development / Run Tests (pull_request) Successful in 5m22s
a9a1a1b86b
The crud/__init__.py now wraps resource imports in try/except so the
module loads cleanly without the fastapi extra installed.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
CobraPack/repository!1
No description provided.