diff --git a/backend/src/recipes/recipes.service.ts b/backend/src/recipes/recipes.service.ts index b568e510..8ee2a305 100644 --- a/backend/src/recipes/recipes.service.ts +++ b/backend/src/recipes/recipes.service.ts @@ -270,4 +270,35 @@ export class RecipesService { summary, }; } + + async findAll() { + return this.prisma.recipe.findMany({ + include: { + ingredients: { + include: { + product: true, + }, + }, + }, + }); + } + + async findOne(id: number) { + const recipe = await this.prisma.recipe.findUnique({ + where: { id }, + include: { + ingredients: { + include: { + product: true, + }, + }, + }, + }); + + if (!recipe) { + throw new NotFoundException(`Recipe with id ${id} not found`); + } + + return recipe; + } } \ No newline at end of file diff --git a/frontend/app/api/recipe-preview-proxy/route.ts b/frontend/app/api/recipe-preview-proxy/route.ts index 1f4b1c94..41e56286 100644 --- a/frontend/app/api/recipe-preview-proxy/route.ts +++ b/frontend/app/api/recipe-preview-proxy/route.ts @@ -5,6 +5,13 @@ const API_BASE = process.env.NEXT_PUBLIC_API_URL_INTERNAL || 'http://recipe-api: export async function GET(request: NextRequest) { const id = request.nextUrl.searchParams.get('id'); + if (!id) { + return NextResponse.json( + { error: 'Missing id parameter' }, + { status: 400 } + ); + } + const res = await fetch(`${API_BASE}/api/recipes/${id}/inventory-preview`, { method: 'GET', cache: 'no-store', diff --git a/frontend/features/inventory/types.ts b/frontend/features/inventory/types.ts index 37db3f10..8025bbb4 100644 --- a/frontend/features/inventory/types.ts +++ b/frontend/features/inventory/types.ts @@ -80,11 +80,18 @@ export type RecipePreviewInventoryItem = { id: number; quantity: string; unit: string; - brand?: string | null; - location?: string | null; - bestBeforeDate?: string | null; - canConvert?: boolean; - convertedQuantity?: number; +}; + +export type RecipePreviewMatchingInventoryItem = RecipePreviewInventoryItem & { + brand: string | null; + location: string | null; + bestBeforeDate: string | null; +}; + +export type RecipePreviewOtherInventoryItem = RecipePreviewInventoryItem & { + location: string | null; + canConvert: boolean; + convertedQuantity: number; }; export type RecipeInventoryPreviewIngredient = { @@ -96,8 +103,8 @@ export type RecipeInventoryPreviewIngredient = { note: string | null; availableQuantity: number; availableUnit: string | null; - matchingInventoryItems: RecipePreviewInventoryItem[]; - otherInventoryItems: RecipePreviewInventoryItem[]; + matchingInventoryItems: RecipePreviewMatchingInventoryItem[]; + otherInventoryItems: RecipePreviewOtherInventoryItem[]; status: 'enough' | 'missing' | 'unit_mismatch'; missingQuantity: number; };