adding reccurent normaliser and tests
This commit is contained in:
		
							parent
							
								
									bee5fef9ff
								
							
						
					
					
						commit
						ade5508713
					
				|  | @ -74,7 +74,7 @@ export class CreateAdRequest { | |||
|   @ValidateNested({ each: true }) | ||||
|   @IsNotEmptyObject() | ||||
|   @AutoMap() | ||||
|   schedule?: ScheduleDTO; | ||||
|   schedule: ScheduleDTO = {}; | ||||
| 
 | ||||
|   @IsOptional() | ||||
|   @Type(() => MarginDTO) | ||||
|  |  | |||
|  | @ -0,0 +1,97 @@ | |||
| import { CreateAdRequest } from '../dtos/create-ad.request'; | ||||
| 
 | ||||
| import { Frequency } from '../types/frequency.enum'; | ||||
| 
 | ||||
| export class ReccurentNormaliser { | ||||
|   constructor() {} | ||||
| 
 | ||||
|   fromDateResolver(createAdRequest: CreateAdRequest): Date { | ||||
|     if (createAdRequest.frequency === Frequency.PUNCTUAL) | ||||
|       return createAdRequest.departure; | ||||
|     return createAdRequest.fromDate; | ||||
|   } | ||||
|   toDateResolver(createAdRequest: CreateAdRequest): Date { | ||||
|     if (createAdRequest.frequency === Frequency.PUNCTUAL) | ||||
|       return createAdRequest.departure; | ||||
|     return createAdRequest.toDate; | ||||
|   } | ||||
|   scheduleSunResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 0 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.sun; | ||||
|   } | ||||
|   scheduleMonResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 1 | ||||
|     ) { | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     } | ||||
| 
 | ||||
|     return createAdRequest.schedule.mon; | ||||
|   } | ||||
|   scheduleTueResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 2 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.tue; | ||||
|   } | ||||
|   scheduleWedResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 3 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.wed; | ||||
|   } | ||||
|   scheduleThuResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 4 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.thu; | ||||
|   } | ||||
|   scheduleFriResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 5 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.fri; | ||||
|   } | ||||
|   scheduleSatResolver(createAdRequest: CreateAdRequest): string { | ||||
|     if ( | ||||
|       Object.keys(createAdRequest.schedule).length === 0 && | ||||
|       createAdRequest.frequency == Frequency.PUNCTUAL && | ||||
|       createAdRequest.departure.getDay() === 6 | ||||
|     ) | ||||
|       return `${('0' + createAdRequest.departure.getHours()).slice(-2)}:${( | ||||
|         '0' + createAdRequest.departure.getMinutes() | ||||
|       ).slice(-2)}`;
 | ||||
|     return createAdRequest.schedule.sat; | ||||
|   } | ||||
| } | ||||
|  | @ -11,6 +11,7 @@ import { IProvideParams } from '../interfaces/param-provider.interface'; | |||
| import { DefaultParams } from '../types/default-params.type'; | ||||
| import { AdCreation } from '../dtos/ad.creation'; | ||||
| import { Ad } from '../entities/ad'; | ||||
| import { Frequency } from '../types/frequency.enum'; | ||||
| 
 | ||||
| @CommandHandler(CreateAdCommand) | ||||
| export class CreateAdUseCase { | ||||
|  | @ -38,7 +39,6 @@ export class CreateAdUseCase { | |||
|     this.setDefaultDistanceMargin(); | ||||
| 
 | ||||
|     try { | ||||
|       console.log(this.ad); | ||||
|       const adCreated: Ad = await this._repository.create(this.ad); | ||||
|       this._messager.publish('ad.create', JSON.stringify(adCreated)); | ||||
|       this._messager.publish( | ||||
|  | @ -105,5 +105,8 @@ export class CreateAdUseCase { | |||
|       } | ||||
|     } | ||||
|   } | ||||
|   TransformPunctualToReccurent(): void {} | ||||
|   TransformPunctualToReccurent(): void { | ||||
|     if (this.ad.frequency === Frequency.PUNCTUAL) { | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,24 +1,18 @@ | |||
| import { | ||||
|   condition, | ||||
|   createMap, | ||||
|   forMember, | ||||
|   mapFrom, | ||||
|   Mapper, | ||||
| } from '@automapper/core'; | ||||
| import { createMap, forMember, mapFrom, Mapper } from '@automapper/core'; | ||||
| import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; | ||||
| import { Injectable } from '@nestjs/common'; | ||||
| import { Ad } from '../domain/entities/ad'; | ||||
| import { AdPresenter } from '../adapters/primaries/ad.presenter'; | ||||
| import { CreateAdRequest } from '../domain/dtos/create-ad.request'; | ||||
| import { AdCreation } from '../domain/dtos/ad.creation'; | ||||
| import { Frequency } from '@prisma/client'; | ||||
| import { ReccurentNormaliser } from '../domain/entities/ReccurentNormaliser'; | ||||
| 
 | ||||
| @Injectable() | ||||
| export class AdProfile extends AutomapperProfile { | ||||
|   reccurentNormaliser = new ReccurentNormaliser(); | ||||
|   constructor(@InjectMapper() mapper: Mapper) { | ||||
|     super(mapper); | ||||
|   } | ||||
| 
 | ||||
|   override get profile() { | ||||
|     return (mapper) => { | ||||
|       createMap(mapper, Ad, AdPresenter); | ||||
|  | @ -26,6 +20,7 @@ export class AdProfile extends AutomapperProfile { | |||
|         mapper, | ||||
|         CreateAdRequest, | ||||
|         AdCreation, | ||||
| 
 | ||||
|         forMember( | ||||
|           (destination) => destination.monMargin, | ||||
|           mapFrom((source) => source.marginDurations.mon), | ||||
|  | @ -86,14 +81,58 @@ export class AdProfile extends AutomapperProfile { | |||
|           (destination) => destination.addresses.create, | ||||
|           mapFrom((source) => source.addresses), | ||||
|         ), | ||||
|         //TODO use custom resolver
 | ||||
|         // forMember(
 | ||||
|         //   (destination) => destination.fromDate,
 | ||||
|         //   condition(
 | ||||
|         //     (source) => source.frequency == Frequency.PUNCTUAL,
 | ||||
|         //     source.departure,
 | ||||
|         //   ),
 | ||||
|         // ),
 | ||||
|         forMember( | ||||
|           (destination) => destination.fromDate, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.fromDateResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.toDate, | ||||
|           mapFrom((source) => this.reccurentNormaliser.toDateResolver(source)), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.monTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleMonResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.tueTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleTueResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.wedTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleWedResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.thuTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleThuResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.friTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleFriResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.satTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleSatResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|         forMember( | ||||
|           (destination) => destination.sunTime, | ||||
|           mapFrom((source) => | ||||
|             this.reccurentNormaliser.scheduleSunResolver(source), | ||||
|           ), | ||||
|         ), | ||||
|       ); | ||||
|     }; | ||||
|   } | ||||
|  |  | |||
|  | @ -84,6 +84,7 @@ const newPunctualPassengerAdRequest: CreateAdRequest = { | |||
|   passenger: true, | ||||
|   frequency: Frequency.PUNCTUAL, | ||||
|   departure: new Date('05-22-2023'), | ||||
| 
 | ||||
|   marginDurations: { | ||||
|     mon: undefined, | ||||
|     tue: undefined, | ||||
|  | @ -95,6 +96,7 @@ const newPunctualPassengerAdRequest: CreateAdRequest = { | |||
|   }, | ||||
|   seatsPassenger: 1, | ||||
|   addresses: [mockAddressWithoutPos1, mockAddressWithoutPos2], | ||||
|   schedule: {}, | ||||
| }; | ||||
| 
 | ||||
| const mockMessager = { | ||||
|  |  | |||
|  | @ -0,0 +1,92 @@ | |||
| import { CreateAdRequest } from '../../domain/dtos/create-ad.request'; | ||||
| import { ScheduleDTO } from '../../domain/dtos/create.schedule.dto'; | ||||
| import { ReccurentNormaliser } from '../../domain/entities/ReccurentNormaliser'; | ||||
| import { Frequency } from '../../domain/types/frequency.enum'; | ||||
| describe('reccurent normalizer transformer for punctual ad ', () => { | ||||
|   const reccurentNormaliser = new ReccurentNormaliser(); | ||||
|   it('should transform punctual ad into reccurent ad ', () => { | ||||
|     const punctualAd: CreateAdRequest = { | ||||
|       userUuid: '', | ||||
|       frequency: Frequency.PUNCTUAL, | ||||
|       departure: new Date('05-03-2023 12:39:39 '), | ||||
|       schedule: {} as ScheduleDTO, | ||||
|       addresses: [], | ||||
|     }; | ||||
|     expect(reccurentNormaliser.fromDateResolver(punctualAd)).toBe( | ||||
|       punctualAd.departure, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.toDateResolver(punctualAd)).toBe( | ||||
|       punctualAd.departure, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleMonResolver(punctualAd)).toBeUndefined(); | ||||
|     expect(reccurentNormaliser.scheduleTueResolver(punctualAd)).toBeUndefined(); | ||||
|     expect(reccurentNormaliser.scheduleWedResolver(punctualAd)).toBe('12:39'); | ||||
|     expect(reccurentNormaliser.scheduleThuResolver(punctualAd)).toBeUndefined(); | ||||
|     expect(reccurentNormaliser.scheduleFriResolver(punctualAd)).toBeUndefined(); | ||||
|     expect(reccurentNormaliser.scheduleSatResolver(punctualAd)).toBeUndefined(); | ||||
|     expect(reccurentNormaliser.scheduleSunResolver(punctualAd)).toBeUndefined(); | ||||
|   }); | ||||
|   it('should leave reccurent ad as is', () => { | ||||
|     const reccurentAd: CreateAdRequest = { | ||||
|       userUuid: '', | ||||
|       frequency: Frequency.RECURRENT, | ||||
|       schedule: { | ||||
|         mon: '08:30', | ||||
|         tue: '08:30', | ||||
|         wed: '09:00', | ||||
|         fri: '09:00', | ||||
|       }, | ||||
|       addresses: [], | ||||
|     }; | ||||
|     expect(reccurentNormaliser.fromDateResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.departure, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.toDateResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.departure, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleMonResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.mon, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleTueResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.tue, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleWedResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.wed, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleThuResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.thu, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleFriResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.fri, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleSatResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.sat, | ||||
|     ); | ||||
|     expect(reccurentNormaliser.scheduleSunResolver(reccurentAd)).toBe( | ||||
|       reccurentAd.schedule.sun, | ||||
|     ); | ||||
|   }); | ||||
|   it('should pass for each day of the week of a deprarture ', () => { | ||||
|     const punctualAd: CreateAdRequest = { | ||||
|       userUuid: '', | ||||
|       frequency: Frequency.PUNCTUAL, | ||||
|       departure: undefined, | ||||
|       schedule: {} as ScheduleDTO, | ||||
|       addresses: [], | ||||
|     }; | ||||
|     punctualAd.departure = new Date('05-01-2023 '); | ||||
|     expect(reccurentNormaliser.scheduleMonResolver(punctualAd)).toBe('00:00'); | ||||
|     punctualAd.departure = new Date('05-02-2023 06:32:45'); | ||||
|     expect(reccurentNormaliser.scheduleTueResolver(punctualAd)).toBe('06:32'); | ||||
|     punctualAd.departure = new Date('05-03-2023 10:21'); | ||||
|     expect(reccurentNormaliser.scheduleWedResolver(punctualAd)).toBe('10:21'); | ||||
|     punctualAd.departure = new Date('05-04-2023 11:06:00'); | ||||
|     expect(reccurentNormaliser.scheduleThuResolver(punctualAd)).toBe('11:06'); | ||||
|     punctualAd.departure = new Date('05-05-2023 05:20'); | ||||
|     expect(reccurentNormaliser.scheduleFriResolver(punctualAd)).toBe('05:20'); | ||||
|     punctualAd.departure = new Date('05-06-2023'); | ||||
|     expect(reccurentNormaliser.scheduleSatResolver(punctualAd)).toBe('00:00'); | ||||
|     punctualAd.departure = new Date('05-07-2023'); | ||||
|     expect(reccurentNormaliser.scheduleSunResolver(punctualAd)).toBe('00:00'); | ||||
|   }); | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue