47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/db";
|
|
import { hashPassword } from "@/lib/auth/password";
|
|
import { createSession } from "@/lib/auth/session";
|
|
import { apiRouteErrorResponse } from "@/lib/auth/api";
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const body = (await request.json().catch(() => ({}))) as {
|
|
email?: string;
|
|
password?: string;
|
|
name?: string;
|
|
};
|
|
const email = body.email?.trim().toLowerCase();
|
|
const password = body.password ?? "";
|
|
const name = body.name?.trim() || null;
|
|
|
|
if (!email || !password) {
|
|
return NextResponse.json({ error: "請輸入 Email 與密碼" }, { status: 400 });
|
|
}
|
|
if (password.length < 6) {
|
|
return NextResponse.json({ error: "密碼至少 6 個字元" }, { status: 400 });
|
|
}
|
|
|
|
const existing = await prisma.user.findUnique({ where: { email } });
|
|
if (existing) {
|
|
return NextResponse.json({ error: "此 Email 已註冊" }, { status: 409 });
|
|
}
|
|
|
|
const user = await prisma.user.create({
|
|
data: {
|
|
email,
|
|
name,
|
|
passwordHash: hashPassword(password),
|
|
},
|
|
});
|
|
|
|
await createSession(user.id);
|
|
|
|
return NextResponse.json({
|
|
user: { id: user.id, email: user.email, name: user.name },
|
|
needsThreadsBind: true,
|
|
});
|
|
} catch (error) {
|
|
return apiRouteErrorResponse(error, "auth/register");
|
|
}
|
|
} |