39 lines
1.0 KiB
TypeScript
39 lines
1.0 KiB
TypeScript
import bcrypt from 'bcryptjs'
|
|
import { nanoid } from 'nanoid'
|
|
import { prisma } from '../../utils/db'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const body = await readBody<{ name?: string; password?: string }>(event)
|
|
|
|
if (!body?.name?.trim() || !body?.password) {
|
|
throw createError({ statusCode: 400, statusMessage: 'Name and password required' })
|
|
}
|
|
|
|
if (body.password.length < 4) {
|
|
throw createError({ statusCode: 400, statusMessage: 'Password must be at least 4 characters' })
|
|
}
|
|
|
|
const id = nanoid(10)
|
|
const passwordHash = await bcrypt.hash(body.password, 10)
|
|
const admin = event.context.admin as { username?: string } | undefined
|
|
|
|
const room = await prisma.room.create({
|
|
data: {
|
|
id,
|
|
name: body.name.trim(),
|
|
passwordHash,
|
|
pwdVersion: 1,
|
|
createdBy: admin?.username || 'admin',
|
|
},
|
|
})
|
|
|
|
return {
|
|
id: room.id,
|
|
name: room.name,
|
|
pwdVersion: room.pwdVersion,
|
|
createdAt: room.createdAt.toISOString(),
|
|
createdBy: room.createdBy,
|
|
url: `/room/${room.id}`,
|
|
}
|
|
})
|