add mode to match wip
This commit is contained in:
		
							parent
							
								
									e312a6c712
								
							
						
					
					
						commit
						a6f7476599
					
				| 
						 | 
					@ -5,7 +5,7 @@ import { ConfigModule } from '@nestjs/config';
 | 
				
			||||||
import { ConfigurationModule } from './modules/configuration/configuration.module';
 | 
					import { ConfigurationModule } from './modules/configuration/configuration.module';
 | 
				
			||||||
import { HealthModule } from './modules/health/health.module';
 | 
					import { HealthModule } from './modules/health/health.module';
 | 
				
			||||||
import { MatcherModule } from './modules/matcher/matcher.module';
 | 
					import { MatcherModule } from './modules/matcher/matcher.module';
 | 
				
			||||||
import { AdModule } from './modules/ad/ad.modules';
 | 
					import { AdModule } from './modules/ad/ad.module';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Module({
 | 
					@Module({
 | 
				
			||||||
  imports: [
 | 
					  imports: [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,37 +43,37 @@ export class CreateAdRequest {
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  monTime: string | null;
 | 
					  monTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  tueTime: string | null;
 | 
					  tueTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  wedTime: string | null;
 | 
					  wedTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  thuTime!: string | null;
 | 
					  thuTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  friTime: string | null;
 | 
					  friTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  satTime: string | null;
 | 
					  satTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  sunTime: string | null;
 | 
					  sunTime?: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsNumber()
 | 
					  @IsNumber()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ export class CreateAdRequest {
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsNumber()
 | 
					  @IsNumber()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  seatsUsed: number;
 | 
					  seatsUsed?: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsString()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
| 
						 | 
					@ -137,5 +137,5 @@ export class CreateAdRequest {
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  updatedAt: string;
 | 
					  updatedAt: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  timezone: string;
 | 
					  timezone?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,13 +4,16 @@ export class TimeConverter {
 | 
				
			||||||
  static toUtcDatetime = (
 | 
					  static toUtcDatetime = (
 | 
				
			||||||
    date: string,
 | 
					    date: string,
 | 
				
			||||||
    time: string,
 | 
					    time: string,
 | 
				
			||||||
    ianaTimezone: string,
 | 
					    timezone: string,
 | 
				
			||||||
  ): Date =>
 | 
					  ): Date => {
 | 
				
			||||||
    date && time
 | 
					    try {
 | 
				
			||||||
      ? new Date(
 | 
					      return new Date(
 | 
				
			||||||
          new DateTime(`${date}T${time}:00`, TimeZone.zone(ianaTimezone, false))
 | 
					        new DateTime(`${date}T${time}:00`, TimeZone.zone(timezone, false))
 | 
				
			||||||
            .convert(TimeZone.zone('UTC'))
 | 
					          .convert(TimeZone.zone('UTC'))
 | 
				
			||||||
            .toIsoString(),
 | 
					          .toIsoString(),
 | 
				
			||||||
        )
 | 
					      );
 | 
				
			||||||
      : undefined;
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      return undefined;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,72 +55,44 @@ export class AdProfile extends AutomapperProfile {
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.monTime,
 | 
					          (dest) => dest.monTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ monTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.monTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.tueTime,
 | 
					          (dest) => dest.tueTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ tueTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.tueTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.wedTime,
 | 
					          (dest) => dest.wedTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ wedTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.wedTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.thuTime,
 | 
					          (dest) => dest.thuTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ thuTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.thuTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.friTime,
 | 
					          (dest) => dest.friTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ friTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.friTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.satTime,
 | 
					          (dest) => dest.satTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ satTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.satTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        forMember(
 | 
					        forMember(
 | 
				
			||||||
          (dest) => dest.sunTime,
 | 
					          (dest) => dest.sunTime,
 | 
				
			||||||
          mapFrom((source) =>
 | 
					          mapFrom(({ sunTime: time, fromDate: date, timezone }) =>
 | 
				
			||||||
            TimeConverter.toUtcDatetime(
 | 
					            TimeConverter.toUtcDatetime(date, time, timezone),
 | 
				
			||||||
              source.fromDate,
 | 
					 | 
				
			||||||
              source.sunTime,
 | 
					 | 
				
			||||||
              source.timezone,
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
 | 
				
			||||||
 | 
					import { ConfigService } from '@nestjs/config';
 | 
				
			||||||
 | 
					import { Test, TestingModule } from '@nestjs/testing';
 | 
				
			||||||
 | 
					import { Messager } from '../../../../adapters/secondaries/messager';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mockAmqpConnection = {
 | 
				
			||||||
 | 
					  publish: jest.fn().mockImplementation(),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mockConfigService = {
 | 
				
			||||||
 | 
					  get: jest.fn().mockResolvedValue({
 | 
				
			||||||
 | 
					    RMQ_EXCHANGE: 'mobicoop',
 | 
				
			||||||
 | 
					  }),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Messager', () => {
 | 
				
			||||||
 | 
					  let messager: Messager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeAll(async () => {
 | 
				
			||||||
 | 
					    const module: TestingModule = await Test.createTestingModule({
 | 
				
			||||||
 | 
					      imports: [],
 | 
				
			||||||
 | 
					      providers: [
 | 
				
			||||||
 | 
					        Messager,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          provide: AmqpConnection,
 | 
				
			||||||
 | 
					          useValue: mockAmqpConnection,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          provide: ConfigService,
 | 
				
			||||||
 | 
					          useValue: mockConfigService,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    }).compile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    messager = module.get<Messager>(Messager);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should be defined', () => {
 | 
				
			||||||
 | 
					    expect(messager).toBeDefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should publish a message', async () => {
 | 
				
			||||||
 | 
					    jest.spyOn(mockAmqpConnection, 'publish');
 | 
				
			||||||
 | 
					    messager.publish('test.create.info', 'my-test');
 | 
				
			||||||
 | 
					    expect(mockAmqpConnection.publish).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					import { Test, TestingModule } from '@nestjs/testing';
 | 
				
			||||||
 | 
					import { TimezoneFinder } from '../../../../adapters/secondaries/timezone-finder';
 | 
				
			||||||
 | 
					import { GeoTimezoneFinder } from '../../../../../geography/adapters/secondaries/geo-timezone-finder';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mockGeoTimezoneFinder = {
 | 
				
			||||||
 | 
					  timezones: jest.fn().mockImplementation(() => ['Europe/Paris']),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Timezone Finder', () => {
 | 
				
			||||||
 | 
					  let timezoneFinder: TimezoneFinder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeAll(async () => {
 | 
				
			||||||
 | 
					    const module: TestingModule = await Test.createTestingModule({
 | 
				
			||||||
 | 
					      imports: [],
 | 
				
			||||||
 | 
					      providers: [
 | 
				
			||||||
 | 
					        TimezoneFinder,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          provide: GeoTimezoneFinder,
 | 
				
			||||||
 | 
					          useValue: mockGeoTimezoneFinder,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    }).compile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timezoneFinder = module.get<TimezoneFinder>(TimezoneFinder);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should be defined', () => {
 | 
				
			||||||
 | 
					    expect(timezoneFinder).toBeDefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  it('should get timezone for Nancy(France) as Europe/Paris', () => {
 | 
				
			||||||
 | 
					    const timezones = timezoneFinder.timezones(6.179373, 48.687913);
 | 
				
			||||||
 | 
					    expect(timezones.length).toBe(1);
 | 
				
			||||||
 | 
					    expect(timezones[0]).toBe('Europe/Paris');
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,91 @@
 | 
				
			||||||
 | 
					import { CreateAdRequest } from '../../../domain/dtos/create-ad.request';
 | 
				
			||||||
 | 
					import { PointType } from '../../../../geography/domain/types/point-type.enum';
 | 
				
			||||||
 | 
					import { CreateAdUseCase } from '../../../domain/usecases/create-ad.usecase';
 | 
				
			||||||
 | 
					import { Test, TestingModule } from '@nestjs/testing';
 | 
				
			||||||
 | 
					import { AutomapperModule } from '@automapper/nestjs';
 | 
				
			||||||
 | 
					import { classes } from '@automapper/classes';
 | 
				
			||||||
 | 
					import { AdRepository } from '../../../adapters/secondaries/ad.repository';
 | 
				
			||||||
 | 
					import { CreateAdCommand } from '../../../commands/create-ad.command';
 | 
				
			||||||
 | 
					import { Ad } from '../../../domain/entities/ad';
 | 
				
			||||||
 | 
					import { AdProfile } from '../../../mappers/ad.profile';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mockAdRepository = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const createAdRequest: CreateAdRequest = {
 | 
				
			||||||
 | 
					  uuid: '77c55dfc-c28b-4026-942e-f94e95401fb1',
 | 
				
			||||||
 | 
					  driver: true,
 | 
				
			||||||
 | 
					  passenger: false,
 | 
				
			||||||
 | 
					  frequency: 2,
 | 
				
			||||||
 | 
					  fromDate: '2023-04-26',
 | 
				
			||||||
 | 
					  toDate: '2024-04-25',
 | 
				
			||||||
 | 
					  monTime: '07:00',
 | 
				
			||||||
 | 
					  tueTime: '07:00',
 | 
				
			||||||
 | 
					  wedTime: '07:00',
 | 
				
			||||||
 | 
					  thuTime: '07:00',
 | 
				
			||||||
 | 
					  friTime: '07:00',
 | 
				
			||||||
 | 
					  satTime: null,
 | 
				
			||||||
 | 
					  sunTime: null,
 | 
				
			||||||
 | 
					  monMargin: 900,
 | 
				
			||||||
 | 
					  tueMargin: 900,
 | 
				
			||||||
 | 
					  wedMargin: 900,
 | 
				
			||||||
 | 
					  thuMargin: 900,
 | 
				
			||||||
 | 
					  friMargin: 900,
 | 
				
			||||||
 | 
					  satMargin: 900,
 | 
				
			||||||
 | 
					  sunMargin: 900,
 | 
				
			||||||
 | 
					  originType: PointType.OTHER,
 | 
				
			||||||
 | 
					  destinationType: PointType.OTHER,
 | 
				
			||||||
 | 
					  seatsDriver: 3,
 | 
				
			||||||
 | 
					  seatsPassenger: 1,
 | 
				
			||||||
 | 
					  createdAt: '2023-04-01 12:45',
 | 
				
			||||||
 | 
					  updatedAt: '2023-04-01 12:45',
 | 
				
			||||||
 | 
					  waypoints: [
 | 
				
			||||||
 | 
					    { lon: 6, lat: 45 },
 | 
				
			||||||
 | 
					    { lon: 6.5, lat: 45.5 },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('CreateAdUseCase', () => {
 | 
				
			||||||
 | 
					  let createAdUseCase: CreateAdUseCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeAll(async () => {
 | 
				
			||||||
 | 
					    const module: TestingModule = await Test.createTestingModule({
 | 
				
			||||||
 | 
					      imports: [AutomapperModule.forRoot({ strategyInitializer: classes() })],
 | 
				
			||||||
 | 
					      providers: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          provide: AdRepository,
 | 
				
			||||||
 | 
					          useValue: mockAdRepository,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        AdProfile,
 | 
				
			||||||
 | 
					        CreateAdUseCase,
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    }).compile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    createAdUseCase = module.get<CreateAdUseCase>(CreateAdUseCase);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should be defined', () => {
 | 
				
			||||||
 | 
					    expect(createAdUseCase).toBeDefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('execute', () => {
 | 
				
			||||||
 | 
					    it('should create an ad', async () => {
 | 
				
			||||||
 | 
					      const ad = await createAdUseCase.execute(
 | 
				
			||||||
 | 
					        new CreateAdCommand(createAdRequest),
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      expect(ad).toBeInstanceOf(Ad);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //   it('should throw an exception when error occurs', async () => {
 | 
				
			||||||
 | 
					    //     await expect(
 | 
				
			||||||
 | 
					    //       createAdUseCase.execute(
 | 
				
			||||||
 | 
					    //         new MatchQuery(
 | 
				
			||||||
 | 
					    //           matchRequest,
 | 
				
			||||||
 | 
					    //           defaultParams,
 | 
				
			||||||
 | 
					    //           mockGeorouterCreator,
 | 
				
			||||||
 | 
					    //           mockTimezoneFinder,
 | 
				
			||||||
 | 
					    //         ),
 | 
				
			||||||
 | 
					    //       ),
 | 
				
			||||||
 | 
					    //     ).rejects.toBeInstanceOf(MatcherException);
 | 
				
			||||||
 | 
					    //   });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					import { TimeConverter } from '../../../domain/entities/time-converter';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('TimeConverter', () => {
 | 
				
			||||||
 | 
					  it('should be defined', () => {
 | 
				
			||||||
 | 
					    expect(new TimeConverter()).toBeDefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should convert a Europe/Paris datetime to utc datetime', () => {
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime(
 | 
				
			||||||
 | 
					        '2023-05-01',
 | 
				
			||||||
 | 
					        '07:00',
 | 
				
			||||||
 | 
					        'Europe/Paris',
 | 
				
			||||||
 | 
					      ).getUTCHours(),
 | 
				
			||||||
 | 
					    ).toBe(6);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should return undefined when trying to convert a Europe/Paris datetime to utc datetime without a valid date, time or timezone', () => {
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime(undefined, '07:00', 'Europe/Paris'),
 | 
				
			||||||
 | 
					    ).toBeUndefined();
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime('2023-13-01', '07:00', 'Europe/Paris'),
 | 
				
			||||||
 | 
					    ).toBeUndefined();
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime('2023-05-01', undefined, 'Europe/Paris'),
 | 
				
			||||||
 | 
					    ).toBeUndefined();
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime('2023-05-01', 'a', 'Europe/Paris'),
 | 
				
			||||||
 | 
					    ).toBeUndefined();
 | 
				
			||||||
 | 
					    expect(
 | 
				
			||||||
 | 
					      TimeConverter.toUtcDatetime('2023-13-01', '07:00', 'OlympusMons/Mars'),
 | 
				
			||||||
 | 
					    ).toBeUndefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@ import { DefaultParamsProvider } from '../secondaries/default-params.provider';
 | 
				
			||||||
import { GeorouterCreator } from '../secondaries/georouter-creator';
 | 
					import { GeorouterCreator } from '../secondaries/georouter-creator';
 | 
				
			||||||
import { Match } from '../../domain/entities/ecosystem/match';
 | 
					import { Match } from '../../domain/entities/ecosystem/match';
 | 
				
			||||||
import { GeoTimezoneFinder } from '../../../geography/adapters/secondaries/geo-timezone-finder';
 | 
					import { GeoTimezoneFinder } from '../../../geography/adapters/secondaries/geo-timezone-finder';
 | 
				
			||||||
 | 
					import { TimeConverter } from '../secondaries/time-converter';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@UsePipes(
 | 
					@UsePipes(
 | 
				
			||||||
  new RpcValidationPipe({
 | 
					  new RpcValidationPipe({
 | 
				
			||||||
| 
						 | 
					@ -27,6 +28,7 @@ export class MatcherController {
 | 
				
			||||||
    @InjectMapper() private readonly _mapper: Mapper,
 | 
					    @InjectMapper() private readonly _mapper: Mapper,
 | 
				
			||||||
    private readonly georouterCreator: GeorouterCreator,
 | 
					    private readonly georouterCreator: GeorouterCreator,
 | 
				
			||||||
    private readonly timezoneFinder: GeoTimezoneFinder,
 | 
					    private readonly timezoneFinder: GeoTimezoneFinder,
 | 
				
			||||||
 | 
					    private readonly timeConverter: TimeConverter,
 | 
				
			||||||
  ) {}
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @GrpcMethod('MatcherService', 'Match')
 | 
					  @GrpcMethod('MatcherService', 'Match')
 | 
				
			||||||
| 
						 | 
					@ -38,6 +40,7 @@ export class MatcherController {
 | 
				
			||||||
          this.defaultParamsProvider.getParams(),
 | 
					          this.defaultParamsProvider.getParams(),
 | 
				
			||||||
          this.georouterCreator,
 | 
					          this.georouterCreator,
 | 
				
			||||||
          this.timezoneFinder,
 | 
					          this.timezoneFinder,
 | 
				
			||||||
 | 
					          this.timeConverter,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      return Promise.resolve({
 | 
					      return Promise.resolve({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,31 +7,32 @@ service MatcherService {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message MatchRequest {
 | 
					message MatchRequest {
 | 
				
			||||||
  repeated Point waypoints = 1;
 | 
					  Mode mode = 1;
 | 
				
			||||||
  string departure = 2;
 | 
					  string uuid = 2;
 | 
				
			||||||
  string fromDate = 3;
 | 
					  repeated Coordinates waypoints = 3;
 | 
				
			||||||
  Schedule schedule = 4;
 | 
					  string departure = 4;
 | 
				
			||||||
  bool driver = 5;
 | 
					  string fromDate = 5;
 | 
				
			||||||
  bool passenger = 6;
 | 
					  Schedule schedule = 6;
 | 
				
			||||||
  string toDate = 7;
 | 
					  bool driver = 7;
 | 
				
			||||||
  int32 marginDuration = 8;
 | 
					  bool passenger = 8;
 | 
				
			||||||
  MarginDurations marginDurations = 9;
 | 
					  string toDate = 9;
 | 
				
			||||||
  int32 seatsPassenger = 10;
 | 
					  int32 marginDuration = 10;
 | 
				
			||||||
  int32 seatsDriver = 11;
 | 
					  MarginDurations marginDurations = 11;
 | 
				
			||||||
  bool strict = 12;
 | 
					  int32 seatsPassenger = 12;
 | 
				
			||||||
  Algorithm algorithm = 13;
 | 
					  int32 seatsDriver = 13;
 | 
				
			||||||
  int32 remoteness = 14;
 | 
					  bool strict = 14;
 | 
				
			||||||
  bool useProportion = 15;
 | 
					  Algorithm algorithm = 15;
 | 
				
			||||||
  int32 proportion = 16;
 | 
					  int32 remoteness = 16;
 | 
				
			||||||
  bool useAzimuth = 17;
 | 
					  bool useProportion = 17;
 | 
				
			||||||
  int32 azimuthMargin = 18;
 | 
					  int32 proportion = 18;
 | 
				
			||||||
  float maxDetourDistanceRatio = 19;
 | 
					  bool useAzimuth = 19;
 | 
				
			||||||
  float maxDetourDurationRatio = 20;
 | 
					  int32 azimuthMargin = 20;
 | 
				
			||||||
  repeated int32 exclusions = 21;
 | 
					  float maxDetourDistanceRatio = 21;
 | 
				
			||||||
  int32 identifier = 22;
 | 
					  float maxDetourDurationRatio = 22;
 | 
				
			||||||
 | 
					  repeated int32 exclusions = 23;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message Point {
 | 
					message Coordinates {
 | 
				
			||||||
  float lon = 1;
 | 
					  float lon = 1;
 | 
				
			||||||
  float lat = 2;
 | 
					  float lat = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -68,3 +69,9 @@ message Matches {
 | 
				
			||||||
  repeated Match data = 1;
 | 
					  repeated Match data = 1;
 | 
				
			||||||
  int32 total = 2;
 | 
					  int32 total = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum Mode {
 | 
				
			||||||
 | 
					  MATCH = 0;
 | 
				
			||||||
 | 
					  PUBLISH = 1;
 | 
				
			||||||
 | 
					  PUBLISH_AND_MATCH = 2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,9 +8,7 @@ export class DefaultParamsProvider {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getParams = (): IDefaultParams => {
 | 
					  getParams = (): IDefaultParams => {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      DEFAULT_IDENTIFIER: parseInt(
 | 
					      DEFAULT_UUID: this.configService.get('DEFAULT_UUID'),
 | 
				
			||||||
        this.configService.get('DEFAULT_IDENTIFIER'),
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
      MARGIN_DURATION: parseInt(this.configService.get('MARGIN_DURATION')),
 | 
					      MARGIN_DURATION: parseInt(this.configService.get('MARGIN_DURATION')),
 | 
				
			||||||
      VALIDITY_DURATION: parseInt(this.configService.get('VALIDITY_DURATION')),
 | 
					      VALIDITY_DURATION: parseInt(this.configService.get('VALIDITY_DURATION')),
 | 
				
			||||||
      DEFAULT_TIMEZONE: this.configService.get('DEFAULT_TIMEZONE'),
 | 
					      DEFAULT_TIMEZONE: this.configService.get('DEFAULT_TIMEZONE'),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
 | 
					import { DateTime, TimeZone } from 'timezonecomplete';
 | 
				
			||||||
 | 
					import { IConvertTime } from '../../domain/interfaces/time-converter.interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable()
 | 
				
			||||||
 | 
					export class TimeConverter implements IConvertTime {
 | 
				
			||||||
 | 
					  toUtcDate = (date: Date, timezone: string): Date => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      return new Date(
 | 
				
			||||||
 | 
					        new DateTime(
 | 
				
			||||||
 | 
					          `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}T${date.getHours()}:${date.getMinutes()}`,
 | 
				
			||||||
 | 
					          TimeZone.zone(timezone, false),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					          .convert(TimeZone.zone('UTC'))
 | 
				
			||||||
 | 
					          .toIsoString(),
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      return undefined;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -15,19 +15,30 @@ import { Schedule } from '../types/schedule.type';
 | 
				
			||||||
import { MarginDurations } from '../types/margin-durations.type';
 | 
					import { MarginDurations } from '../types/margin-durations.type';
 | 
				
			||||||
import { AlgorithmType } from '../types/algorithm.enum';
 | 
					import { AlgorithmType } from '../types/algorithm.enum';
 | 
				
			||||||
import { IRequestTime } from '../interfaces/time-request.interface';
 | 
					import { IRequestTime } from '../interfaces/time-request.interface';
 | 
				
			||||||
import { IRequestPerson } from '../interfaces/person-request.interface';
 | 
					import { IRequestAd } from '../interfaces/ad-request.interface';
 | 
				
			||||||
import { IRequestGeography } from '../interfaces/geography-request.interface';
 | 
					import { IRequestGeography } from '../interfaces/geography-request.interface';
 | 
				
			||||||
import { IRequestRequirement } from '../interfaces/requirement-request.interface';
 | 
					import { IRequestRequirement } from '../interfaces/requirement-request.interface';
 | 
				
			||||||
import { IRequestAlgorithmSettings } from '../interfaces/algorithm-settings-request.interface';
 | 
					import { IRequestAlgorithmSettings } from '../interfaces/algorithm-settings-request.interface';
 | 
				
			||||||
 | 
					import { Mode } from '../types/mode.enum';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MatchRequest
 | 
					export class MatchRequest
 | 
				
			||||||
  implements
 | 
					  implements
 | 
				
			||||||
    IRequestTime,
 | 
					    IRequestTime,
 | 
				
			||||||
    IRequestPerson,
 | 
					    IRequestAd,
 | 
				
			||||||
    IRequestGeography,
 | 
					    IRequestGeography,
 | 
				
			||||||
    IRequestRequirement,
 | 
					    IRequestRequirement,
 | 
				
			||||||
    IRequestAlgorithmSettings
 | 
					    IRequestAlgorithmSettings
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  @IsOptional()
 | 
				
			||||||
 | 
					  @IsString()
 | 
				
			||||||
 | 
					  @AutoMap()
 | 
				
			||||||
 | 
					  uuid: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @IsOptional()
 | 
				
			||||||
 | 
					  @IsEnum(Mode)
 | 
				
			||||||
 | 
					  @AutoMap()
 | 
				
			||||||
 | 
					  mode: Mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsArray()
 | 
					  @IsArray()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  waypoints: Point[];
 | 
					  waypoints: Point[];
 | 
				
			||||||
| 
						 | 
					@ -138,10 +149,7 @@ export class MatchRequest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsArray()
 | 
					  @IsArray()
 | 
				
			||||||
  exclusions: number[];
 | 
					  exclusions: string[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  timezone?: string;
 | 
				
			||||||
  @IsInt()
 | 
					 | 
				
			||||||
  @AutoMap()
 | 
					 | 
				
			||||||
  identifier: number;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,14 @@
 | 
				
			||||||
import { Role } from '../../types/role.enum';
 | 
					import { Role } from '../../types/role.enum';
 | 
				
			||||||
import { Step } from '../../types/step.enum';
 | 
					import { Step } from '../../types/step.enum';
 | 
				
			||||||
import { Person } from './person';
 | 
					import { Ad } from './ad';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Actor {
 | 
					export class Actor {
 | 
				
			||||||
  person: Person;
 | 
					  ad: Ad;
 | 
				
			||||||
  role: Role;
 | 
					  role: Role;
 | 
				
			||||||
  step: Step;
 | 
					  step: Step;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(person: Person, role: Role, step: Step) {
 | 
					  constructor(ad: Ad, role: Role, step: Step) {
 | 
				
			||||||
    this.person = person;
 | 
					    this.ad = ad;
 | 
				
			||||||
    this.role = role;
 | 
					    this.role = role;
 | 
				
			||||||
    this.step = step;
 | 
					    this.step = step;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,24 +1,24 @@
 | 
				
			||||||
import { IRequestPerson } from '../../interfaces/person-request.interface';
 | 
					import { IRequestAd } from '../../interfaces/ad-request.interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Person {
 | 
					export class Ad {
 | 
				
			||||||
  private personRequest: IRequestPerson;
 | 
					  private adRequest: IRequestAd;
 | 
				
			||||||
  private defaultIdentifier: number;
 | 
					  private defaultUuid: string;
 | 
				
			||||||
  private defaultMarginDuration: number;
 | 
					  private defaultMarginDuration: number;
 | 
				
			||||||
  identifier: number;
 | 
					  uuid: string;
 | 
				
			||||||
  marginDurations: number[];
 | 
					  marginDurations: number[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    personRequest: IRequestPerson,
 | 
					    adRequest: IRequestAd,
 | 
				
			||||||
    defaultIdentifier: number,
 | 
					    defaultUuid: string,
 | 
				
			||||||
    defaultMarginDuration: number,
 | 
					    defaultMarginDuration: number,
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    this.personRequest = personRequest;
 | 
					    this.adRequest = adRequest;
 | 
				
			||||||
    this.defaultIdentifier = defaultIdentifier;
 | 
					    this.defaultUuid = defaultUuid;
 | 
				
			||||||
    this.defaultMarginDuration = defaultMarginDuration;
 | 
					    this.defaultMarginDuration = defaultMarginDuration;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init = (): void => {
 | 
					  init = (): void => {
 | 
				
			||||||
    this.setIdentifier(this.personRequest.identifier ?? this.defaultIdentifier);
 | 
					    this.setUuid(this.adRequest.uuid ?? this.defaultUuid);
 | 
				
			||||||
    this.setMarginDurations([
 | 
					    this.setMarginDurations([
 | 
				
			||||||
      this.defaultMarginDuration,
 | 
					      this.defaultMarginDuration,
 | 
				
			||||||
      this.defaultMarginDuration,
 | 
					      this.defaultMarginDuration,
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,8 @@ export class Person {
 | 
				
			||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setIdentifier = (identifier: number): void => {
 | 
					  setUuid = (uuid: string): void => {
 | 
				
			||||||
    this.identifier = identifier;
 | 
					    this.uuid = uuid;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setMarginDurations = (marginDurations: number[]): void => {
 | 
					  setMarginDurations = (marginDurations: number[]): void => {
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ import { Role } from '../../types/role.enum';
 | 
				
			||||||
import { IGeorouter } from '../../interfaces/georouter.interface';
 | 
					import { IGeorouter } from '../../interfaces/georouter.interface';
 | 
				
			||||||
import { Waypoint } from './waypoint';
 | 
					import { Waypoint } from './waypoint';
 | 
				
			||||||
import { Actor } from './actor';
 | 
					import { Actor } from './actor';
 | 
				
			||||||
import { Person } from './person';
 | 
					import { Ad } from './ad';
 | 
				
			||||||
import { Step } from '../../types/step.enum';
 | 
					import { Step } from '../../types/step.enum';
 | 
				
			||||||
import { Path } from '../../types/path.type';
 | 
					import { Path } from '../../types/path.type';
 | 
				
			||||||
import { IFindTimezone } from '../../../../geography/domain/interfaces/timezone-finder.interface';
 | 
					import { IFindTimezone } from '../../../../geography/domain/interfaces/timezone-finder.interface';
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ import { Timezoner } from './timezoner';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Geography {
 | 
					export class Geography {
 | 
				
			||||||
  private geographyRequest: IRequestGeography;
 | 
					  private geographyRequest: IRequestGeography;
 | 
				
			||||||
  private person: Person;
 | 
					  private ad: Ad;
 | 
				
			||||||
  private points: Point[];
 | 
					  private points: Point[];
 | 
				
			||||||
  originType: PointType;
 | 
					  originType: PointType;
 | 
				
			||||||
  destinationType: PointType;
 | 
					  destinationType: PointType;
 | 
				
			||||||
| 
						 | 
					@ -30,10 +30,10 @@ export class Geography {
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    geographyRequest: IRequestGeography,
 | 
					    geographyRequest: IRequestGeography,
 | 
				
			||||||
    timezoner: Timezoner,
 | 
					    timezoner: Timezoner,
 | 
				
			||||||
    person: Person,
 | 
					    ad: Ad,
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    this.geographyRequest = geographyRequest;
 | 
					    this.geographyRequest = geographyRequest;
 | 
				
			||||||
    this.person = person;
 | 
					    this.ad = ad;
 | 
				
			||||||
    this.points = [];
 | 
					    this.points = [];
 | 
				
			||||||
    this.originType = undefined;
 | 
					    this.originType = undefined;
 | 
				
			||||||
    this.destinationType = undefined;
 | 
					    this.destinationType = undefined;
 | 
				
			||||||
| 
						 | 
					@ -178,11 +178,11 @@ export class Geography {
 | 
				
			||||||
    return points.map((point, index) => {
 | 
					    return points.map((point, index) => {
 | 
				
			||||||
      const waypoint = new Waypoint(point);
 | 
					      const waypoint = new Waypoint(point);
 | 
				
			||||||
      if (index == 0) {
 | 
					      if (index == 0) {
 | 
				
			||||||
        waypoint.addActor(new Actor(this.person, role, Step.START));
 | 
					        waypoint.addActor(new Actor(this.ad, role, Step.START));
 | 
				
			||||||
      } else if (index == points.length - 1) {
 | 
					      } else if (index == points.length - 1) {
 | 
				
			||||||
        waypoint.addActor(new Actor(this.person, role, Step.FINISH));
 | 
					        waypoint.addActor(new Actor(this.ad, role, Step.FINISH));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        waypoint.addActor(new Actor(this.person, role, Step.INTERMEDIATE));
 | 
					        waypoint.addActor(new Actor(this.ad, role, Step.INTERMEDIATE));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return waypoint;
 | 
					      return waypoint;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,26 +5,30 @@ import {
 | 
				
			||||||
import { MarginDurations } from '../../types/margin-durations.type';
 | 
					import { MarginDurations } from '../../types/margin-durations.type';
 | 
				
			||||||
import { IRequestTime } from '../../interfaces/time-request.interface';
 | 
					import { IRequestTime } from '../../interfaces/time-request.interface';
 | 
				
			||||||
import { DAYS } from '../../types/days.const';
 | 
					import { DAYS } from '../../types/days.const';
 | 
				
			||||||
import { Schedule } from '../../types/schedule.type';
 | 
					import { TimeSchedule } from '../../types/time-schedule.type';
 | 
				
			||||||
import { Frequency } from '../../../../ad/domain/types/frequency.enum';
 | 
					import { Frequency } from '../../../../ad/domain/types/frequency.enum';
 | 
				
			||||||
import { Day } from '../../types/day.type';
 | 
					import { Day } from '../../types/day.type';
 | 
				
			||||||
 | 
					import { IConvertTime } from '../../interfaces/time-converter.interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Time {
 | 
					export class Time {
 | 
				
			||||||
  private timeRequest: IRequestTime;
 | 
					  private timeRequest: IRequestTime;
 | 
				
			||||||
  private defaultValidityDuration: number;
 | 
					  private defaultValidityDuration: number;
 | 
				
			||||||
 | 
					  private timeConverter: IConvertTime;
 | 
				
			||||||
  frequency: Frequency;
 | 
					  frequency: Frequency;
 | 
				
			||||||
  fromDate: Date;
 | 
					  fromDate: Date;
 | 
				
			||||||
  toDate: Date;
 | 
					  toDate: Date;
 | 
				
			||||||
  schedule: Schedule;
 | 
					  schedule: TimeSchedule;
 | 
				
			||||||
  marginDurations: MarginDurations;
 | 
					  marginDurations: MarginDurations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    timeRequest: IRequestTime,
 | 
					    timeRequest: IRequestTime,
 | 
				
			||||||
    defaultMarginDuration: number,
 | 
					    defaultMarginDuration: number,
 | 
				
			||||||
    defaultValidityDuration: number,
 | 
					    defaultValidityDuration: number,
 | 
				
			||||||
 | 
					    timeConverter: IConvertTime,
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    this.timeRequest = timeRequest;
 | 
					    this.timeRequest = timeRequest;
 | 
				
			||||||
    this.defaultValidityDuration = defaultValidityDuration;
 | 
					    this.defaultValidityDuration = defaultValidityDuration;
 | 
				
			||||||
 | 
					    this.timeConverter = timeConverter;
 | 
				
			||||||
    this.schedule = {};
 | 
					    this.schedule = {};
 | 
				
			||||||
    this.marginDurations = {
 | 
					    this.marginDurations = {
 | 
				
			||||||
      mon: defaultMarginDuration,
 | 
					      mon: defaultMarginDuration,
 | 
				
			||||||
| 
						 | 
					@ -128,8 +132,10 @@ export class Time {
 | 
				
			||||||
  private setPunctualRequest = (): void => {
 | 
					  private setPunctualRequest = (): void => {
 | 
				
			||||||
    if (this.timeRequest.departure) {
 | 
					    if (this.timeRequest.departure) {
 | 
				
			||||||
      this.frequency = Frequency.PUNCTUAL;
 | 
					      this.frequency = Frequency.PUNCTUAL;
 | 
				
			||||||
      this.schedule[Day[this.fromDate.getDay()]] =
 | 
					      this.schedule[Day[this.fromDate.getDay()]] = this.timeConverter.toUtcDate(
 | 
				
			||||||
        this.fromDate.getHours() + ':' + this.fromDate.getMinutes();
 | 
					        this.fromDate,
 | 
				
			||||||
 | 
					        this.timeRequest.timezone,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
import { Person } from '../ecosystem/person';
 | 
					import { Ad } from '../ecosystem/ad';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Candidate {
 | 
					export class Candidate {
 | 
				
			||||||
  person: Person;
 | 
					  ad: Ad;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					export interface IRequestAd {
 | 
				
			||||||
 | 
					  uuid?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +0,0 @@
 | 
				
			||||||
export interface IRequestPerson {
 | 
					 | 
				
			||||||
  identifier?: number;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					export interface IConvertTime {
 | 
				
			||||||
 | 
					  toUtcDate(date: Date, timezone: string): Date;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -8,4 +8,5 @@ export interface IRequestTime {
 | 
				
			||||||
  schedule?: Schedule;
 | 
					  schedule?: Schedule;
 | 
				
			||||||
  marginDuration?: number;
 | 
					  marginDuration?: number;
 | 
				
			||||||
  marginDurations?: MarginDurations;
 | 
					  marginDurations?: MarginDurations;
 | 
				
			||||||
 | 
					  timezone?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,9 @@
 | 
				
			||||||
import { Person } from '../entities/ecosystem/person';
 | 
					import { Ad } from '../entities/ecosystem/ad';
 | 
				
			||||||
import { Role } from './role.enum';
 | 
					import { Role } from './role.enum';
 | 
				
			||||||
import { Step } from './step.enum';
 | 
					import { Step } from './step.enum';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type Actor = {
 | 
					export type Actor = {
 | 
				
			||||||
  person: Person;
 | 
					  ad: Ad;
 | 
				
			||||||
  role: Role;
 | 
					  role: Role;
 | 
				
			||||||
  step: Step;
 | 
					  step: Step;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
import { DefaultAlgorithmSettings } from './default-algorithm-settings.type';
 | 
					import { DefaultAlgorithmSettings } from './default-algorithm-settings.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type IDefaultParams = {
 | 
					export type IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: number;
 | 
					  DEFAULT_UUID: string;
 | 
				
			||||||
  MARGIN_DURATION: number;
 | 
					  MARGIN_DURATION: number;
 | 
				
			||||||
  VALIDITY_DURATION: number;
 | 
					  VALIDITY_DURATION: number;
 | 
				
			||||||
  DEFAULT_TIMEZONE: string;
 | 
					  DEFAULT_TIMEZONE: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					export enum Mode {
 | 
				
			||||||
 | 
					  MATCH = 'MATCH',
 | 
				
			||||||
 | 
					  PUBLISH = 'PUBLISH',
 | 
				
			||||||
 | 
					  PUBLISH_AND_MATCH = 'PUBLISH_AND_MATCH',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					export type TimeSchedule = {
 | 
				
			||||||
 | 
					  mon?: Date;
 | 
				
			||||||
 | 
					  tue?: Date;
 | 
				
			||||||
 | 
					  wed?: Date;
 | 
				
			||||||
 | 
					  thu?: Date;
 | 
				
			||||||
 | 
					  fri?: Date;
 | 
				
			||||||
 | 
					  sat?: Date;
 | 
				
			||||||
 | 
					  sun?: Date;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import { MatchRequest } from '../domain/dtos/match.request';
 | 
					import { MatchRequest } from '../domain/dtos/match.request';
 | 
				
			||||||
import { Geography } from '../domain/entities/ecosystem/geography';
 | 
					import { Geography } from '../domain/entities/ecosystem/geography';
 | 
				
			||||||
import { Person } from '../domain/entities/ecosystem/person';
 | 
					import { Ad } from '../domain/entities/ecosystem/ad';
 | 
				
			||||||
import { Requirement } from '../domain/entities/ecosystem/requirement';
 | 
					import { Requirement } from '../domain/entities/ecosystem/requirement';
 | 
				
			||||||
import { Role } from '../domain/types/role.enum';
 | 
					import { Role } from '../domain/types/role.enum';
 | 
				
			||||||
import { AlgorithmSettings } from '../domain/entities/ecosystem/algorithm-settings';
 | 
					import { AlgorithmSettings } from '../domain/entities/ecosystem/algorithm-settings';
 | 
				
			||||||
| 
						 | 
					@ -9,35 +9,42 @@ import { IDefaultParams } from '../domain/types/default-params.type';
 | 
				
			||||||
import { IGeorouter } from '../domain/interfaces/georouter.interface';
 | 
					import { IGeorouter } from '../domain/interfaces/georouter.interface';
 | 
				
			||||||
import { ICreateGeorouter } from '../domain/interfaces/georouter-creator.interface';
 | 
					import { ICreateGeorouter } from '../domain/interfaces/georouter-creator.interface';
 | 
				
			||||||
import { IFindTimezone } from '../../geography/domain/interfaces/timezone-finder.interface';
 | 
					import { IFindTimezone } from '../../geography/domain/interfaces/timezone-finder.interface';
 | 
				
			||||||
 | 
					import { Mode } from '../domain/types/mode.enum';
 | 
				
			||||||
 | 
					import { IConvertTime } from '../domain/interfaces/time-converter.interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MatchQuery {
 | 
					export class MatchQuery {
 | 
				
			||||||
  private readonly matchRequest: MatchRequest;
 | 
					  private readonly matchRequest: MatchRequest;
 | 
				
			||||||
  private readonly defaultParams: IDefaultParams;
 | 
					  private readonly defaultParams: IDefaultParams;
 | 
				
			||||||
  private readonly georouterCreator: ICreateGeorouter;
 | 
					  private readonly georouterCreator: ICreateGeorouter;
 | 
				
			||||||
  person: Person;
 | 
					  mode: Mode;
 | 
				
			||||||
 | 
					  ad: Ad;
 | 
				
			||||||
  roles: Role[];
 | 
					  roles: Role[];
 | 
				
			||||||
  time: Time;
 | 
					  time: Time;
 | 
				
			||||||
  geography: Geography;
 | 
					  geography: Geography;
 | 
				
			||||||
  exclusions: number[];
 | 
					  exclusions: string[];
 | 
				
			||||||
  requirement: Requirement;
 | 
					  requirement: Requirement;
 | 
				
			||||||
  algorithmSettings: AlgorithmSettings;
 | 
					  algorithmSettings: AlgorithmSettings;
 | 
				
			||||||
  georouter: IGeorouter;
 | 
					  georouter: IGeorouter;
 | 
				
			||||||
  timezoneFinder: IFindTimezone;
 | 
					  timezoneFinder: IFindTimezone;
 | 
				
			||||||
 | 
					  timeConverter: IConvertTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    matchRequest: MatchRequest,
 | 
					    matchRequest: MatchRequest,
 | 
				
			||||||
    defaultParams: IDefaultParams,
 | 
					    defaultParams: IDefaultParams,
 | 
				
			||||||
    georouterCreator: ICreateGeorouter,
 | 
					    georouterCreator: ICreateGeorouter,
 | 
				
			||||||
    timezoneFinder: IFindTimezone,
 | 
					    timezoneFinder: IFindTimezone,
 | 
				
			||||||
 | 
					    timeConverter: IConvertTime,
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    this.matchRequest = matchRequest;
 | 
					    this.matchRequest = matchRequest;
 | 
				
			||||||
    this.defaultParams = defaultParams;
 | 
					    this.defaultParams = defaultParams;
 | 
				
			||||||
    this.georouterCreator = georouterCreator;
 | 
					    this.georouterCreator = georouterCreator;
 | 
				
			||||||
    this.timezoneFinder = timezoneFinder;
 | 
					    this.timezoneFinder = timezoneFinder;
 | 
				
			||||||
    this.setPerson();
 | 
					    this.timeConverter = timeConverter;
 | 
				
			||||||
 | 
					    this.setMode();
 | 
				
			||||||
 | 
					    this.setAd();
 | 
				
			||||||
    this.setRoles();
 | 
					    this.setRoles();
 | 
				
			||||||
    this.setTime();
 | 
					 | 
				
			||||||
    this.setGeography();
 | 
					    this.setGeography();
 | 
				
			||||||
 | 
					    this.setTime();
 | 
				
			||||||
    this.setRequirement();
 | 
					    this.setRequirement();
 | 
				
			||||||
    this.setAlgorithmSettings();
 | 
					    this.setAlgorithmSettings();
 | 
				
			||||||
    this.setExclusions();
 | 
					    this.setExclusions();
 | 
				
			||||||
| 
						 | 
					@ -47,13 +54,17 @@ export class MatchQuery {
 | 
				
			||||||
    this.geography.createRoutes(this.roles, this.algorithmSettings.georouter);
 | 
					    this.geography.createRoutes(this.roles, this.algorithmSettings.georouter);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private setPerson = (): void => {
 | 
					  private setMode = (): void => {
 | 
				
			||||||
    this.person = new Person(
 | 
					    this.mode = this.matchRequest.mode ?? Mode.MATCH;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private setAd = (): void => {
 | 
				
			||||||
 | 
					    this.ad = new Ad(
 | 
				
			||||||
      this.matchRequest,
 | 
					      this.matchRequest,
 | 
				
			||||||
      this.defaultParams.DEFAULT_IDENTIFIER,
 | 
					      this.defaultParams.DEFAULT_UUID,
 | 
				
			||||||
      this.defaultParams.MARGIN_DURATION,
 | 
					      this.defaultParams.MARGIN_DURATION,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    this.person.init();
 | 
					    this.ad.init();
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private setRoles = (): void => {
 | 
					  private setRoles = (): void => {
 | 
				
			||||||
| 
						 | 
					@ -63,15 +74,6 @@ export class MatchQuery {
 | 
				
			||||||
    if (this.roles.length == 0) this.roles.push(Role.PASSENGER);
 | 
					    if (this.roles.length == 0) this.roles.push(Role.PASSENGER);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private setTime = (): void => {
 | 
					 | 
				
			||||||
    this.time = new Time(
 | 
					 | 
				
			||||||
      this.matchRequest,
 | 
					 | 
				
			||||||
      this.defaultParams.MARGIN_DURATION,
 | 
					 | 
				
			||||||
      this.defaultParams.VALIDITY_DURATION,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    this.time.init();
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private setGeography = (): void => {
 | 
					  private setGeography = (): void => {
 | 
				
			||||||
    this.geography = new Geography(
 | 
					    this.geography = new Geography(
 | 
				
			||||||
      this.matchRequest,
 | 
					      this.matchRequest,
 | 
				
			||||||
| 
						 | 
					@ -79,9 +81,20 @@ export class MatchQuery {
 | 
				
			||||||
        timezone: this.defaultParams.DEFAULT_TIMEZONE,
 | 
					        timezone: this.defaultParams.DEFAULT_TIMEZONE,
 | 
				
			||||||
        finder: this.timezoneFinder,
 | 
					        finder: this.timezoneFinder,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      this.person,
 | 
					      this.ad,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    this.geography.init();
 | 
					    this.geography.init();
 | 
				
			||||||
 | 
					    if (this.geography.timezones.length > 0)
 | 
				
			||||||
 | 
					      this.matchRequest.timezone = this.geography.timezones[0];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private setTime = (): void => {
 | 
				
			||||||
 | 
					    this.time = new Time(
 | 
				
			||||||
 | 
					      this.matchRequest,
 | 
				
			||||||
 | 
					      this.defaultParams.MARGIN_DURATION,
 | 
				
			||||||
 | 
					      this.defaultParams.VALIDITY_DURATION,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    this.time.init();
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private setRequirement = (): void => {
 | 
					  private setRequirement = (): void => {
 | 
				
			||||||
| 
						 | 
					@ -102,8 +115,7 @@ export class MatchQuery {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private setExclusions = (): void => {
 | 
					  private setExclusions = (): void => {
 | 
				
			||||||
    this.exclusions = [];
 | 
					    this.exclusions = [];
 | 
				
			||||||
    if (this.matchRequest.identifier)
 | 
					    if (this.matchRequest.uuid) this.exclusions.push(this.matchRequest.uuid);
 | 
				
			||||||
      this.exclusions.push(this.matchRequest.identifier);
 | 
					 | 
				
			||||||
    if (this.matchRequest.exclusions)
 | 
					    if (this.matchRequest.exclusions)
 | 
				
			||||||
      this.exclusions.push(...this.matchRequest.exclusions);
 | 
					      this.exclusions.push(...this.matchRequest.exclusions);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,6 @@ describe('DefaultParamsProvider', () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('should provide default params', async () => {
 | 
					  it('should provide default params', async () => {
 | 
				
			||||||
    const params: IDefaultParams = defaultParamsProvider.getParams();
 | 
					    const params: IDefaultParams = defaultParamsProvider.getParams();
 | 
				
			||||||
    expect(params.DEFAULT_IDENTIFIER).toBe(99);
 | 
					    expect(params.DEFAULT_UUID).toBe(99);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
import { Person } from '../../../../domain/entities/ecosystem/person';
 | 
					import { Ad } from '../../../../domain/entities/ecosystem/ad';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  Geography,
 | 
					  Geography,
 | 
				
			||||||
  RouteKey,
 | 
					  RouteKey,
 | 
				
			||||||
| 
						 | 
					@ -9,11 +9,11 @@ import { Route } from '../../../../domain/entities/ecosystem/route';
 | 
				
			||||||
import { IGeodesic } from '../../../../../geography/domain/interfaces/geodesic.interface';
 | 
					import { IGeodesic } from '../../../../../geography/domain/interfaces/geodesic.interface';
 | 
				
			||||||
import { PointType } from '../../../../../geography/domain/types/point-type.enum';
 | 
					import { PointType } from '../../../../../geography/domain/types/point-type.enum';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const person: Person = new Person(
 | 
					const ad: Ad = new Ad(
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    identifier: 1,
 | 
					    uuid: '774aaab2-77df-4c6c-b70d-7b9e972e5bbc',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  0,
 | 
					  '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  900,
 | 
					  900,
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +88,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
        timezone: 'Europe/Paris',
 | 
					        timezone: 'Europe/Paris',
 | 
				
			||||||
        finder: mockTimezoneFinder,
 | 
					        finder: mockTimezoneFinder,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      person,
 | 
					      ad,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    expect(geography).toBeDefined();
 | 
					    expect(geography).toBeDefined();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      geography.init();
 | 
					      geography.init();
 | 
				
			||||||
      expect(geography.originType).toBe(PointType.LOCALITY);
 | 
					      expect(geography.originType).toBe(PointType.LOCALITY);
 | 
				
			||||||
| 
						 | 
					@ -129,7 +129,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => geography.init()).toThrow();
 | 
					      expect(() => geography.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => geography.init()).toThrow();
 | 
					      expect(() => geography.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					@ -169,7 +169,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => geography.init()).toThrow();
 | 
					      expect(() => geography.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => geography.init()).toThrow();
 | 
					      expect(() => geography.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					@ -216,7 +216,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      geography.init();
 | 
					      geography.init();
 | 
				
			||||||
      await geography.createRoutes(
 | 
					      await geography.createRoutes(
 | 
				
			||||||
| 
						 | 
					@ -249,7 +249,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      geography.init();
 | 
					      geography.init();
 | 
				
			||||||
      await geography.createRoutes(
 | 
					      await geography.createRoutes(
 | 
				
			||||||
| 
						 | 
					@ -278,7 +278,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      geography.init();
 | 
					      geography.init();
 | 
				
			||||||
      await geography.createRoutes([Role.DRIVER], mockGeorouter);
 | 
					      await geography.createRoutes([Role.DRIVER], mockGeorouter);
 | 
				
			||||||
| 
						 | 
					@ -304,7 +304,7 @@ describe('Geography entity', () => {
 | 
				
			||||||
          timezone: 'Europe/Paris',
 | 
					          timezone: 'Europe/Paris',
 | 
				
			||||||
          finder: mockTimezoneFinder,
 | 
					          finder: mockTimezoneFinder,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        person,
 | 
					        ad,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      geography.init();
 | 
					      geography.init();
 | 
				
			||||||
      await geography.createRoutes([Role.PASSENGER], mockGeorouter);
 | 
					      await geography.createRoutes([Role.PASSENGER], mockGeorouter);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,40 +1,40 @@
 | 
				
			||||||
import { Person } from '../../../../domain/entities/ecosystem/person';
 | 
					import { Ad } from '../../../../domain/entities/ecosystem/ad';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DEFAULT_IDENTIFIER = 0;
 | 
					const DEFAULT_UUID = '00000000-0000-0000-0000-000000000000';
 | 
				
			||||||
const MARGIN_DURATION = 900;
 | 
					const MARGIN_DURATION = 900;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('Person entity', () => {
 | 
					describe('Ad entity', () => {
 | 
				
			||||||
  it('should be defined', () => {
 | 
					  it('should be defined', () => {
 | 
				
			||||||
    const person = new Person(
 | 
					    const ad = new Ad(
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        identifier: 1,
 | 
					        uuid: '774aaab2-77df-4c6c-b70d-7b9e972e5bbc',
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      DEFAULT_IDENTIFIER,
 | 
					      DEFAULT_UUID,
 | 
				
			||||||
      MARGIN_DURATION,
 | 
					      MARGIN_DURATION,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    expect(person).toBeDefined();
 | 
					    expect(ad).toBeDefined();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('init', () => {
 | 
					  describe('init', () => {
 | 
				
			||||||
    it('should initialize a person with an identifier', () => {
 | 
					    it('should initialize an ad with a uuid', () => {
 | 
				
			||||||
      const person = new Person(
 | 
					      const ad = new Ad(
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          identifier: 1,
 | 
					          uuid: '774aaab2-77df-4c6c-b70d-7b9e972e5bbc',
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        DEFAULT_IDENTIFIER,
 | 
					        DEFAULT_UUID,
 | 
				
			||||||
        MARGIN_DURATION,
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      person.init();
 | 
					      ad.init();
 | 
				
			||||||
      expect(person.identifier).toBe(1);
 | 
					      expect(ad.uuid).toBe('774aaab2-77df-4c6c-b70d-7b9e972e5bbc');
 | 
				
			||||||
      expect(person.marginDurations[0]).toBe(900);
 | 
					      expect(ad.marginDurations[0]).toBe(900);
 | 
				
			||||||
      expect(person.marginDurations[6]).toBe(900);
 | 
					      expect(ad.marginDurations[6]).toBe(900);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    it('should initialize a person without an identifier', () => {
 | 
					    it('should initialize an ad without a uuid', () => {
 | 
				
			||||||
      const person = new Person({}, DEFAULT_IDENTIFIER, MARGIN_DURATION);
 | 
					      const ad = new Ad({}, DEFAULT_UUID, MARGIN_DURATION);
 | 
				
			||||||
      person.init();
 | 
					      ad.init();
 | 
				
			||||||
      expect(person.identifier).toBe(0);
 | 
					      expect(ad.uuid).toBe('00000000-0000-0000-0000-000000000000');
 | 
				
			||||||
      expect(person.marginDurations[0]).toBe(900);
 | 
					      expect(ad.marginDurations[0]).toBe(900);
 | 
				
			||||||
      expect(person.marginDurations[6]).toBe(900);
 | 
					      expect(ad.marginDurations[6]).toBe(900);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ const mockTimezoneFinder = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,9 +4,10 @@ import { IDefaultParams } from '../../../domain/types/default-params.type';
 | 
				
			||||||
import { MatchQuery } from '../../../queries/match.query';
 | 
					import { MatchQuery } from '../../../queries/match.query';
 | 
				
			||||||
import { AlgorithmType } from '../../../domain/types/algorithm.enum';
 | 
					import { AlgorithmType } from '../../../domain/types/algorithm.enum';
 | 
				
			||||||
import { Frequency } from '../../../../ad/domain/types/frequency.enum';
 | 
					import { Frequency } from '../../../../ad/domain/types/frequency.enum';
 | 
				
			||||||
 | 
					import { Mode } from '../../../domain/types/mode.enum';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultParams: IDefaultParams = {
 | 
					const defaultParams: IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: 0,
 | 
					  DEFAULT_UUID: '00000000-0000-0000-0000-000000000000',
 | 
				
			||||||
  MARGIN_DURATION: 900,
 | 
					  MARGIN_DURATION: 900,
 | 
				
			||||||
  VALIDITY_DURATION: 365,
 | 
					  VALIDITY_DURATION: 365,
 | 
				
			||||||
  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
					  DEFAULT_TIMEZONE: 'Europe/Paris',
 | 
				
			||||||
| 
						 | 
					@ -55,6 +56,30 @@ describe('Match query', () => {
 | 
				
			||||||
      mockTimezoneFinder,
 | 
					      mockTimezoneFinder,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    expect(matchQuery).toBeDefined();
 | 
					    expect(matchQuery).toBeDefined();
 | 
				
			||||||
 | 
					    expect(matchQuery.mode).toBe(Mode.MATCH);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should create a query with publish and match mode', () => {
 | 
				
			||||||
 | 
					    const matchRequest: MatchRequest = new MatchRequest();
 | 
				
			||||||
 | 
					    matchRequest.departure = '2023-04-01 12:00';
 | 
				
			||||||
 | 
					    matchRequest.waypoints = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        lat: 49.440041,
 | 
				
			||||||
 | 
					        lon: 1.093912,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        lat: 50.630992,
 | 
				
			||||||
 | 
					        lon: 3.045432,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					    matchRequest.mode = Mode.PUBLISH_AND_MATCH;
 | 
				
			||||||
 | 
					    const matchQuery: MatchQuery = new MatchQuery(
 | 
				
			||||||
 | 
					      matchRequest,
 | 
				
			||||||
 | 
					      defaultParams,
 | 
				
			||||||
 | 
					      mockGeorouterCreator,
 | 
				
			||||||
 | 
					      mockTimezoneFinder,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    expect(matchQuery.mode).toBe(Mode.PUBLISH_AND_MATCH);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('should create a query with excluded identifiers', () => {
 | 
					  it('should create a query with excluded identifiers', () => {
 | 
				
			||||||
| 
						 | 
					@ -70,8 +95,12 @@ describe('Match query', () => {
 | 
				
			||||||
        lon: 3.045432,
 | 
					        lon: 3.045432,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    matchRequest.identifier = 125;
 | 
					    matchRequest.uuid = '445aa6e4-99e4-4899-9456-3be8c3ada368';
 | 
				
			||||||
    matchRequest.exclusions = [126, 127, 128];
 | 
					    matchRequest.exclusions = [
 | 
				
			||||||
 | 
					      'eacf5e53-e63c-4551-860c-73f95b8a8895',
 | 
				
			||||||
 | 
					      'a4098161-13a9-4e55-8999-de134fbf89c4',
 | 
				
			||||||
 | 
					      'b18f7ffa-20b9-4a1a-89bc-e238ea8289f3',
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
    const matchQuery: MatchQuery = new MatchQuery(
 | 
					    const matchQuery: MatchQuery = new MatchQuery(
 | 
				
			||||||
      matchRequest,
 | 
					      matchRequest,
 | 
				
			||||||
      defaultParams,
 | 
					      defaultParams,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue