58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
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');
|
|
}
|
|
}
|