import { IValidationRule } from '../interfaces/validationRule'; import { RequiredValidationRule } from '../validationRules/requiredValidationRule'; import { RealTimeServerValidationRule } from '../validationRules/serverValidationRule'; import { MinLenValidationRule } from '../validationRules/minLenValidationRule'; import { MaxLenValidationRule } from '../validationRules/maxLenValidationRule'; import { PhoneValidationRule } from '../validationRules/phoneValidationRule'; import { EmailValidationRule } from '../validationRules/emailValidationRule'; import { GuidValidationRule } from '../validationRules/guidValidationRule'; import { IRulesCustomizer } from '../interfaces/rulesCustomizer'; import { ValidationUtilities } from '../utils/validationUtilities'; import { ClientValidationRule } from '../validationRules/clientValidationRule'; /** * helps to define validation rules for models. */ export class RulesCustomizer implements IRulesCustomizer { /** * inits rules customizer. * * @param rulesMap */ constructor( private rulesMap: Map = new Map(), private ruleSequense: Array> = new Array>()) { } /** * makes field required. * * @param keyFunc * @param message */ public required(func: (obj: T) => void, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new RequiredValidationRule(key, message); this.addRule(key, rule); } /** * max length valudation rule * * @param keyFunc * @param value * @param message */ public maxlen(func: (obj: T) => void, value: number, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new MaxLenValidationRule(key, value, message); this.addRule(key, rule); } /** * min length validation rule * * @param keyFunc * @param value * @param message */ public minlen(func: (obj: T) => void, value: number, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new MinLenValidationRule(key, value, message); this.addRule(key, rule); } /** * email validation rule */ public email(func: (obj: T) => void, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new EmailValidationRule(key, message); this.addRule(key, rule); } /** * phone validation rule */ public phone(func: (obj: T) => void, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new PhoneValidationRule(key, message); this.addRule(key, rule); } /** * guid validation rule */ public guid(func: (obj: T) => void, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new GuidValidationRule(key, message); this.addRule(key, rule); } /** * sets real time validation of the field. * * @param keyFunc * @param validationCall * @param message */ public serverValidation(func: (obj: T) => void, validationCall: (entity: any, value: any) => Promise, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new RealTimeServerValidationRule(key, validationCall, message); this.addRule(key, rule); } /** * client custom validation rule. */ public clientValidation(func: (obj: T) => void, validationCall: (entity: any, value: any) => boolean, message: string): void { let key: string = ValidationUtilities.fromExpression(func); let rule: IValidationRule = new ClientValidationRule(key, validationCall, message); this.addRule(key, rule); } /** * adds validation rule to the dictionary. * * @param key * @param rule */ public addRule(key: string, rule: IValidationRule): void { if (!this.rulesMap[key]) { this.rulesMap[key] = []; } this.rulesMap[key].push(rule); let seqlIndex: number = this.rulesMap[key].length - 1; if (!this.ruleSequense[seqlIndex]) { this.ruleSequense[seqlIndex] = []; } this.ruleSequense[seqlIndex].push(rule); } /** * gets the sequence rules for property. */ public seqRules(key: string): Array> { let seqRules: Array> = new Array>(); let rules: IValidationRule[] = this.rulesMap[key]; if (rules && rules.length) { for (let i: number = 0; i < this.rules.length; i++) { seqRules[i] = []; seqRules[i].push(rules[i]); } } return seqRules; } /** * gets all validation rules. * * @returns {Map} */ public get rulesDictionary(): Map { return this.rulesMap; } /** * get rules sequence. * * @returns {Array>} */ public get rules(): Array> { return this.ruleSequense; } }