signup_request.ts (1742B)
1 import db from '@/lib/db' 2 import { modelBehaviour } from '@/lib/model_helpers' 3 import { OkPacket, RowDataPacket } from 'mysql2' 4 5 export interface SignupRequest { 6 id: number 7 email: string 8 requestedIp: string 9 requestedUserAgent: string 10 createdAt: Date 11 confirmedAt: Date | null 12 } 13 14 const SQL_CREATE_SIGNUP_REQUEST = ` 15 INSERT INTO signup_requests (email, requested_ip, requested_user_agent) 16 VALUES (?, ?, ?) 17 ` 18 19 export const createSignupRequest = modelBehaviour< 20 [ email: string, requestedIP: string, requestedUserAgent: string ], 21 number 22 >(async (conn, args) => { 23 const [result] = await conn.query<OkPacket>({ 24 sql: SQL_CREATE_SIGNUP_REQUEST, 25 }, args) 26 27 return result.insertId 28 }) 29 30 const SQL_GET_UNCONFIRMED_SIGNUP_REQUEST = ` 31 SELECT id, email, requested_ip, requested_user_agent, created_at, confirmed_at 32 FROM signup_requests 33 WHERE id = ? 34 AND created_at < DATE_ADD(NOW(), INTERVAL 5 HOUR) 35 AND confirmed_at IS NULL 36 LIMIT 1 37 ` 38 39 export const getUnconfirmedSignupRequest = modelBehaviour< 40 [ id: number ], 41 SignupRequest | null 42 >(async (conn, args) => { 43 const [rows] = await conn.query<RowDataPacket[]>({ 44 sql: SQL_GET_UNCONFIRMED_SIGNUP_REQUEST, 45 }, args) 46 47 if (rows.length === 0) { 48 return null 49 } 50 51 const row = rows[0] 52 return { 53 id: row[0], 54 email: row[1], 55 requestedIp: row[2], 56 requestedUserAgent: row[3], 57 createdAt: row[4], 58 confirmedAt: row[5], 59 } 60 }) 61 62 const SQL_CONFIRM_SIGNUP_REQUEST = ` 63 UPDATE signup_requests 64 SET confirmed_at = NOW() 65 WHERE id = ? 66 ` 67 68 export const confirmSignupRequest = modelBehaviour< 69 [ id: number ], 70 void 71 >(async (conn, args) => { 72 await conn.query<OkPacket>({ 73 sql: SQL_CONFIRM_SIGNUP_REQUEST, 74 }, args) 75 })