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", "palacehealth"); 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 FoodEntry { time: string; what: string; tags?: string[] } interface ExerciseEntry { time: string; what: string; tags?: string[] } interface Sleep { bedtime: string; wakeup: string; quality?: string; note?: string } interface Symptom { time: string; what: string; severity?: number } interface Metrics { weight?: number; steps?: number; bp?: string } interface DayData { date: string; dayOfWeek: string; food: FoodEntry[]; exercise: ExerciseEntry[]; sleep: Sleep | null; symptoms: Symptom[]; metrics: Metrics; } function emptyDay(date: string): DayData { return { date, dayOfWeek: dayOfWeek(date), food: [], exercise: [], sleep: null, symptoms: [], metrics: {} }; } async function readDay(date: string): Promise { try { const raw = JSON.parse(await readFile(dayPath(date), "utf-8")); 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, section, entry, sleep, metrics } = body; if (!date) return json({ error: "date required" }, 400); const day = await readDay(date); if (section === "food" && entry) { day.food.push(entry); day.food.sort((a, b) => a.time.localeCompare(b.time)); } else if (section === "exercise" && entry) { day.exercise.push(entry); day.exercise.sort((a, b) => a.time.localeCompare(b.time)); } else if (section === "symptoms" && entry) { day.symptoms.push(entry); day.symptoms.sort((a, b) => a.time.localeCompare(b.time)); } else if (section === "sleep" && sleep) { day.sleep = sleep; } else if (section === "metrics" && metrics) { day.metrics = { ...day.metrics, ...metrics }; } else { return json({ error: "invalid section or missing payload" }, 400); } await saveDay(day); return json(day); };