Recipe catalog v2: - Recipe gagne visibility (PERSONAL/HOUSE/PUBLIC), authorId, authorHouseId - Favoris par utilisateur (RecipeFavorite), régimes associés (RecipeDiet) - Aliments "pas aimés" par utilisateur (UserProfileDislikedIngredient), distinct des allergies médicales - API: GET /recipes?tab=favoris|perso|foyer|publique avec contrôle d'accès complet, POST/DELETE /recipes/:id/favorite, édition/suppression réservées à l'auteur (403 NOT_RECIPE_AUTHOR), GET/PATCH /profile/disliked-ingredients - Frontend: vue maître-détail (onglets + tableau + panneau détail), formulaire enrichi (visibilité, régimes), section préférences pour les aliments pas aimés Catalogue d'ingrédients de référence: - Extension du seed de 39 à ~430 ingrédients (viandes, poissons/fruits de mer, légumes, fruits, féculents, condiments/sauces, épices/herbes, pains à sandwich, cuisines italienne/asiatique/mexicaine/maghrébine, liquides et boissons de cuisine, bouillons/fonds) - Chaque ingrédient lié à ses allergènes UE (IngredientAllergy) — les 14 allergènes réglementaires restent tous couverts - Seeding optimisé en requêtes groupées (createMany/diff ciblé) plutôt qu'un upsert par ligne, pour garder resetDatabase() rapide en test Tests: 102 tests Mocha + 32 scénarios BDD, tous verts. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { wrapAsyncHandler } from "@batch-cooking/express-tools";
|
|
import { Router } from "express";
|
|
import { getAllergies, getDiets, getIngredients } from "./reference.service.js";
|
|
|
|
/**
|
|
* Router mounted at `/reference` in app.ts. Every route is deliberately
|
|
* public (no `requireAuth`) — this is static reference data, not
|
|
* per-household state, and the signup wizard (household/regime/allergen
|
|
* steps) needs to read it before an account — and therefore a session —
|
|
* exists. `/ingredients` follows the same reasoning even though it's only
|
|
* consumed post-login (the recipe catalog) — it's still non-administrable
|
|
* reference data, no reason to require a session to read it.
|
|
*/
|
|
export const referenceRouter = Router();
|
|
|
|
referenceRouter.get(
|
|
"/diets",
|
|
wrapAsyncHandler(async (_req, res) => {
|
|
res.status(200).json(await getDiets());
|
|
}),
|
|
);
|
|
|
|
referenceRouter.get(
|
|
"/allergies",
|
|
wrapAsyncHandler(async (_req, res) => {
|
|
res.status(200).json(await getAllergies());
|
|
}),
|
|
);
|
|
|
|
referenceRouter.get(
|
|
"/ingredients",
|
|
wrapAsyncHandler(async (_req, res) => {
|
|
res.status(200).json(await getIngredients());
|
|
}),
|
|
);
|