diff --git a/src/app/api/attendance/route.ts b/src/app/api/attendance/route.ts new file mode 100644 index 0000000..8353c25 --- /dev/null +++ b/src/app/api/attendance/route.ts @@ -0,0 +1,28 @@ +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; +import { getUserIdFromRequest } from "@/lib/auth"; + +export async function GET(req: Request) { + const userId = getUserIdFromRequest(req); + if (!userId) return NextResponse.json({ today: null, count: 0 }); + const start = new Date(); start.setHours(0,0,0,0); + const end = new Date(); end.setHours(23,59,59,999); + const today = await prisma.pointTransaction.findFirst({ + where: { userId, reason: "attendance", createdAt: { gte: start, lte: end } }, + }); + const count = await prisma.pointTransaction.count({ where: { userId, reason: "attendance" } }); + return NextResponse.json({ today: !!today, count }); +} + +export async function POST(req: Request) { + const userId = getUserIdFromRequest(req); + if (!userId) return NextResponse.json({ error: "login required" }, { status: 401 }); + const start = new Date(); start.setHours(0,0,0,0); + const end = new Date(); end.setHours(23,59,59,999); + const exists = await prisma.pointTransaction.findFirst({ where: { userId, reason: "attendance", createdAt: { gte: start, lte: end } } }); + if (exists) return NextResponse.json({ ok: true, duplicated: true }); + await prisma.pointTransaction.create({ data: { userId, amount: 10, reason: "attendance" } }); + return NextResponse.json({ ok: true }); +} + + diff --git a/src/app/attendance/page.tsx b/src/app/attendance/page.tsx new file mode 100644 index 0000000..e1ddb63 --- /dev/null +++ b/src/app/attendance/page.tsx @@ -0,0 +1,17 @@ +"use client"; +import useSWR from "swr"; + +const fetcher = (url: string) => fetch(url).then((r) => r.json()); + +export default function AttendancePage() { + const { data, mutate } = useSWR<{ today: boolean; count: number }>("/api/attendance", fetcher); + return ( +
오늘 출석: {data?.today ? "✅" : "❌"} / 누적: {data?.count ?? 0}
+ +