[ERP-45] Implémenter Provider et Processor Category (#17)
Auto Tag Develop / tag (push) Successful in 7s
Auto Tag Develop / tag (push) Successful in 7s
## Mode stacked PR — cible `feature/ERP-44-creer-entites-category` > ⚠ Cette MR a pour base la branche ERP-44 (en review). Quand ERP-44 sera mergée sur develop, **repointer la cible vers develop**. ## Résumé - Provider `CategoryProvider` : filtre soft-delete par défaut (RG-1.08), `?includeDeleted=true` (RG-1.09), tri name ASC (RG-1.10), 404 si soft-deleted hors flag (RG-1.11). - Processor `CategoryProcessor` : trim du `name` (RG-1.03), conversion DELETE → UPDATE (RG-1.12), mapping `UniqueConstraintViolationException` → HTTP 409 avec message exact (RG-1.07). - Câblage Provider/Processor dans `#[ApiResource]` de `Category`. Provider câblé aussi sur Patch + Delete (au-delà du scope strict du ticket) pour fermer la fuite RG-1.11 sur PATCH. - `DoctrineCategoryRepository` expose `createListQueryBuilder($includeDeleted)`. ## Décisions notables - **Filtre soft-delete via QueryBuilder** (choix `a` du ticket) : pas de filtre Doctrine global, lisibilité directe. - **Pas de `remove_processor` injecté** : la DELETE est convertie en UPDATE via le `persist_processor`. API Platform 4 utilise le processor déclaré sur l'opération sans fallback automatique. - **Provider sur Patch + Delete aussi** : décision prise pendant le dev pour fermer une fuite RG-1.11 sur PATCH. Coût : 2 lignes dans `Category.php`. ## Tests - `make php-cs-fixer-allow-risky` ✓ - `make test` ✓ (248 tests, 0 régression — pas de test métier Category, c'est ERP-48) - Tests manuels curl ✓ — 8 cas RG-1.03 → RG-1.13 validés (détail dans le ticket Lesstime #45) ## Tickets - Lesstime : #45 (ERP-45) → En review - Position M0 : 0.3 - Spec : `docs/specs/M0-categories/spec-back.md` § 4.1 + § 4.3 + § 4.4 + § 4.5 ## Suite - ERP-46 (0.4 CategoryType lecture seule) — base : cette branche --------- Co-authored-by: Matthieu <mtholot19@gmail.com> Reviewed-on: #17 Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
This commit was merged in pull request #17.
This commit is contained in:
@@ -10,6 +10,8 @@ use ApiPlatform\Metadata\Get;
|
||||
use ApiPlatform\Metadata\GetCollection;
|
||||
use ApiPlatform\Metadata\Patch;
|
||||
use ApiPlatform\Metadata\Post;
|
||||
use App\Module\Catalog\Infrastructure\ApiPlatform\State\Processor\CategoryProcessor;
|
||||
use App\Module\Catalog\Infrastructure\ApiPlatform\State\Provider\CategoryProvider;
|
||||
use App\Module\Catalog\Infrastructure\Doctrine\DoctrineCategoryRepository;
|
||||
use App\Shared\Domain\Attribute\Auditable;
|
||||
use App\Shared\Domain\Contract\BlamableInterface;
|
||||
@@ -33,32 +35,39 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
* - `#[Auditable]` : chaque create / update / delete (soft) est trace dans
|
||||
* audit_log par l'AuditListener du module Core.
|
||||
*
|
||||
* Les Provider (filtre soft-delete) et Processor (trim, soft delete, 409)
|
||||
* seront branches au ticket 0.3 (ERP-45). Au ticket 0.2, les operations
|
||||
* utilisent les state Doctrine par defaut d'API Platform.
|
||||
* Provider (filtre soft-delete + ?includeDeleted + tri name ASC + 404 sur
|
||||
* soft-deleted) et Processor (trim, 409 sur doublon, soft delete) branches
|
||||
* au ticket 0.3 (ERP-45).
|
||||
*/
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new GetCollection(
|
||||
security: "is_granted('catalog.categories.view')",
|
||||
normalizationContext: ['groups' => ['category:read', 'default:read']],
|
||||
provider: CategoryProvider::class,
|
||||
),
|
||||
new Get(
|
||||
security: "is_granted('catalog.categories.view')",
|
||||
normalizationContext: ['groups' => ['category:read', 'default:read']],
|
||||
provider: CategoryProvider::class,
|
||||
),
|
||||
new Post(
|
||||
security: "is_granted('catalog.categories.manage')",
|
||||
normalizationContext: ['groups' => ['category:read', 'default:read']],
|
||||
denormalizationContext: ['groups' => ['category:write']],
|
||||
processor: CategoryProcessor::class,
|
||||
),
|
||||
new Patch(
|
||||
security: "is_granted('catalog.categories.manage')",
|
||||
normalizationContext: ['groups' => ['category:read', 'default:read']],
|
||||
denormalizationContext: ['groups' => ['category:write']],
|
||||
provider: CategoryProvider::class,
|
||||
processor: CategoryProcessor::class,
|
||||
),
|
||||
new Delete(
|
||||
security: "is_granted('catalog.categories.manage')",
|
||||
provider: CategoryProvider::class,
|
||||
processor: CategoryProcessor::class,
|
||||
),
|
||||
],
|
||||
)]
|
||||
|
||||
@@ -5,10 +5,18 @@ declare(strict_types=1);
|
||||
namespace App\Module\Catalog\Domain\Repository;
|
||||
|
||||
use App\Module\Catalog\Domain\Entity\Category;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
||||
interface CategoryRepositoryInterface
|
||||
{
|
||||
public function findById(int $id): ?Category;
|
||||
|
||||
public function save(Category $category): void;
|
||||
|
||||
/**
|
||||
* Construit un QueryBuilder de liste avec filtre soft-delete et tri par defaut.
|
||||
* - $includeDeleted = false : exclut les categories soft-deleted (RG-1.08)
|
||||
* - Tri : name ASC (RG-1.10).
|
||||
*/
|
||||
public function createListQueryBuilder(bool $includeDeleted = false): QueryBuilder;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user