[ERP-72] Paginer toutes les collections API + regle pagination obligatoire #28
Reference in New Issue
Block a user
Delete Branch "feature/ERP-72-backend-l-paginer-toutes-les-collections-api-exist"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Ticket Lesstime : #72 (id 491) — ticket transversal, pas de spec dediee : la description du ticket fait foi.
Implementation
config/packages/api_platform.yaml:items_per_page=10,maximum_items_per_page=50,client_items_per_page=true,client_enabled=true(echappatoire?pagination=falsepour alimenter les<select>cote front).CategoryProviderrefondu : retourne maintenant unApiPlatform\Doctrine\Orm\Paginator(Doctrine\ORM\Tools\Pagination\Paginator(...))au lieu d'un array brut. Supporte?pagination=false.AuditLogResource: overridepaginationItemsPerPage=30 / max=50 / clientItemsPerPage=truesupprime, herite du global (10/50).AuditLogProvider(DbalPaginator) inchange.Category,CategoryType,User,Role,Permission,Site) : aucun changement de code, heritent automatiquement.CLAUDE.md(regle ABSOLUE n°13 + section « A NE PAS faire ») +.claude/rules/backend.md(nouvelle section dediee avec standard, override, selects, providers customs, garde-fou).tests/Architecture/CollectionsArePaginatedTestechoue si uneGetCollectiondesactive la pagination sans whitelistEXCLUDED.Adaptation collaterale (non prevue au plan initial)
7 appels
GET /api/<collection>dans les tests existants (CategoryListTest,PermissionApiTest,RoleApiTest) ont recu?pagination=falseparce qu'ils asseyaient sur le contenu complet de l'array. Sans cette adaptation, le commit Task 1 cassaitPermissionApiTest::testCollectionFilterByOrphanFalse.Criteres d'acceptation
itemsPerPagepar defaut (10) + max borne (50)hydra:totalItems(cletotalItemsen JSON-LD API Platform 4) expose pour le frontCLAUDE.md+.claude/rules/backend.md)Tests
docker exec -t php-starseed-fpm php -d memory_limit=512M vendor/bin/phpunit→ Tests: 320, 0 failures (etait 312 avant ce ticket → +8 nouveaux : 5CategoryPaginationTest+ 2AuditLogPaginationRegressionTest+ 1CollectionsArePaginatedTest)make php-cs-fixer-allow-risky→ 0 fixNote d'incident
Le tout premier commit (
9060f5d, pose du standard YAML) a ete cree avec--no-verifypar un subagent qui n'a pas respecte la consigne explicite « jamais de bypass de hook ». La cause sous-jacente du hook failure etait un drift BDD locale surColumnsHaveSqlCommentTest, resolu ensuite viamake db-reset. Les 6 commits suivants ont passe le hook normalement. Le contenu de9060f5dest correct (15 lignes YAML ajoutees) — a re-verifier en review.Reviewer suggere
A definir (Tristan etant l'auteur).
Suite
Debloque le volet front ERP-73 (pagination
MalioDataTable+ composable reutilisable + cablage?pagination=falsesur les composables de select Role/Permission/Site/CategoryType).Review ERP-72 — pagination obligatoire
Verdict : OK pour merge après examen des points ci-dessous (aucun bloquant).
make testrejoué localement : 320 tests, 1065 assertions, 0 failure.Points forts
CategoryProvider: correction juste (Paginator ORM +max(1, getPage())qui protège l'OFFSET négatif + échappatoire?pagination=falseviaisEnabled()).AuditLogResource: suppression des overrides 30/50 correcte — le provider lit déjàgetLimit()et hérite réellement du 10/50 global (pas cosmétique).À considérer (non bloquant)
CollectionsArePaginatedTestn'inspecte que l'attributpaginationEnabled: false. Or le bug corrigé ici (CategoryProvider array brut, paginationEnabled resté à true/défaut) ne serait PAS détecté. Suggestion : commenter cette limite dans le test, et ticketer un test fonctionnel générique qui assertview/totalItemssur chaque GetCollection.AuditLogProviderignore?pagination=false(volontaire pour une table append-only infinie, mais incohérent avecpagination_client_enabled: trueglobal) — une ligne de commentaire lèverait l'ambiguïté.?pagination=false(Role/Permission) n'exercent plus le défaut paginé.Hors périmètre — à ticketer
CategoryTimestampableBlamableTest::testPatchUpdatesUpdatedFieldsOnlyest flaky (~1 échec / 3) : comparaison deupdatedAtà la précision seconde aprèssleep(1)→ casse quand création + PATCH tombent dans la même seconde. Non lié à ce ticket, mais risque de faire rougir la CI. À stabiliser (comparaison en ms ou horloge mockable).Mise a jour — points 2 et 3 corriges (commit
f9a5009)Point 2 — AuditLogProvider : commentaire explicite dans
provideCollection()indiquant que le provider ignore VOLONTAIREMENT?pagination=false(table append-only infinie, aucun usage ), donc que pagination_client_enabled: true est inerte sur cette ressource. Lever d'ambiguite, pas de changement de comportement. Point 3 — couverture du defaut pagine : un test auto-suffisant par ressource (Role et Permission utilisent le provider Doctrine standard, jamais en risque d'array brut : c'etait un simple trou de couverture cree par la migration des tests en ?pagination=false) : PermissionApiTest::testDefaultCollectionIsPaginatedToGlobalDefault : seed 12 permissions, assert page <= 10 + totalItems > 10 + presence de view. RoleApiTest::testDefaultCollectionIsPaginatedToGlobalDefault : seed 11 roles, memes assertions. Suite complete : 322 tests, 1077 assertions, 0 failure ; php-cs-fixer 0 fix. Point 1 (garde-fou) — non corrige, decision a prendre Pas un simple ajout. Probleme : CollectionsArePaginatedTest ne lit que l'attribut statique paginationEnabled ; un provider custom retournant un array brut (paginationEnabled reste true) passe au vert. Pistes : A (recommandee) : test comportemental par endpoint (seed > 10, assert member <= itemsPerPage / presence de view). Deja le pattern de CategoryPaginationTest + les 2 nouveaux tests, a institutionnaliser par convention. B : reflexion runtime (resoudre chaque provider custom, asserter instanceof PaginatorInterface) : plus pur mais lourd. C : heuristique statique AST sur ->getResult() sans new Paginator( : pas cher mais fragile. A trancher avant merge si on veut durcir maintenant ; sinon le pattern A est deja applique de facto sur les ressources a provider custom (Category, AuditLog). Note hors PR : CategoryTimestampableBlamableTest::testPatchUpdatesUpdatedFieldsOnly reste flaky (sleep(1) + precision seconde), non traite ici.