dh_demo

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

index.ts (1353B)


      1 import { ApiError, ERR_METHOD_NOT_ALLOWED } from '@/lib/apierror'
      2 import { sendEmail } from '@/lib/email'
      3 import { getSignupConfirmationEmailHTML } from '@/lib/email/templates'
      4 import { createSignupRequest } from '@/lib/models/signup_request'
      5 import { NextApiRequest, NextApiResponse } from 'next'
      6 
      7 export type SignUpResponse = { status: 'ok' } | ApiError
      8 
      9 // POST /api/users/signup creates a new signup request
     10 export default async function handler (
     11   req: NextApiRequest,
     12   res: NextApiResponse<SignUpResponse>,
     13 ) {
     14   if (req.method !== 'POST') {
     15     res.status(405).json(ERR_METHOD_NOT_ALLOWED)
     16     return
     17   }
     18 
     19   const { email } = req.body as { email: string }
     20   const requestedIP = getIPAddress(req)
     21   const requestedUserAgent = req.headers['user-agent'] ?? ''
     22 
     23   const requestID = await createSignupRequest([email, requestedIP, requestedUserAgent])
     24   const requestURL = `${process.env.WIKI_SITE_URL ?? 'http://localhost'}/users/signup/${requestID}`
     25 
     26   await sendEmail(
     27     email,
     28     '계정 만들기',
     29     getSignupConfirmationEmailHTML(requestURL),
     30   )
     31 
     32   res.status(201).json({ status: 'ok' })
     33 }
     34 
     35 function getIPAddress (req: NextApiRequest): string {
     36   const result = req.headers['x-forwarded-for'] ?? req.socket.remoteAddress
     37   if (result == null) {
     38     return ''
     39   }
     40   if (Array.isArray(result)) {
     41     return result[0]
     42   }
     43   return result
     44 }