diff --git a/prisma/migrations/20251009084422_add_partner_request/migration.sql b/prisma/migrations/20251009084422_add_partner_request/migration.sql new file mode 100644 index 0000000..ae7c048 --- /dev/null +++ b/prisma/migrations/20251009084422_add_partner_request/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "partner_requests" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "category" TEXT NOT NULL, + "latitude" REAL NOT NULL, + "longitude" REAL NOT NULL, + "address" TEXT, + "contact" TEXT, + "status" TEXT NOT NULL DEFAULT 'pending', + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "approvedAt" DATETIME +); + +-- CreateIndex +CREATE INDEX "partner_requests_status_createdAt_idx" ON "partner_requests"("status", "createdAt"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 94b556d..51cd3bc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -646,3 +646,20 @@ model PartnerInquiry { @@index([status, createdAt]) @@map("partner_inquiries") } + +// 제휴업소 등록 요청 +model PartnerRequest { + id String @id @default(cuid()) + name String + category String + latitude Float + longitude Float + address String? + contact String? + status String @default("pending") // pending/approved/rejected + createdAt DateTime @default(now()) + approvedAt DateTime? + + @@index([status, createdAt]) + @@map("partner_requests") +} diff --git a/public/erd.svg b/public/erd.svg index a96c91a..cf2c2e3 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-requests/[id]/approve/route.ts b/src/app/api/partner-requests/[id]/approve/route.ts new file mode 100644 index 0000000..ee8fc6a --- /dev/null +++ b/src/app/api/partner-requests/[id]/approve/route.ts @@ -0,0 +1,12 @@ +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 reqItem = await prisma.partnerRequest.update({ where: { id }, data: { status: "approved", approvedAt: new Date() } }); + // 승인 시 실제 파트너 등록 + await prisma.partner.create({ data: { name: reqItem.name, category: reqItem.category, latitude: reqItem.latitude, longitude: reqItem.longitude, address: reqItem.address ?? undefined } }); + return NextResponse.json({ request: reqItem }); +} + + diff --git a/src/app/api/partner-requests/route.ts b/src/app/api/partner-requests/route.ts new file mode 100644 index 0000000..acea910 --- /dev/null +++ b/src/app/api/partner-requests/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), category: z.string().min(1), latitude: z.coerce.number(), longitude: z.coerce.number(), address: z.string().optional(), contact: z.string().optional() }); + +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.partnerRequest.create({ data: parsed.data }); + return NextResponse.json({ request: created }, { status: 201 }); +} + +export async function GET() { + const items = await prisma.partnerRequest.findMany({ orderBy: { createdAt: "desc" } }); + return NextResponse.json({ requests: items }); +} + + diff --git a/src/app/partners/request/page.tsx b/src/app/partners/request/page.tsx new file mode 100644 index 0000000..073151a --- /dev/null +++ b/src/app/partners/request/page.tsx @@ -0,0 +1,26 @@ +"use client"; +import { useState } from "react"; + +export default function PartnerRequestPage() { + const [form, setForm] = useState({ name: "", category: "spa", latitude: "", longitude: "", address: "", contact: "" }); + const [done, setDone] = useState(false); + async function submit() { + const r = await fetch("/api/partner-requests", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ ...form, latitude: Number(form.latitude), longitude: Number(form.longitude) }) }); + setDone(r.ok); + } + if (done) return