import { auth } from "@clerk/nextjs/server"; import { NextRequest, NextResponse } from "next/server"; import { getDatabase } from "@/lib/database"; import { ensureUserSynced } from "@/lib/sync-user"; import log from "@/lib/logger"; import { getUserMembershipContext } from "@/lib/membership/access"; export async function POST(req: NextRequest) { try { const { userId } = await auth(); if (!userId) return new NextResponse("Unauthorized", { status: 401 }); const db = await getDatabase(); await ensureUserSynced(userId, db); const { features, membershipType } = await getUserMembershipContext(userId); if (!features.nutritionTracking) { return NextResponse.json( { error: "Nutrition tracking is available on Premium and VIP memberships", membershipType, }, { status: 403 }, ); } const body = await req.json(); const { date, meals, totalCalories, calorieGoal } = body; if (!date) { return NextResponse.json({ error: "Date is required" }, { status: 400 }); } // Check if entry already exists for this date const existing = await db.getDailyNutrition(userId, date); let result; if (existing) { // Update existing entry result = await db.updateDailyNutrition(existing.id, { meals, totalCalories: totalCalories ?? existing.totalCalories, calorieGoal: calorieGoal ?? existing.calorieGoal, }); } else { // Create new entry result = await db.createDailyNutrition({ userId, date, meals: meals || [], totalCalories: totalCalories || 0, calorieGoal: calorieGoal || 2000, }); } return NextResponse.json(result); } catch (error) { log.error("Failed to save nutrition data", error); return NextResponse.json( { error: "Internal server error" }, { status: 500 }, ); } } export async function GET(req: NextRequest) { try { const { userId } = await auth(); if (!userId) return new NextResponse("Unauthorized", { status: 401 }); const db = await getDatabase(); await ensureUserSynced(userId, db); const { features, membershipType } = await getUserMembershipContext(userId); if (!features.nutritionTracking) { return NextResponse.json( { error: "Nutrition tracking is available on Premium and VIP memberships", membershipType, }, { status: 403 }, ); } const url = new URL(req.url); const date = url.searchParams.get("date"); const startDate = url.searchParams.get("startDate"); const endDate = url.searchParams.get("endDate"); // Single date query if (date) { const result = await db.getDailyNutrition(userId, date); return NextResponse.json(result); } // Date range query if (startDate && endDate) { const results = await db.getDailyNutritionRange( userId, startDate, endDate, ); return NextResponse.json(results); } return NextResponse.json( { error: "Either 'date' or 'startDate' and 'endDate' are required" }, { status: 400 }, ); } catch (error) { log.error("Failed to fetch nutrition data", error); return NextResponse.json( { error: "Internal server error" }, { status: 500 }, ); } } export async function DELETE(req: NextRequest) { try { const { userId } = await auth(); if (!userId) return new NextResponse("Unauthorized", { status: 401 }); const db = await getDatabase(); await ensureUserSynced(userId, db); const { features, membershipType } = await getUserMembershipContext(userId); if (!features.nutritionTracking) { return NextResponse.json( { error: "Nutrition tracking is available on Premium and VIP memberships", membershipType, }, { status: 403 }, ); } const url = new URL(req.url); const id = url.searchParams.get("id"); if (!id) { return NextResponse.json({ error: "ID is required" }, { status: 400 }); } // Verify ownership before deletion const existing = await db.getDailyNutritionById(id); if (!existing) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } if (existing.userId !== userId) { return NextResponse.json( { error: "Forbidden: You can only delete your own nutrition data" }, { status: 403 }, ); } const success = await db.deleteDailyNutrition(id); if (success) { return NextResponse.json({ success: true }); } else { return NextResponse.json({ error: "Not found" }, { status: 404 }); } } catch (error) { log.error("Failed to delete nutrition data", error); return NextResponse.json( { error: "Internal server error" }, { status: 500 }, ); } }