diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index bbfbfc6..57976d0 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -620,7 +620,7 @@ model CouponRedemption {
// 제휴업체(위치 기반)
model Partner {
id String @id @default(cuid())
- name String
+ name String @unique
category String
latitude Float
longitude Float
diff --git a/public/erd.svg b/public/erd.svg
index c5ee4d4..ff55d8f 100644
--- a/public/erd.svg
+++ b/public/erd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/app/api/auth/session/route.ts b/src/app/api/auth/session/route.ts
index 3179d91..15885ec 100644
--- a/src/app/api/auth/session/route.ts
+++ b/src/app/api/auth/session/route.ts
@@ -4,6 +4,23 @@ import prisma from "@/lib/prisma";
import { verifyPassword } from "@/lib/password";
import { getClientKey, isRateLimited } from "@/lib/ratelimit";
+export async function GET(req: Request) {
+ try {
+ const cookieHeader = req.headers.get("cookie") || "";
+ const uid = cookieHeader
+ .split(";")
+ .map((s) => s.trim())
+ .find((pair) => pair.startsWith("uid="))
+ ?.split("=")[1];
+ if (!uid) return NextResponse.json({ ok: false }, { status: 200 });
+ const user = await prisma.user.findUnique({ where: { userId: decodeURIComponent(uid) } });
+ if (!user) return NextResponse.json({ ok: false }, { status: 200 });
+ return NextResponse.json({ ok: true, user: { userId: user.userId, nickname: user.nickname } });
+ } catch {
+ return NextResponse.json({ ok: false }, { status: 200 });
+ }
+}
+
export async function POST(req: Request) {
const key = getClientKey(req, "login");
if (isRateLimited(key, 5, 60_000)) {
diff --git a/src/app/components/AppHeader.tsx b/src/app/components/AppHeader.tsx
index d2686ee..1dc42c8 100644
--- a/src/app/components/AppHeader.tsx
+++ b/src/app/components/AppHeader.tsx
@@ -1,7 +1,22 @@
+"use client";
import { ThemeToggle } from "@/app/components/ThemeToggle";
import { SearchBar } from "@/app/components/SearchBar";
+import { Button } from "@/app/components/ui/Button";
+import React from "react";
export function AppHeader() {
+ const [user, setUser] = React.useState<{ nickname: string } | null>(null);
+ React.useEffect(() => {
+ fetch("/api/auth/session")
+ .then((r) => r.json())
+ .then((d) => setUser(d?.ok ? d.user : null))
+ .catch(() => setUser(null));
+ }, []);
+ const onLogout = async () => {
+ await fetch("/api/auth/session", { method: "DELETE" });
+ setUser(null);
+ location.reload();
+ };
return (