1
0
forked from Yara724/api
Files
yara724-api/src/helpers/iran-mobile.ts

72 lines
2.3 KiB
TypeScript

import { FilterQuery } from "mongoose";
import { UserModel } from "src/users/entities/schema/user.schema";
/** Canonical Iranian mobile: leading 0 + 10 digits (e.g. 09123456789). */
export function normalizeIranMobile(phone?: string): string | undefined {
if (!phone) return undefined;
const digits = String(phone).replace(/\D/g, "");
if (!digits) return undefined;
if (digits.startsWith("0098")) return `0${digits.slice(4)}`;
if (digits.startsWith("98") && digits.length === 12) {
return `0${digits.slice(2)}`;
}
if (digits.length === 10 && digits.startsWith("9")) return `0${digits}`;
if (digits.length === 11 && digits.startsWith("0")) return digits;
return digits;
}
/** Variants that may exist on legacy user rows (username/mobile). */
export function iranMobileLookupVariants(phone?: string): string[] {
const raw = phone?.trim();
const canonical = normalizeIranMobile(raw);
const variants = new Set<string>();
if (raw) variants.add(raw);
if (canonical) {
variants.add(canonical);
if (canonical.startsWith("0") && canonical.length === 11) {
variants.add(canonical.slice(1));
variants.add(`98${canonical.slice(1)}`);
variants.add(`0098${canonical.slice(1)}`);
}
}
return Array.from(variants).filter(Boolean);
}
export function buildUserLookupByPhone(
phone: string,
): FilterQuery<UserModel> {
const variants = iranMobileLookupVariants(phone);
if (variants.length === 0) {
return { username: phone };
}
return {
$or: variants.flatMap((v) => [{ username: v }, { mobile: v }]),
};
}
/** True when a blame party person row belongs to the authenticated user. */
export function partyPersonMatchesUser(
person:
| { userId?: unknown; phoneNumber?: string }
| null
| undefined,
user: { sub?: string; username?: string } | null | undefined,
): boolean {
if (!person || !user) return false;
if (
person.userId != null &&
user.sub &&
String(person.userId) === String(user.sub)
) {
return true;
}
if (!person.phoneNumber || !user.username) return false;
const stored =
normalizeIranMobile(person.phoneNumber) ?? person.phoneNumber;
const variants = iranMobileLookupVariants(user.username);
return variants.some(
(v) => v === stored || v === person.phoneNumber,
);
}