Files
Starseed/docs/specs/M4-transporteurs/prompts/WT1-upload.md
T
Matthieu d9313dbec8 feat(transport) : schéma + entités Carrier + contrat lecture (ERP-155/157)
Schéma BDD du répertoire transporteurs (M4) + entités + contrat de lecture
(liste + détail), socle du front.

- Migration Version20260615150000 : tables carrier / carrier_address /
  carrier_contact / carrier_price (FK cross-module, CHECK enum, index partiel
  uq_carrier_name_active, COMMENT ON COLUMN). uploaded_document et
  qualimat_carrier réutilisées (non recréées).
- Entités Carrier* (#[Auditable], Timestampable/Blamable) + ApiResource
  LECTURE seule (GetCollection + Get via CarrierProvider, anti-N+1, exclusion
  archivés + ?includeArchived). Écriture (POST/PATCH + Processor) reportée WT4+.
- QualimatCarrier : mapping ORM lecture seule sur la table référentielle
  existante (sortie du schema_filter, mapping aligné DDL ERP-39, schema:update
  no-op) + endpoint de recherche read-only (§ 4.7).
- Relations cross-module des prix (Client/Supplier/adresses) via contrats
  Shared (ClientInterface, SupplierInterface, ClientAddressInterface,
  SupplierAddressInterface) + resolve_target_entities — sans import inter-module
  (règle n°1). Ajout du groupe supplier_address:read aux champs de
  SupplierAddress pour l'embed.
- Garde-fous : ColumnCommentsCatalog (carrier* + qualimat_carrier), makefile
  test-db-setup (index partiel carrier), i18n audit (transport_carrier*),
  EntitiesAreTimestampableBlamableTest (QualimatCarrier whitelisté).
- CarrierSerializationContractTest : contrat JSON liste + détail vérifié
  (embeds objet, booléens, enveloppe Hydra) ; JSON réel capturé dans
  spec-back § 4.0.bis.

make db-reset OK, make test vert (731), make nuxt-test vert (480),
php-cs-fixer OK.
2026-06-15 19:15:12 +02:00

2.8 KiB

WT1 — Infra upload générique Shared (ticket 1.2 / ERP-154)

Créer le worktree puis lancer Claude dedans :

git fetch origin
git worktree add ../sb-erp154-upload -b feat/erp-154-upload origin/develop
cd ../sb-erp154-upload && claude

Base : origin/develop (aucune dépendance — peut démarrer tout de suite, même avant le merge du socle Transport).


Prompt à coller

Tu travailles sur le projet Starseed (modular monolith DDD, Symfony 8 / API Platform 4). Lis CLAUDE.md et .claude/rules/backend.md avant de coder. Charge le skill backend-entity-conventions.

Mission : poser une infra d'upload de fichiers générique et réutilisable dans src/Shared/ (la « Décharge » du M4 en sera le 1er consommateur, mais ce ticket ne touche PAS au module Transport).

Spec : docs/specs/M4-transporteurs/spec-back.md § 2.7.

À livrer :

  1. Table uploaded_document (migration namespace racine DoctrineMigrations dans migrations/, postérieure à la dernière présente — vérifie ls migrations/). Colonnes : id, original_filename, stored_path, mime_type, size_bytes, checksum, created_at, created_by.
  2. Service Shared\Infrastructure\Upload\FileUploader :
    • validation MIME server-side via $file->getMimeType() (JAMAIS getClientMimeType()),
    • whitelist MIME explicite (PDF + images),
    • bornage taille, checksum sha256, écriture disque var/uploads/{yyyy}/{mm}/.
  3. Endpoint POST /api/uploaded_documents (multipart) → renvoie l'IRI. MIME hors whitelist → 422.

Gardes-fous (cassent make test sinon) :

  • COMMENT ON COLUMN sur TOUTES les colonnes de uploaded_document (FR, ≤200 car., règle n°12) ET ajoute le bloc 'uploaded_document' => [...] dans src/Shared/Infrastructure/Database/ColumnCommentsCatalog.php — sinon make test-db-setup drope les COMMENT et ColumnsHaveSqlCommentTest casse.
  • Pagination : si tu exposes une GetCollection, elle reste paginée (CollectionsArePaginatedTest).

Scope STRICT : uniquement src/Shared/ + migration + catalog. Ne crée AUCUN fichier sous src/Module/Transport/. Pas d'antivirus/S3/purge (hors périmètre, § 9).

Tests à écrire (PHPUnit) : MIME hors whitelist → 422 ; MIME valide → IRI + ligne persistée + checksum calculé.

Fini quand : make test vert + make php-cs-fixer-allow-risky propre. Commit (--no-verify OK si make test déjà vert), puis ouvre la PR :

git push -u origin feat/erp-154-upload
tea pr create --base develop --head feat/erp-154-upload \
  --title "feat(shared) : infra upload générique (ERP-154)" \
  --description "Table uploaded_document + FileUploader + endpoint POST. Ticket ERP-154."

Puis labellise la PR via l'API Gitea (tea ne pose pas les labels en CLI). Cible develop. Aucune mention IA.