import { json, error } from '@sveltejs/kit'; import type { RequestEvent } from '@sveltejs/kit'; import { pbAdmin } from '$lib/server/pocketbase'; import { weekStart, addDaysStr, todayInTz, resolveTz } from '@shared/timezone'; // Kids can create todos for THEMSELVES only. Writes go through the superuser // client because `assigned_chores.createRule` is parent-only — but every // privileged field is forced server-side: memberId = session user, emoji type // with zero value (so nobody can mint cash/points for themselves), weekly // frequency, this-week start/completeBy (so it expires and purges naturally). export async function POST(event: RequestEvent) { const u = event.locals.user; if (!u) { console.error('[diag] todos 401 (no session)'); throw error(401, 'Unauthorized'); } const body = await event.request.json().catch(() => ({})); const name = typeof body.name === 'string' ? body.name.trim().slice(0, 80) : ''; if (!name) throw error(400, 'Give your todo a name'); let payday = 1; let tz = 'UTC'; try { const fam: any = await pbAdmin.getOne('fams', u.famId); if (fam.payday !== undefined && fam.payday !== null) payday = Number(fam.payday); tz = resolveTz(fam.timezone || 'auto'); } catch { tz = resolveTz('auto'); } const today = todayInTz(tz); const completeBy = addDaysStr(weekStart(payday, tz), 6); try { const record = await pbAdmin.create('assigned_chores', { famId: u.famId, memberId: u.id, frequency: 'weekly', type: 'emoji', // Must be 1, not 0: PB treats 0 as blank on the required `value` // number field (400 validation_required). Value is meaningless for // emoji todos — never summed, never displayed, never rewarded. value: 1, customName: name, isTodo: true, emoji: '🎯', startDate: today, completeBy }); console.log(`[diag] todo ok member=${u.id} fam=${u.famId} todo=${record.id} name=${name}`); return json({ record }); } catch (e) { console.error( `[diag] todo 400 member=${u.id} role=${u.role} fam=${u.famId} name=${name} err=${e instanceof Error ? e.message : e}` ); throw error(400, e instanceof Error ? e.message : 'Could not add todo'); } }