Skip to content
Snippets Groups Projects
route.ts 1.66 KiB
import { db } from '@/lib/db'
import { hash } from 'bcrypt'
import { NextResponse } from 'next/server'

export async function POST(req: Request) {
    try {
        const { username, email, password } = await req.json()
        const hashed = await hash(password, 12)

        let usernameCheck = username.toLowerCase()
        const emailCheck = email.toLowerCase()

        const existingUser = await db.user.findUnique({
            where: {
                email: emailCheck
            }
        })

        if (existingUser) {
            throw new Error('email already exists')
        }

        let isUnique = false;
        while (!isUnique) {
            const existingUserName = await db.user.findUnique({
                where: {
                    username: usernameCheck
                }
            })

            if (existingUserName) {
                usernameCheck = `${username}${Math.floor(Math.random() * 1000)}`
            } else {
                isUnique = true;
            }
        }

        const user = await db.user.create({
            data: {
                name: username,
                username: usernameCheck,
                email: emailCheck,
                password: hashed
            }
        })

        return NextResponse.json({
            usernameOrEmail: user.email
        })
    } catch (err: any) {
        if (err.message === 'email already exists') {
            return new NextResponse(JSON.stringify({
                error: err.message
            }), { status: 422 }
            )
        }

        return new NextResponse(
            JSON.stringify({
                error: err.message
            }), { status: 500 }
        )
    }
}