Files
stripstream-librarian/openspec/changes/reading-progress/tasks.md
Froidefond Julien 648d86970f feat: suivi de la progression de lecture par livre
- API : nouvelle table book_reading_progress (migration 0016) et module
  reading_progress.rs avec GET/PATCH /books/:id/progress (token read)
- API : GET /books/:id enrichi avec reading_status, reading_current_page,
  reading_last_read_at via LEFT JOIN
- Backoffice : badge de statut (Non lu / En cours · p.N / Lu) sur la page
  de détail et overlay sur les BookCards
- OpenSpec : change reading-progress avec proposal/design/specs/tasks

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 21:53:52 +01:00

2.1 KiB

1. Migration DB

  • 1.1 Créer infra/migrations/0016_add_reading_progress.sql avec la table book_reading_progress (book_id PK, status TEXT CHECK, current_page INT nullable, last_read_at TIMESTAMPTZ nullable, updated_at TIMESTAMPTZ)
  • 1.2 Ajouter un index sur book_reading_progress(status) pour faciliter les futurs filtres

2. Module reading_progress.rs

  • 2.1 Créer apps/api/src/reading_progress.rs avec les structs ReadingProgressResponse et UpdateReadingProgressRequest (avec ToSchema pour Swagger)
  • 2.2 Implémenter le handler get_reading_progress : vérifier que le livre existe (404 si non), LEFT JOIN sur book_reading_progress, retourner la valeur par défaut unread si absent
  • 2.3 Implémenter le handler update_reading_progress : vérifier que le livre existe (404 si non), valider current_page > 0 si status = "reading" (422 sinon), upsert via INSERT ... ON CONFLICT DO UPDATE
  • 2.4 Ajouter les annotations #[utoipa::path(...)] sur les deux handlers (tag "reading-progress", params, request body, responses 200/404/422/401, security Bearer)

3. Enrichissement GET /books/:id

  • 3.1 Dans apps/api/src/books.rs, ajouter les champs reading_status, reading_current_page, reading_last_read_at à la struct BookDetails (avec ToSchema)
  • 3.2 Modifier la requête SQL de get_book pour inclure un LEFT JOIN book_reading_progress brp ON brp.book_id = b.id et mapper les champs (valeur par défaut "unread" via COALESCE)

4. Routes dans main.rs

  • 4.1 Déclarer le module reading_progress dans apps/api/src/main.rs
  • 4.2 Ajouter GET /books/:id/progress dans read_routes
  • 4.3 Ajouter PATCH /books/:id/progress dans read_routes (accessible token read et admin)

5. Swagger / OpenAPI

  • 5.1 Dans apps/api/src/openapi.rs, enregistrer ReadingProgressResponse, UpdateReadingProgressRequest dans les components(schemas(...))
  • 5.2 Enregistrer les paths get_reading_progress et update_reading_progress dans paths(...)
  • 5.3 Vérifier que BookDetails mis à jour est correctement reflété dans le Swagger généré