iranian-nestjs-validator
Version:
35 lines (30 loc) • 1.25 kB
text/typescript
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: () => 'شماره کارت نامعتبر است.',
},
});
};
}