Initial commit (unpacked platform)
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import { z } from "zod";
|
||||
import { MEAL_LOG_SOURCES, MEAL_TYPES } from "@app/shared-types";
|
||||
import { dateStringSchema, quantitySchema, unitSchema, uuidSchema } from "./common.js";
|
||||
|
||||
const nutritionValuesInputSchema = z.object({
|
||||
kcal: z.number().min(0).max(20000),
|
||||
proteinG: z.number().min(0).max(1000).default(0),
|
||||
carbsG: z.number().min(0).max(2000).default(0),
|
||||
fatG: z.number().min(0).max(1000).default(0),
|
||||
saturatedFatG: z.number().min(0).max(500).default(0),
|
||||
fiberG: z.number().min(0).max(300).default(0),
|
||||
sugarG: z.number().min(0).max(1000).default(0),
|
||||
saltG: z.number().min(0).max(100).default(0),
|
||||
});
|
||||
|
||||
/**
|
||||
* Måltidsloggning (spec §23). Näringsvärden får ALDRIG hittas på av AI:
|
||||
* de kommer från recept (deterministiskt), produkt/streckkod, eller
|
||||
* användarens egen inmatning. Tallriksfoto ger intervall som användaren bekräftar.
|
||||
*/
|
||||
export const logMealInputSchema = z.object({
|
||||
date: dateStringSchema,
|
||||
mealType: z.enum(MEAL_TYPES),
|
||||
source: z.enum(MEAL_LOG_SOURCES),
|
||||
titleSv: z.string().min(1).max(150),
|
||||
recipeId: uuidSchema.optional(),
|
||||
mealBoxId: uuidSchema.optional(),
|
||||
scanJobId: uuidSchema.optional(),
|
||||
portionFraction: z.number().min(0.1).max(5).default(1),
|
||||
/** Vid produkt/fritext: ange mängd + per-100-värden eller direkta värden. */
|
||||
items: z
|
||||
.array(
|
||||
z.object({
|
||||
displayName: z.string().min(1).max(120),
|
||||
canonicalIngredientId: z.string().max(80).optional(),
|
||||
productId: uuidSchema.optional(),
|
||||
quantity: quantitySchema.optional(),
|
||||
unit: unitSchema.optional(),
|
||||
nutrition: nutritionValuesInputSchema.optional(),
|
||||
}),
|
||||
)
|
||||
.max(30)
|
||||
.default([]),
|
||||
/** Direkta värden när användaren själv anger, eller bekräftat foto-intervall. */
|
||||
nutritionOverride: nutritionValuesInputSchema.optional(),
|
||||
});
|
||||
export type LogMealInput = z.infer<typeof logMealInputSchema>;
|
||||
|
||||
export const dayQuerySchema = z.object({
|
||||
date: dateStringSchema,
|
||||
});
|
||||
|
||||
export const createMealBoxInputSchema = z.object({
|
||||
recipeId: uuidSchema.optional(),
|
||||
titleSv: z.string().min(1).max(150),
|
||||
portions: z.number().int().min(1).max(24),
|
||||
storageLocationId: uuidSchema,
|
||||
frozen: z.boolean().default(false),
|
||||
cookedAt: dateStringSchema.optional(),
|
||||
reservedForUserId: uuidSchema.optional(),
|
||||
});
|
||||
export type CreateMealBoxInput = z.infer<typeof createMealBoxInputSchema>;
|
||||
|
||||
export const consumeMealBoxInputSchema = z.object({
|
||||
portions: z.number().int().min(1).max(24).default(1),
|
||||
logAsMeal: z.boolean().default(true),
|
||||
mealType: z.enum(MEAL_TYPES).default("lunch"),
|
||||
date: dateStringSchema.optional(),
|
||||
});
|
||||
export type ConsumeMealBoxInput = z.infer<typeof consumeMealBoxInputSchema>;
|
||||
Reference in New Issue
Block a user