dh_demo

DreamHanks demo project
git clone git://git.lair.cx/dh_demo
Log | Files | Refs | README

[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 }