feat(veckoplan): fyll alla maltider, variation, ratt maltidstyp + plan-atgarder

Veckoplanen fyller nu ALLA slots (stegvis fallback, inga tomma dagar),
undviker tva soppor/samma kok i rad och styr soppor mot lunch (inte
middag). Default lunch+middag varje dag. Plan-atgarder: 'Jag lagade
detta' bara ratt dag; 'Hoppa over' ersatt med 'Ta bort' (ny DELETE
/v1/week-plans/:id/entries/:entryId). Verifierat mot 393 recept:
14/14 slots fyllda, 0 upprepningar, 0 soppor pa middag.
This commit is contained in:
Claude
2026-08-19 23:33:32 +00:00
parent 5867a95d64
commit 393bc35ac0
3 changed files with 97 additions and 26 deletions
+32
View File
@@ -146,6 +146,38 @@ export async function planningRoutes(app: FastifyInstance) {
return row;
});
// Ta bort en planpost helt (t.ex. "Ta bort" på en måltid man inte lagat).
app.delete("/v1/week-plans/:id/entries/:entryId", auth, async (req) => {
const params = req.params as { id: string; entryId: string };
const [plan] = await app.db
.select()
.from(schema.weekPlans)
.where(eq(schema.weekPlans.id, params.id))
.limit(1);
if (!plan) throw errors.notFound("Planen finns inte.");
await requireMembership(app.db, plan.householdId, req.userId);
const [row] = await app.db
.delete(schema.weekPlanEntries)
.where(
and(
eq(schema.weekPlanEntries.id, params.entryId),
eq(schema.weekPlanEntries.weekPlanId, params.id),
),
)
.returning();
if (!row) throw errors.notFound("Planposten finns inte.");
await emitEvent(app.db, {
type: "WEEK_PLAN_UPDATED",
payload: { weekPlanId: params.id, reason: "removed" },
userId: req.userId,
householdId: plan.householdId,
correlationId: req.correlationId,
});
return { ok: true };
});
app.post("/v1/week-plans/:id/activate", auth, async (req) => {
const { id } = parse(idParamSchema, req.params);
const [plan] = await app.db