/* eslint-disable no-console */ import { CheckRulesOutput } from '../interfaces/check-rules.output'; import { TicketDto } from '../interfaces/ticket/ticket.dto'; import { ConfigTicket } from '../rules/ticket/config-ticket'; import { DateRangeIsValid } from '../rules/ticket/date-range-is-valid'; import { EnabledTicket } from '../rules/ticket/enabled-ticket'; import { IsPhotoRequired } from '../rules/ticket/is-photo-required'; import { PassengerCount } from '../rules/ticket/passenger-count'; import { UserAge } from '../rules/ticket/user-age'; import { UserId } from '../rules/ticket/user-id'; import { UserProfiles } from '../rules/ticket/user-profiles'; import { ValidDate } from '../rules/ticket/valid-date'; import { ValidationCount } from '../rules/ticket/validation-count'; import { ValidationDelay } from '../rules/ticket/validation-delay'; const isTicketValidRules = [ EnabledTicket, ValidDate, PassengerCount, ValidationCount, UserAge, UserProfiles, IsPhotoRequired, ]; const canValidateTicketRules = [ ...isTicketValidRules, ValidationDelay, ConfigTicket, DateRangeIsValid, ]; export function isValidWithErrors(ticket: TicketDto): CheckRulesOutput { return checkRulesWithErrors(ticket, isTicketValidRules); } export function canValidate(ticket: TicketDto): boolean { const canValidate = checkRulesWithErrors(ticket, canValidateTicketRules); if (canValidate.isValid && userIsRequired(ticket)) { if (!ticket?.userId) { return false; } return canOwnerValidateTicket(ticket, ticket?.userId); } return canValidate.isValid; } export function canValidateWithErrors(ticket: TicketDto, withLogs = true): string[] { return checkRulesWithErrors(ticket, canValidateTicketRules, withLogs).errors; } export function checkRulesWithErrors( ticket: TicketDto, rules: (typeof EnabledTicket)[], withLogs = true, ): CheckRulesOutput { const errors: string[] = []; let validity: boolean = true; rules.forEach((ticketRule) => { const rule = new ticketRule(); const isValid = rule.validate(ticket); if (!isValid) { errors.push(rule.name); validity = false; if (withLogs) { console.error(`Ticket failed at rule ${rule.name}`); } } }); return { errors, isValid: validity, }; } function canOwnerValidateTicket(ticket: TicketDto, userId: string): boolean { const rules = [new UserId().validate(ticket, userId)]; return rules.every(Boolean); } function userIsRequired(ticket: TicketDto): boolean { return ( (ticket.profiles && ticket.profiles.length > 0) || (ticket.ageFrom && ticket.ageFrom > 0) || (ticket.ageUntil && ticket.ageUntil !== -1) ); }