UNPKG

iranian-nestjs-validator

Version:

35 lines (30 loc) 1.25 kB
import { registerDecorator, ValidationOptions } from 'class-validator'; export function IsIranianCardNumber(validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ name: 'isIranianCardNumber', target: object.constructor, propertyName, options: validationOptions, validator: { validate(cardNumber: any) { // اطمینان از اینکه ورودی از نوع رشته است if (typeof cardNumber !== 'string') return false; // بررسی طول کارت if (!/^\d{16}$/.test(cardNumber)) return false; const digits = cardNumber.split('').map(Number); // تبدیل به آرایه از اعداد const sum = digits .slice(0, 15) .map((d, i) => { const p = d * ((i % 2 === 0) ? 2 : 1); return p > 9 ? p - 9 : p; }) .reduce((a, b) => a + b, 0); const checkDigit = (10 - (sum % 10)) % 10; return checkDigit === digits[15]; }, defaultMessage: () => 'شماره کارت نامعتبر است.', }, }); }; }