1
This commit is contained in:
55
server-node/src/auth/phoneNumber.ts
Normal file
55
server-node/src/auth/phoneNumber.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import { badRequest } from '../errors.js';
|
||||
|
||||
export type NormalizedPhoneNumber = {
|
||||
countryCode: string;
|
||||
nationalNumber: string;
|
||||
e164: string;
|
||||
maskedNationalNumber: string;
|
||||
};
|
||||
|
||||
function stripPhoneInput(input: string) {
|
||||
return input.replace(/[^\d+]/gu, '').trim();
|
||||
}
|
||||
|
||||
export function maskNationalPhoneNumber(phoneNumber: string) {
|
||||
if (phoneNumber.length < 7) {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
return `${phoneNumber.slice(0, 3)}****${phoneNumber.slice(-4)}`;
|
||||
}
|
||||
|
||||
export function normalizeMainlandChinaPhoneNumber(
|
||||
phoneInput: string,
|
||||
): NormalizedPhoneNumber {
|
||||
const trimmed = stripPhoneInput(phoneInput);
|
||||
if (!trimmed) {
|
||||
throw badRequest('请输入手机号');
|
||||
}
|
||||
|
||||
let nationalNumber = trimmed;
|
||||
if (nationalNumber.startsWith('+86')) {
|
||||
nationalNumber = nationalNumber.slice(3);
|
||||
} else if (nationalNumber.startsWith('86') && nationalNumber.length === 13) {
|
||||
nationalNumber = nationalNumber.slice(2);
|
||||
}
|
||||
|
||||
if (!/^1\d{10}$/u.test(nationalNumber)) {
|
||||
throw badRequest('请输入正确的中国大陆手机号');
|
||||
}
|
||||
|
||||
return {
|
||||
countryCode: '86',
|
||||
nationalNumber,
|
||||
e164: `+86${nationalNumber}`,
|
||||
maskedNationalNumber: maskNationalPhoneNumber(nationalNumber),
|
||||
};
|
||||
}
|
||||
|
||||
export function validateSmsVerifyCode(verifyCode: string) {
|
||||
const normalizedVerifyCode = verifyCode.trim();
|
||||
if (!/^[A-Za-z0-9]{4,8}$/u.test(normalizedVerifyCode)) {
|
||||
throw badRequest('请输入正确的验证码');
|
||||
}
|
||||
return normalizedVerifyCode;
|
||||
}
|
||||
Reference in New Issue
Block a user