adding punctual or reccurent validator
This commit is contained in:
parent
e2e3bd4407
commit
6839e81cd6
|
@ -21,8 +21,8 @@
|
||||||
"test:unit": "jest --testPathPattern 'tests/unit/' --verbose",
|
"test:unit": "jest --testPathPattern 'tests/unit/' --verbose",
|
||||||
"test:unit:watch": "jest --testPathPattern 'tests/unit/' --verbose --watch",
|
"test:unit:watch": "jest --testPathPattern 'tests/unit/' --verbose --watch",
|
||||||
"test:unit:ci": "jest --testPathPattern 'tests/unit/' --coverage",
|
"test:unit:ci": "jest --testPathPattern 'tests/unit/' --coverage",
|
||||||
"test:integration": "npm run migrate:test && dotenv -e .env.test -- jest --testPathPattern 'tests/integration/' --verbose --watch",
|
"test:integration": "npm run migrate:test && dotenv -e .env.test -- jest --testPathPattern 'tests/integration/' --verbose",
|
||||||
"test:integration:watch": "npm run migrate:test && dotenv -e .env.test -- jest --testPathPattern 'tests/integration/' --verbose",
|
"test:integration:watch": "npm run migrate:test && dotenv -e .env.test -- jest --testPathPattern 'tests/integration/' --verbose --watch",
|
||||||
"test:integration:ci": "npm run migrate:test:ci && dotenv -e ci/.env.ci -- jest --testPathPattern 'tests/integration/'",
|
"test:integration:ci": "npm run migrate:test:ci && dotenv -e ci/.env.ci -- jest --testPathPattern 'tests/integration/'",
|
||||||
"test:cov": "jest --testPathPattern 'tests/unit/' --coverage",
|
"test:cov": "jest --testPathPattern 'tests/unit/' --coverage",
|
||||||
"test:e2e": "jest --config ./test/jest-e2e.json",
|
"test:e2e": "jest --config ./test/jest-e2e.json",
|
||||||
|
|
|
@ -41,6 +41,8 @@ export class AdController {
|
||||||
|
|
||||||
@GrpcMethod('AdsService', 'Create')
|
@GrpcMethod('AdsService', 'Create')
|
||||||
async createAd(data: CreateAdRequest): Promise<AdPresenter> {
|
async createAd(data: CreateAdRequest): Promise<AdPresenter> {
|
||||||
|
console.log('controler');
|
||||||
|
console.log(data);
|
||||||
try {
|
try {
|
||||||
const ad = await this._commandBus.execute(new CreateAdCommand(data));
|
const ad = await this._commandBus.execute(new CreateAdCommand(data));
|
||||||
return this._mapper.map(ad, Ad, AdPresenter);
|
return this._mapper.map(ad, Ad, AdPresenter);
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { AddressRequestDTO } from './create.address.request';
|
||||||
import { HasProperPassengerSeats } from './validators/has-passenger-seats.validator';
|
import { HasProperPassengerSeats } from './validators/has-passenger-seats.validator';
|
||||||
import { HasProperDriverSeats } from './validators/has-driver-seats.validator';
|
import { HasProperDriverSeats } from './validators/has-driver-seats.validator';
|
||||||
import { HasProperPositionIndexes } from './validators/address-position.validator';
|
import { HasProperPositionIndexes } from './validators/address-position.validator';
|
||||||
|
import { IsPunctualOrRecurrent } from './validators/is-punctual-or-recurrent.validator';
|
||||||
|
|
||||||
export class CreateAdRequest {
|
export class CreateAdRequest {
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
|
@ -48,28 +49,30 @@ export class CreateAdRequest {
|
||||||
@AutoMap()
|
@AutoMap()
|
||||||
frequency: Frequency;
|
frequency: Frequency;
|
||||||
|
|
||||||
@ValidateIf((ad) => ad.frequency === 'PUNCTUAL')
|
@IsOptional()
|
||||||
|
@IsPunctualOrRecurrent()
|
||||||
@Type(() => Date)
|
@Type(() => Date)
|
||||||
@IsDate()
|
@IsDate()
|
||||||
@AutoMap()
|
@AutoMap()
|
||||||
departure?: Date;
|
departure?: Date;
|
||||||
|
|
||||||
@ValidateIf((ad) => ad.frequency === 'RECURRENT')
|
@IsOptional()
|
||||||
|
@IsPunctualOrRecurrent()
|
||||||
@Type(() => Date)
|
@Type(() => Date)
|
||||||
@IsDate()
|
@IsDate()
|
||||||
@AutoMap()
|
@AutoMap()
|
||||||
fromDate?: Date;
|
fromDate?: Date;
|
||||||
|
|
||||||
@ValidateIf((ad) => ad.frequency === 'RECURRENT')
|
@IsOptional()
|
||||||
|
@IsPunctualOrRecurrent()
|
||||||
@Type(() => Date)
|
@Type(() => Date)
|
||||||
@IsDate()
|
@IsDate()
|
||||||
@AutoMap()
|
@AutoMap()
|
||||||
toDate?: Date;
|
toDate?: Date;
|
||||||
|
|
||||||
@ValidateIf((ad) => ad.frequency === 'RECURRENT')
|
|
||||||
@Type(() => ScheduleDTO)
|
@Type(() => ScheduleDTO)
|
||||||
|
@IsPunctualOrRecurrent()
|
||||||
@ValidateNested({ each: true })
|
@ValidateNested({ each: true })
|
||||||
@IsNotEmptyObject()
|
|
||||||
@AutoMap()
|
@AutoMap()
|
||||||
schedule: ScheduleDTO = {};
|
schedule: ScheduleDTO = {};
|
||||||
|
|
||||||
|
|
|
@ -4,35 +4,53 @@ import {
|
||||||
ValidationOptions,
|
ValidationOptions,
|
||||||
buildMessage,
|
buildMessage,
|
||||||
} from 'class-validator';
|
} from 'class-validator';
|
||||||
|
import { Frequency } from '../../types/frequency.enum';
|
||||||
|
|
||||||
function isPunctual(): boolean {
|
function isPunctual(args: ValidationArguments): boolean {
|
||||||
throw new Error('Function not implemented.');
|
if (
|
||||||
|
args.object['frequency'] === Frequency.PUNCTUAL &&
|
||||||
|
args.object['departure'] instanceof Date &&
|
||||||
|
!Object.keys(args.object['schedule']).length
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isRecurrent(): boolean {
|
function isRecurrent(args: ValidationArguments): boolean {
|
||||||
throw new Error('Function not implemented.');
|
if (
|
||||||
|
args.object['frequency'] === Frequency.RECURRENT &&
|
||||||
|
args.object['fromDate'] instanceof Date &&
|
||||||
|
args.object['toDate'] instanceof Date &&
|
||||||
|
Object.keys(args.object['schedule']).length
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isPunctualOrRecurrent = (): boolean => {
|
export const isPunctualOrRecurrent = (args: ValidationArguments): boolean => {
|
||||||
return isPunctual() || isRecurrent();
|
console.log('validator ');
|
||||||
|
console.log(args.object);
|
||||||
|
return isPunctual(args) || isRecurrent(args);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* istanbul ignore next */
|
/* istanbul ignore next */
|
||||||
// export function IsPunctualOrRecurrent(
|
export function IsPunctualOrRecurrent(
|
||||||
// validationOptions?: ValidationOptions,
|
validationOptions?: ValidationOptions,
|
||||||
// ): PropertyDecorator {
|
): PropertyDecorator {
|
||||||
// return ValidateBy(
|
return ValidateBy(
|
||||||
// {
|
{
|
||||||
// name: '',
|
name: '',
|
||||||
// constraints: [],
|
constraints: [],
|
||||||
// validator: {
|
validator: {
|
||||||
// validate: (value, args: ValidationArguments): boolean =>
|
validate: (value, args: ValidationArguments): boolean =>
|
||||||
// isPunctualOrRecurrent(value, args),
|
isPunctualOrRecurrent(args),
|
||||||
// defaultMessage: buildMessage(
|
defaultMessage: buildMessage(
|
||||||
// () => `driver and driver seats are not correct`,
|
() =>
|
||||||
// validationOptions,
|
`the departure, from date, to date and schedule must be properly set on reccurent or punctual ad `,
|
||||||
// ),
|
validationOptions,
|
||||||
// },
|
),
|
||||||
// },
|
},
|
||||||
// validationOptions,
|
},
|
||||||
// );
|
validationOptions,
|
||||||
// }
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -3,11 +3,7 @@ import { CreateAdRequest } from '../dtos/create-ad.request';
|
||||||
import { Frequency } from '../types/frequency.enum';
|
import { Frequency } from '../types/frequency.enum';
|
||||||
|
|
||||||
export class RecurrentNormaliser {
|
export class RecurrentNormaliser {
|
||||||
constructor() {
|
|
||||||
console.log('resolver call');
|
|
||||||
}
|
|
||||||
fromDateResolver(createAdRequest: CreateAdRequest): Date {
|
fromDateResolver(createAdRequest: CreateAdRequest): Date {
|
||||||
console.log('resolver call');
|
|
||||||
if (createAdRequest.frequency === Frequency.PUNCTUAL)
|
if (createAdRequest.frequency === Frequency.PUNCTUAL)
|
||||||
return createAdRequest.departure;
|
return createAdRequest.departure;
|
||||||
return createAdRequest.fromDate;
|
return createAdRequest.fromDate;
|
||||||
|
|
|
@ -27,8 +27,6 @@ export class CreateAdUseCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
async execute(command: CreateAdCommand): Promise<Ad> {
|
async execute(command: CreateAdCommand): Promise<Ad> {
|
||||||
console.log('usecase');
|
|
||||||
console.log(command.createAdRequest);
|
|
||||||
this.ad = this._mapper.map(
|
this.ad = this._mapper.map(
|
||||||
command.createAdRequest,
|
command.createAdRequest,
|
||||||
CreateAdRequest,
|
CreateAdRequest,
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
import { isPunctualOrRecurrent } from '../../../domain/dtos/validators/is-punctual-or-recurrent.validator';
|
||||||
|
import { Frequency } from '../../../domain/types/frequency.enum';
|
||||||
|
|
||||||
|
describe('punctual or reccurent validators', () => {
|
||||||
|
describe('punctual case ', () => {
|
||||||
|
describe('valid cases', () => {
|
||||||
|
it('should validate with valid departure and empty schedule ', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.PUNCTUAL,
|
||||||
|
departure: new Date('01-02-2023'),
|
||||||
|
schedule: {},
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('invalid cases ', () => {
|
||||||
|
it('should not validate with invalid departure and empty schedule and margin', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.PUNCTUAL,
|
||||||
|
fromDate: new Date('20-10-2023'),
|
||||||
|
toDate: new Date('30-10-2023'),
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeFalsy();
|
||||||
|
});
|
||||||
|
it('should not validate with no empty schedule', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.PUNCTUAL,
|
||||||
|
departure: new Date('01-02-2023'),
|
||||||
|
schedule: {
|
||||||
|
mon: '08:30',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('reccurent case ', () => {
|
||||||
|
describe('valid cases', () => {
|
||||||
|
it('should validate with valid from date, to date and non empty schedule ', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.RECURRENT,
|
||||||
|
fromDate: new Date('01-15-2023'),
|
||||||
|
toDate: new Date('06-30-2023'),
|
||||||
|
schedule: {
|
||||||
|
mon: '08:30',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('invalid cases ', () => {
|
||||||
|
it('should not validate with empty schedule ', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.RECURRENT,
|
||||||
|
fromDate: new Date('01-15-2023'),
|
||||||
|
toDate: new Date('06-30-2023'),
|
||||||
|
schedule: {},
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeFalsy();
|
||||||
|
});
|
||||||
|
it('should not validate with invalid from date to date and empty schedule and margin', () => {
|
||||||
|
expect(
|
||||||
|
isPunctualOrRecurrent({
|
||||||
|
value: undefined,
|
||||||
|
constraints: [],
|
||||||
|
targetName: '',
|
||||||
|
object: {
|
||||||
|
frequency: Frequency.RECURRENT,
|
||||||
|
departure: new Date('20-10-2023'),
|
||||||
|
toDate: new Date('30-10-2023'),
|
||||||
|
},
|
||||||
|
property: '',
|
||||||
|
}),
|
||||||
|
).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -87,7 +87,6 @@ export abstract class PrismaRepository<T> implements IRepository<T> {
|
||||||
});
|
});
|
||||||
return res;
|
return res;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
|
||||||
if (e instanceof Prisma.PrismaClientKnownRequestError) {
|
if (e instanceof Prisma.PrismaClientKnownRequestError) {
|
||||||
throw new DatabaseException(
|
throw new DatabaseException(
|
||||||
Prisma.PrismaClientKnownRequestError.name,
|
Prisma.PrismaClientKnownRequestError.name,
|
||||||
|
|
Loading…
Reference in New Issue