Add WhatsApp API integration for automated receipt delivery Enforce country codes for all phone number inputs (defaults to +60)
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import type { H3Event } from 'h3'
|
|
|
|
import {
|
|
hasValidFullName,
|
|
isUserRole,
|
|
isValidPhoneNumber,
|
|
isValidUsername,
|
|
normalizeFullName,
|
|
normalizePhoneNumber,
|
|
normalizeUsername,
|
|
type UserRole
|
|
} from '~~/shared/auth'
|
|
|
|
import { assertBadRequest, getRequiredRouteParam, httpError } from './http'
|
|
import { getUserById } from './user-repository'
|
|
|
|
export function requireUserIdParam(event: H3Event) {
|
|
return getRequiredRouteParam(event, 'id', 'User id')
|
|
}
|
|
|
|
export async function requireExistingUser(userId: string, statusMessage = 'User not found') {
|
|
const user = await getUserById(userId)
|
|
|
|
if (!user) {
|
|
httpError(404, statusMessage)
|
|
}
|
|
|
|
return user
|
|
}
|
|
|
|
export function parseCreateUserInput(body: {
|
|
username?: string
|
|
fullName?: string
|
|
phoneNumber?: string
|
|
role?: UserRole
|
|
}) {
|
|
const username = normalizeUsername(body.username || '')
|
|
const fullName = normalizeFullName(body.fullName || '')
|
|
const phoneNumber = normalizePhoneNumber(body.phoneNumber || '')
|
|
const role = body.role === 'super_admin' ? 'super_admin' : 'staff'
|
|
|
|
assertBadRequest(
|
|
isValidUsername(username),
|
|
'Username must be 3 to 32 characters using lowercase letters, numbers, dot, dash, or underscore'
|
|
)
|
|
assertBadRequest(hasValidFullName(fullName), 'Full name must be at least 2 characters')
|
|
assertBadRequest(isValidPhoneNumber(phoneNumber), 'Phone number must include a country code, e.g. +60123456789')
|
|
|
|
return {
|
|
username,
|
|
fullName,
|
|
phoneNumber,
|
|
role
|
|
}
|
|
}
|
|
|
|
export function parseUserProfileInput(body: {
|
|
fullName?: string
|
|
phoneNumber?: string
|
|
role?: UserRole
|
|
}) {
|
|
const fullName = normalizeFullName(body.fullName || '')
|
|
const phoneNumber = normalizePhoneNumber(body.phoneNumber || '')
|
|
const role = body.role
|
|
|
|
assertBadRequest(hasValidFullName(fullName), 'Display name must be at least 2 characters')
|
|
assertBadRequest(isValidPhoneNumber(phoneNumber), 'Phone number must include a country code, e.g. +60123456789')
|
|
assertBadRequest(isUserRole(role), 'Role is invalid')
|
|
|
|
return {
|
|
fullName,
|
|
phoneNumber,
|
|
role
|
|
}
|
|
}
|