adding reccurent normaliser and tests
This commit is contained in:
		
							parent
							
								
									bee5fef9ff
								
							
						
					
					
						commit
						ade5508713
					
				|  | @ -74,7 +74,7 @@ export class CreateAdRequest { | ||||||
|   @ValidateNested({ each: true }) |   @ValidateNested({ each: true }) | ||||||
|   @IsNotEmptyObject() |   @IsNotEmptyObject() | ||||||
|   @AutoMap() |   @AutoMap() | ||||||
|   schedule?: ScheduleDTO; |   schedule: ScheduleDTO = {}; | ||||||
| 
 | 
 | ||||||
|   @IsOptional() |   @IsOptional() | ||||||
|   @Type(() => MarginDTO) |   @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 { DefaultParams } from '../types/default-params.type'; | ||||||
| import { AdCreation } from '../dtos/ad.creation'; | import { AdCreation } from '../dtos/ad.creation'; | ||||||
| import { Ad } from '../entities/ad'; | import { Ad } from '../entities/ad'; | ||||||
|  | import { Frequency } from '../types/frequency.enum'; | ||||||
| 
 | 
 | ||||||
| @CommandHandler(CreateAdCommand) | @CommandHandler(CreateAdCommand) | ||||||
| export class CreateAdUseCase { | export class CreateAdUseCase { | ||||||
|  | @ -38,7 +39,6 @@ export class CreateAdUseCase { | ||||||
|     this.setDefaultDistanceMargin(); |     this.setDefaultDistanceMargin(); | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|       console.log(this.ad); |  | ||||||
|       const adCreated: Ad = await this._repository.create(this.ad); |       const adCreated: Ad = await this._repository.create(this.ad); | ||||||
|       this._messager.publish('ad.create', JSON.stringify(adCreated)); |       this._messager.publish('ad.create', JSON.stringify(adCreated)); | ||||||
|       this._messager.publish( |       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 { | import { createMap, forMember, mapFrom, Mapper } from '@automapper/core'; | ||||||
|   condition, |  | ||||||
|   createMap, |  | ||||||
|   forMember, |  | ||||||
|   mapFrom, |  | ||||||
|   Mapper, |  | ||||||
| } from '@automapper/core'; |  | ||||||
| import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; | import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; | ||||||
| import { Injectable } from '@nestjs/common'; | import { Injectable } from '@nestjs/common'; | ||||||
| import { Ad } from '../domain/entities/ad'; | import { Ad } from '../domain/entities/ad'; | ||||||
| import { AdPresenter } from '../adapters/primaries/ad.presenter'; | import { AdPresenter } from '../adapters/primaries/ad.presenter'; | ||||||
| import { CreateAdRequest } from '../domain/dtos/create-ad.request'; | import { CreateAdRequest } from '../domain/dtos/create-ad.request'; | ||||||
| import { AdCreation } from '../domain/dtos/ad.creation'; | import { AdCreation } from '../domain/dtos/ad.creation'; | ||||||
| import { Frequency } from '@prisma/client'; | import { ReccurentNormaliser } from '../domain/entities/ReccurentNormaliser'; | ||||||
| 
 | 
 | ||||||
| @Injectable() | @Injectable() | ||||||
| export class AdProfile extends AutomapperProfile { | export class AdProfile extends AutomapperProfile { | ||||||
|  |   reccurentNormaliser = new ReccurentNormaliser(); | ||||||
|   constructor(@InjectMapper() mapper: Mapper) { |   constructor(@InjectMapper() mapper: Mapper) { | ||||||
|     super(mapper); |     super(mapper); | ||||||
|   } |   } | ||||||
| 
 |  | ||||||
|   override get profile() { |   override get profile() { | ||||||
|     return (mapper) => { |     return (mapper) => { | ||||||
|       createMap(mapper, Ad, AdPresenter); |       createMap(mapper, Ad, AdPresenter); | ||||||
|  | @ -26,6 +20,7 @@ export class AdProfile extends AutomapperProfile { | ||||||
|         mapper, |         mapper, | ||||||
|         CreateAdRequest, |         CreateAdRequest, | ||||||
|         AdCreation, |         AdCreation, | ||||||
|  | 
 | ||||||
|         forMember( |         forMember( | ||||||
|           (destination) => destination.monMargin, |           (destination) => destination.monMargin, | ||||||
|           mapFrom((source) => source.marginDurations.mon), |           mapFrom((source) => source.marginDurations.mon), | ||||||
|  | @ -86,14 +81,58 @@ export class AdProfile extends AutomapperProfile { | ||||||
|           (destination) => destination.addresses.create, |           (destination) => destination.addresses.create, | ||||||
|           mapFrom((source) => source.addresses), |           mapFrom((source) => source.addresses), | ||||||
|         ), |         ), | ||||||
|         //TODO use custom resolver
 |         forMember( | ||||||
|         // forMember(
 |           (destination) => destination.fromDate, | ||||||
|         //   (destination) => destination.fromDate,
 |           mapFrom((source) => | ||||||
|         //   condition(
 |             this.reccurentNormaliser.fromDateResolver(source), | ||||||
|         //     (source) => source.frequency == Frequency.PUNCTUAL,
 |           ), | ||||||
|         //     source.departure,
 |         ), | ||||||
|         //   ),
 |         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, |   passenger: true, | ||||||
|   frequency: Frequency.PUNCTUAL, |   frequency: Frequency.PUNCTUAL, | ||||||
|   departure: new Date('05-22-2023'), |   departure: new Date('05-22-2023'), | ||||||
|  | 
 | ||||||
|   marginDurations: { |   marginDurations: { | ||||||
|     mon: undefined, |     mon: undefined, | ||||||
|     tue: undefined, |     tue: undefined, | ||||||
|  | @ -95,6 +96,7 @@ const newPunctualPassengerAdRequest: CreateAdRequest = { | ||||||
|   }, |   }, | ||||||
|   seatsPassenger: 1, |   seatsPassenger: 1, | ||||||
|   addresses: [mockAddressWithoutPos1, mockAddressWithoutPos2], |   addresses: [mockAddressWithoutPos1, mockAddressWithoutPos2], | ||||||
|  |   schedule: {}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const mockMessager = { | 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