feat(recipes): signaler une technique absente du catalogue (#130) #138

Merged
kyuno merged 2 commits from feat/missing-tech-steps into main 2026-09-09 16:25:28 +02:00
Owner

Contexte

Closes #130 (puce 3 de #3). Le TechStepCorrectionPopover ne pouvait proposer qu'une technique déjà dans le catalogue seedé. Cette PR calque le pattern « ingrédient hors-catalogue » (Ingredient.isPlaceholder) sur TechStep. Modèle retenu : réutiliser TechStep.isPlaceholder (validé).

Changements

Modèle — TechStep + isPlaceholder/displayName/createdById/createdAt/reviewedAt + FK createdById → user_profiles (SET NULL). Migration 20260909140000_tech_step_placeholder : additive, aucune ligne seedée touchée. Mirroir exact de la migration ingredient_placeholder.

Contrat — submitTechStepCorrectionSchema accepte correctedTechStepName (string, 1–80), mutuellement exclusif de correctedTechStepId ; les refines « une technique corrigée est requise » l'acceptent aussi. TechStepView gagne isPlaceholder: boolean + displayName: string | null.

API — submitTechStepCorrection : si correctedTechStepName, crée une TechStep placeholder (key: placeholder:<uuid>, createdById) dans la transaction et poursuit avec son id ; la correction s'applique tout de suite (source: "manual"). Nouvel event tech_step.placeholder_proposed. getTechSteps filtre isPlaceholder: false. toStepTechStepViews/toCorrectionView exposent les 2 champs. Ajustements de type : sources.service.ts / cooking-session.service.ts (construction de techStep).

Admin — admin-tech-step-catalog.service.ts + routes GET/PATCH /admin/api/catalog/tech-step-placeholders (liste plate, pas de regroupement par nom normalisé — les propositions de technique sont bien plus rares que les ingrédients libres). CatalogPage : sélecteur Ingrédients / Techniques en haut, le reste inchangé.

Frontend — nouveau helper steps/tech-step-label.ts (displayName ?? t(catalog.techSteps.<key>)), utilisé par StepDescription (tooltip) et le popover. Le popover a une échappatoire « Ma technique n'est pas dans la liste » : champ texte → correctedTechStepName. i18n recipes.techStepCorrection.* + admin.catalog.kind.* / techStepEmpty.

Vérification locale

pnpm lint ✓ · pnpm build ✓ (Prisma régénéré) · Cypress : TechStepCorrectionPopover.cy.tsx 11/11 (dont l'échappatoire), admin-catalog.cy.ts 4/4 (dont l'onglet Techniques), régression admin-corrections/recipes/recipes.feature/recipe-form.feature 35/35. Mocha non exécutable ici — nouveaux tests recipe-tech-step-correction.test.ts (×2), reference.test.ts (×1 + clés mises à jour), admin-catalog.test.ts (×3) ; assertions .techStep existantes mises à jour pour les 2 champs — à valider en CI.

🤖 Generated with Claude Code

## Contexte `Closes #130` (puce 3 de #3). Le `TechStepCorrectionPopover` ne pouvait proposer qu'une technique **déjà** dans le catalogue seedé. Cette PR calque le pattern « ingrédient hors-catalogue » (`Ingredient.isPlaceholder`) sur `TechStep`. **Modèle retenu : réutiliser `TechStep.isPlaceholder`** (validé). ## Changements **Modèle** — `TechStep` + `isPlaceholder`/`displayName`/`createdById`/`createdAt`/`reviewedAt` + FK `createdById → user_profiles` (`SET NULL`). Migration `20260909140000_tech_step_placeholder` : additive, aucune ligne seedée touchée. Mirroir exact de la migration `ingredient_placeholder`. **Contrat** — `submitTechStepCorrectionSchema` accepte `correctedTechStepName` (`string`, 1–80), mutuellement exclusif de `correctedTechStepId` ; les refines « une technique corrigée est requise » l'acceptent aussi. `TechStepView` gagne `isPlaceholder: boolean` + `displayName: string | null`. **API** — `submitTechStepCorrection` : si `correctedTechStepName`, crée une `TechStep` placeholder (`key: placeholder:<uuid>`, `createdById`) dans la transaction et poursuit avec son id ; la correction s'applique tout de suite (`source: "manual"`). Nouvel event `tech_step.placeholder_proposed`. `getTechSteps` filtre `isPlaceholder: false`. `toStepTechStepViews`/`toCorrectionView` exposent les 2 champs. Ajustements de type : `sources.service.ts` / `cooking-session.service.ts` (construction de `techStep`). **Admin** — `admin-tech-step-catalog.service.ts` + routes `GET`/`PATCH /admin/api/catalog/tech-step-placeholders` (liste **plate**, pas de regroupement par nom normalisé — les propositions de technique sont bien plus rares que les ingrédients libres). `CatalogPage` : sélecteur **Ingrédients / Techniques** en haut, le reste inchangé. **Frontend** — nouveau helper `steps/tech-step-label.ts` (`displayName ?? t(catalog.techSteps.<key>)`), utilisé par `StepDescription` (tooltip) et le popover. Le popover a une échappatoire « **Ma technique n'est pas dans la liste** » : champ texte → `correctedTechStepName`. i18n `recipes.techStepCorrection.*` + `admin.catalog.kind.*` / `techStepEmpty`. ## Vérification locale `pnpm lint` ✓ · `pnpm build` ✓ (Prisma régénéré) · Cypress : `TechStepCorrectionPopover.cy.tsx` 11/11 (dont l'échappatoire), `admin-catalog.cy.ts` 4/4 (dont l'onglet Techniques), régression `admin-corrections`/`recipes`/`recipes.feature`/`recipe-form.feature` 35/35. Mocha non exécutable ici — nouveaux tests `recipe-tech-step-correction.test.ts` (×2), `reference.test.ts` (×1 + clés mises à jour), `admin-catalog.test.ts` (×3) ; assertions `.techStep` existantes mises à jour pour les 2 champs — à valider en CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-09 15:41:06 +02:00
feat(recipes): signaler une technique absente du catalogue (#130)
Some checks failed
CI / lint (push) Successful in 1m37s
CI / intent-service-test (push) Successful in 5m11s
CI / build (push) Successful in 1m9s
CI / e2e (push) Failing after 7m13s
CI / test (push) Failing after 18m46s
CI / build-android (push) Has been skipped
b49ef5bb40
Calque le pattern « ingrédient hors-catalogue » sur `TechStep` : cinq
colonnes additives (`isPlaceholder`/`displayName`/`createdById`/`createdAt`/
`reviewedAt`), migration purement additive, FK `createdById → user_profiles`
en `SET NULL`.

Correction d'étape : `submitTechStepCorrectionSchema` accepte
`correctedTechStepName` (mutuellement exclusif de `correctedTechStepId`) ;
`submitTechStepCorrection` crée une `TechStep` placeholder dans la
transaction et poursuit comme si son id avait été fourni. La correction
s'applique immédiatement (`source: manual`) ; nouvel event analytics
`tech_step.placeholder_proposed`.

`TechStepView` gagne `isPlaceholder`/`displayName` ; `GET
/reference/tech-steps` exclut les placeholders. Nouveau helper web
`techStepLabel` (`displayName ?? t(catalog.techSteps.<key>)`), utilisé par
`StepDescription` et le popover. Le popover a une échappatoire « Ma
technique n'est pas dans la liste » (champ libre).

Admin : `admin-tech-step-catalog.service.ts` + routes
`GET/PATCH /admin/api/catalog/tech-step-placeholders` (liste plate — les
propositions de technique sont rares) ; `CatalogPage` gagne un sélecteur
Ingrédients / Techniques.

Tests : Mocha (proposition placeholder, rejet id+nom, exclusion catalogue,
liste + mark-reviewed admin) + Cypress (composant popover, e2e admin
catalogue). Assertions `.techStep` existantes mises à jour pour les 2
nouveaux champs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-09 16:05:06 +02:00
test: aligne les assertions restantes sur TechStepView { isPlaceholder, displayName } (#130)
All checks were successful
CI / lint (push) Successful in 3m4s
CI / build (push) Successful in 3m8s
CI / intent-service-test (push) Successful in 5m0s
CI / e2e (push) Successful in 10m58s
CI / test (push) Successful in 19m18s
CI / build-android (push) Has been skipped
380f22d988
Deux specs n'avaient pas été mises à jour quand `sources.service` s'est mis
à renvoyer un `techStep` complet et que le titre du catalogue admin est
passé de « Ingrédients hors-catalogue » à « Éléments hors-catalogue » :

- `sources.test.ts` : les deux `deep.equal({ id, key })` sur le techStep
  d'une étape de preview attendent maintenant aussi `isPlaceholder: false`
  et `displayName: null`.
- `admin-layout.cy.ts` : l'assertion du `h1` de /admin/catalogue suit le
  nouveau libellé.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit 61079b3a2a into main 2026-09-09 16:25:28 +02:00
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: kyuno/batchCooking#138
No description provided.