diff --git a/prisma/migrations/20251009084017_add_partner_inquiry/migration.sql b/prisma/migrations/20251009084017_add_partner_inquiry/migration.sql new file mode 100644 index 0000000..aef79fb --- /dev/null +++ b/prisma/migrations/20251009084017_add_partner_inquiry/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "partner_inquiries" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "contact" TEXT NOT NULL, + "category" TEXT, + "message" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'pending', + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "approvedAt" DATETIME +); + +-- CreateIndex +CREATE INDEX "partner_inquiries_status_createdAt_idx" ON "partner_inquiries"("status", "createdAt"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 498a2d8..94b556d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -631,3 +631,18 @@ model Partner { @@index([category]) @@map("partners") } + +// 제휴 문의 +model PartnerInquiry { + id String @id @default(cuid()) + name String + contact String + category String? + message String + status String @default("pending") // pending/approved/rejected + createdAt DateTime @default(now()) + approvedAt DateTime? + + @@index([status, createdAt]) + @@map("partner_inquiries") +} diff --git a/public/erd.svg b/public/erd.svg index 7998e35..a96c91a 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/partner-inquiries/[id]/approve/route.ts b/src/app/api/partner-inquiries/[id]/approve/route.ts new file mode 100644 index 0000000..862e062 --- /dev/null +++ b/src/app/api/partner-inquiries/[id]/approve/route.ts @@ -0,0 +1,10 @@ +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; + +export async function POST(_: Request, context: { params: Promise<{ id: string }> }) { + const { id } = await context.params; + const updated = await prisma.partnerInquiry.update({ where: { id }, data: { status: "approved", approvedAt: new Date() } }); + return NextResponse.json({ inquiry: updated }); +} + + diff --git a/src/app/api/partner-inquiries/route.ts b/src/app/api/partner-inquiries/route.ts new file mode 100644 index 0000000..7b1b85b --- /dev/null +++ b/src/app/api/partner-inquiries/route.ts @@ -0,0 +1,20 @@ +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; +import { z } from "zod"; + +const schema = z.object({ name: z.string().min(1), contact: z.string().min(1), category: z.string().optional(), message: z.string().min(1) }); + +export async function POST(req: Request) { + const body = await req.json().catch(() => ({})); + const parsed = schema.safeParse(body); + if (!parsed.success) return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 }); + const created = await prisma.partnerInquiry.create({ data: parsed.data }); + return NextResponse.json({ inquiry: created }, { status: 201 }); +} + +export async function GET() { + const items = await prisma.partnerInquiry.findMany({ orderBy: { createdAt: "desc" } }); + return NextResponse.json({ inquiries: items }); +} + + diff --git a/src/app/partners/inquiry/page.tsx b/src/app/partners/inquiry/page.tsx new file mode 100644 index 0000000..6d11dc7 --- /dev/null +++ b/src/app/partners/inquiry/page.tsx @@ -0,0 +1,24 @@ +"use client"; +import { useState } from "react"; + +export default function PartnerInquiryPage() { + const [form, setForm] = useState({ name: "", contact: "", category: "", message: "" }); + const [done, setDone] = useState(false); + async function submit() { + const r = await fetch("/api/partner-inquiries", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(form) }); + setDone(r.ok); + } + if (done) return