[id].ts (2177B)
1 import { ApiError, ERR_INTERNAL, ERR_METHOD_NOT_ALLOWED } from '@/lib/apierror' 2 import { withConnection } from '@/lib/model_helpers' 3 import { createLoginInfo } from '@/lib/models/login_info' 4 import { 5 confirmSignupRequest, 6 getUnconfirmedSignupRequest, 7 } from '@/lib/models/signup_request' 8 import { createUserProfile } from '@/lib/models/user_profile' 9 import { parseIntOrDefault } from '@/lib/utils/number' 10 import bcrypt from 'bcrypt' 11 import { NextApiRequest, NextApiResponse } from 'next' 12 13 interface SignupRequest { 14 password: string 15 nickname: string 16 } 17 18 export default async function handler ( 19 req: NextApiRequest, 20 res: NextApiResponse<{ status: 'ok' } | ApiError>, 21 ) { 22 if (req.method !== 'POST') { 23 res.status(405).json(ERR_METHOD_NOT_ALLOWED) 24 return 25 } 26 27 const id = parseIntOrDefault(req.query.id, -1) 28 if (id < 0) { 29 res.status(500) 30 .json({ code: 'internal error', message: 'id is null' }) 31 return 32 } 33 34 const { password, nickname } = req.body as SignupRequest 35 if (password == null || password === '') { 36 res.status(400).json({ 37 code: 'invalid_password', 38 message: 'password is required', 39 }) 40 return 41 } 42 if (nickname == null || nickname === '') { 43 res.status(400).json({ 44 code: 'invalid_nickname', 45 message: 'nickname is required', 46 }) 47 return 48 } 49 50 // 패스워드 해시 51 const passwordHash = await bcrypt.hash(password, 10) 52 53 await withConnection(async (conn) => { 54 try { 55 // 요청 정보가 존재하는지 확인 56 const signupRequest = await getUnconfirmedSignupRequest(conn, [id]) 57 if (signupRequest == null) { 58 res.status(404).json({ 59 code: 'signup_request_not_found', 60 message: 'signup request was not found or expired', 61 }) 62 return 63 } 64 65 await confirmSignupRequest(conn, [signupRequest.id]) 66 67 const userId = await createLoginInfo(conn, [signupRequest.email, passwordHash]) 68 await createUserProfile(conn, [userId, nickname, null]) 69 70 res.status(201).json({ status: 'ok' }) 71 } catch (e) { 72 console.error('failed to confirm signup request', e) 73 res.status(500).json(ERR_INTERNAL) 74 } 75 }) 76 }