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 }