export const prerender = false; import type { APIRoute } from "astro"; import { readFile, writeFile, mkdir } from "node:fs/promises"; import { resolve, dirname } from "node:path"; const REPO = process.env.REPO_ROOT || resolve("/Users/ace/palacering"); const DATA = resolve(REPO, "palaces", "manglasabang", "palaceappsdata", "palacediary"); function json(data: object, status = 200) { return new Response(JSON.stringify(data), { status, headers: { "Content-Type": "application/json" }, }); } function dayPath(date: string) { const [y, m, d] = date.split("-"); return resolve(DATA, y, m, `${d}.json`); } const DAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; function dayOfWeek(date: string) { return DAYS[new Date(date + "T12:00:00").getDay()]; } interface Review { time: string; what: string } interface Plan { what: string; time?: string; done?: boolean; failed?: boolean; pushed?: string | boolean } interface DayData { date: string; dayOfWeek: string; reviews: Review[]; plans: Plan[]; } function emptyDay(date: string): DayData { return { date, dayOfWeek: dayOfWeek(date), reviews: [], plans: [] }; } async function readDay(date: string): Promise { try { const raw = JSON.parse(await readFile(dayPath(date), "utf-8")); if (raw.moments && !raw.reviews) { return { date: raw.date, dayOfWeek: raw.dayOfWeek, reviews: raw.moments, plans: [] }; } return { ...emptyDay(date), ...raw }; } catch { return emptyDay(date); } } async function saveDay(day: DayData) { const fp = dayPath(day.date); await mkdir(dirname(fp), { recursive: true }); await writeFile(fp, JSON.stringify(day, null, 2) + "\n"); } export const GET: APIRoute = async ({ url }) => { const date = url.searchParams.get("date"); if (!date || !/^\d{4}-\d{2}-\d{2}$/.test(date)) return json({ error: "date param required (YYYY-MM-DD)" }, 400); return json(await readDay(date)); }; export const POST: APIRoute = async ({ request }) => { const body = await request.json(); const { date, action, kind, time, what, index } = body; if (!date) return json({ error: "date required" }, 400); const day = await readDay(date); if (action === "toggle_plan") { if (typeof index !== "number" || !day.plans[index]) return json({ error: "invalid index" }, 400); const plan = day.plans[index]; if (plan.failed || plan.pushed) return json({ error: "cannot toggle a failed or pushed plan" }, 400); plan.done = !plan.done; await saveDay(day); return json(day); } if (!what) return json({ error: "what required" }, 400); if (kind === "plan") { day.plans.push({ what }); } else { if (!time) return json({ error: "time required for reviews" }, 400); day.reviews.push({ time, what }); day.reviews.sort((a, b) => a.time.localeCompare(b.time)); } await saveDay(day); return json(day); };