import { NextRequest, NextResponse } from 'next/server'; import bcrypt from 'bcryptjs'; import { prisma } from '@/lib/prisma'; export async function POST(request: NextRequest) { try { const { username, password } = await request.json(); if (!username || !password) { return NextResponse.json({ error: 'Username and password are required' }, { status: 400 }); } const existingUser = await prisma.user.findUnique({ where: { username }, }); if (existingUser) { return NextResponse.json({ error: 'Username already exists' }, { status: 400 }); } const hashedPassword = await bcrypt.hash(password, 10); const user = await prisma.user.create({ data: { username, password: hashedPassword, }, }); // Automatically login after register const JWT_SECRET = new TextEncoder().encode( process.env.JWT_SECRET || 'your-secret-key-at-least-32-chars-long' ); // Import SignJWT dynamically to avoid top-level import if it causes issues, though it should be fine. // Better yet, let's keep it consistent with login. const { SignJWT } = await import('jose'); const token = await new SignJWT({ userId: user.id, username: user.username }) .setProtectedHeader({ alg: 'HS256' }) .setIssuedAt() .setExpirationTime('30d') .sign(JWT_SECRET); const response = NextResponse.json( { message: 'User created successfully', userId: user.id }, { status: 201 } ); // Set cookie on response await response.cookies.set('token', token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'strict', maxAge: 30 * 24 * 60 * 60, // 30 days path: '/', }); return response; } catch (error: any) { console.error('Registration error:', error); return NextResponse.json({ error: error.message || 'Internal server error' }, { status: 500 }); } }