import { defineAction } from "@agent-native/core"; import { getRequestUserEmail } from "@agent-native/core/server"; import { and, gte, lte, asc, eq } from "drizzle-orm"; import { z } from "zod"; import { db, schema } from "../server/db/index.js"; export default defineAction({ description: "Get daily calorie history for a date range", schema: z.object({ startDate: z .string() .optional() .describe("Start date in YYYY-MM-DD format"), endDate: z.string().optional().describe("End date in YYYY-MM-DD format"), }), http: { method: "GET" }, run: async (args) => { if (!args.startDate || !args.endDate) return []; const ownerEmail = getRequestUserEmail(); if (!ownerEmail) return []; const mealsData = await db() .select() .from(schema.meals) .where( and( gte(schema.meals.date, String(args.startDate)), lte(schema.meals.date, String(args.endDate)), eq(schema.meals.owner_email, ownerEmail), ), ) .orderBy(asc(schema.meals.date)); const exercisesData = await db() .select() .from(schema.exercises) .where( and( gte(schema.exercises.date, String(args.startDate)), lte(schema.exercises.date, String(args.endDate)), eq(schema.exercises.owner_email, ownerEmail), ), ) .orderBy(asc(schema.exercises.date)); const dataByDate = new Map(); for (const meal of mealsData) { const existing = dataByDate.get(meal.date) || { meals: 0, burned: 0 }; dataByDate.set(meal.date, { ...existing, meals: existing.meals + meal.calories, }); } for (const exercise of exercisesData) { const existing = dataByDate.get(exercise.date) || { meals: 0, burned: 0, }; dataByDate.set(exercise.date, { ...existing, burned: existing.burned + exercise.calories_burned, }); } const result = Array.from(dataByDate.entries()) .map(([date, { meals, burned }]) => ({ date, totalCalories: meals, burnedCalories: burned, netCalories: meals - burned, displayDate: new Date(date + "T12:00:00").toLocaleDateString("en-US", { month: "short", day: "numeric", }), })) .sort((a, b) => a.date.localeCompare(b.date)); return result; }, });