63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { auth } from "@clerk/nextjs/server";
|
|
import { getDatabase } from "@/lib/database";
|
|
|
|
// Helper to add CORS headers
|
|
function corsHeaders() {
|
|
return {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
|
|
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
};
|
|
}
|
|
|
|
// OPTIONS - Handle preflight requests
|
|
export async function OPTIONS() {
|
|
return NextResponse.json({}, { headers: corsHeaders() });
|
|
}
|
|
|
|
// POST - Mark goal as complete
|
|
export async function POST(
|
|
req: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> },
|
|
) {
|
|
try {
|
|
const { userId } = await auth();
|
|
if (!userId) {
|
|
return NextResponse.json(
|
|
{ error: "Unauthorized" },
|
|
{ status: 401, headers: corsHeaders() },
|
|
);
|
|
}
|
|
|
|
const { id } = await params;
|
|
const db = await getDatabase();
|
|
|
|
// Verify goal exists and user owns it
|
|
const existingGoal = await db.getFitnessGoalById(id);
|
|
if (!existingGoal) {
|
|
return NextResponse.json(
|
|
{ error: "Goal not found" },
|
|
{ status: 404, headers: corsHeaders() },
|
|
);
|
|
}
|
|
if (existingGoal.userId !== userId) {
|
|
return NextResponse.json(
|
|
{ error: "Forbidden" },
|
|
{ status: 403, headers: corsHeaders() },
|
|
);
|
|
}
|
|
|
|
// Mark as completed
|
|
const completedGoal = await db.completeGoal(id);
|
|
|
|
return NextResponse.json(completedGoal, { headers: corsHeaders() });
|
|
} catch (error) {
|
|
console.error("Error completing fitness goal:", error);
|
|
return NextResponse.json(
|
|
{ error: "Internal server error" },
|
|
{ status: 500, headers: corsHeaders() },
|
|
);
|
|
}
|
|
}
|