time request
This commit is contained in:
		
							parent
							
								
									2ffa40aa53
								
							
						
					
					
						commit
						56bdd11970
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { ConfigService } from '@nestjs/config';
 | 
					import { ConfigService } from '@nestjs/config';
 | 
				
			||||||
import { IDefaultParams } from '../../domain/interfaces/default-params.interface';
 | 
					import { IDefaultParams } from '../../domain/interfaces/default-params.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class DefaultParamsProvider {
 | 
					export class DefaultParamsProvider {
 | 
				
			||||||
| 
						 | 
					@ -8,9 +8,11 @@ export class DefaultParamsProvider {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getParams(): IDefaultParams {
 | 
					  getParams(): IDefaultParams {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      DEFAULT_IDENTIFIER: this.configService.get<number>('DEFAULT_IDENTIFIER'),
 | 
					      DEFAULT_IDENTIFIER: parseInt(
 | 
				
			||||||
      MARGIN_DURATION: this.configService.get<number>('MARGIN_DURATION'),
 | 
					        this.configService.get('DEFAULT_IDENTIFIER'),
 | 
				
			||||||
      VALIDITY_DURATION: this.configService.get<number>('VALIDITY_DURATION'),
 | 
					      ),
 | 
				
			||||||
 | 
					      MARGIN_DURATION: parseInt(this.configService.get('MARGIN_DURATION')),
 | 
				
			||||||
 | 
					      VALIDITY_DURATION: parseInt(this.configService.get('VALIDITY_DURATION')),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
export type MarginDurations = {
 | 
					 | 
				
			||||||
  mon: number;
 | 
					 | 
				
			||||||
  tue: number;
 | 
					 | 
				
			||||||
  wed: number;
 | 
					 | 
				
			||||||
  thu: number;
 | 
					 | 
				
			||||||
  fri: number;
 | 
					 | 
				
			||||||
  sat: number;
 | 
					 | 
				
			||||||
  sun: number;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					@ -11,16 +11,13 @@ import {
 | 
				
			||||||
} from 'class-validator';
 | 
					} from 'class-validator';
 | 
				
			||||||
import { AutoMap } from '@automapper/classes';
 | 
					import { AutoMap } from '@automapper/classes';
 | 
				
			||||||
import { Point } from '../entities/point.type';
 | 
					import { Point } from '../entities/point.type';
 | 
				
			||||||
import { Schedule } from './schedule.type';
 | 
					import { Schedule } from '../entities/schedule.type';
 | 
				
			||||||
import { MarginDurations } from './margin-durations.type';
 | 
					import { MarginDurations } from '../entities/margin-durations.type';
 | 
				
			||||||
import { Algorithm } from './algorithm.enum';
 | 
					import { Algorithm } from './algorithm.enum';
 | 
				
			||||||
import { IRequestTime } from '../interfaces/time-request.interface';
 | 
					import { IRequestTime } from '../interfaces/time-request.interface';
 | 
				
			||||||
import { IRequestRole } from '../interfaces/role-request.interface';
 | 
					 | 
				
			||||||
import { IRequestPerson } from '../interfaces/person-request.interface';
 | 
					import { IRequestPerson } from '../interfaces/person-request.interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MatchRequest
 | 
					export class MatchRequest implements IRequestTime, IRequestPerson {
 | 
				
			||||||
  implements IRequestTime, IRequestRole, IRequestPerson
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  @IsArray()
 | 
					  @IsArray()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  waypoints: Array<Point>;
 | 
					  waypoints: Array<Point>;
 | 
				
			||||||
| 
						 | 
					@ -50,9 +47,9 @@ export class MatchRequest
 | 
				
			||||||
  passenger: boolean;
 | 
					  passenger: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsInt()
 | 
					  @IsString()
 | 
				
			||||||
  @AutoMap()
 | 
					  @AutoMap()
 | 
				
			||||||
  toDate: number;
 | 
					  toDate: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @IsOptional()
 | 
					  @IsOptional()
 | 
				
			||||||
  @IsInt()
 | 
					  @IsInt()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
export type Schedule = {
 | 
					 | 
				
			||||||
  mon: string;
 | 
					 | 
				
			||||||
  tue: string;
 | 
					 | 
				
			||||||
  wed: string;
 | 
					 | 
				
			||||||
  thu: string;
 | 
					 | 
				
			||||||
  fri: string;
 | 
					 | 
				
			||||||
  sat: string;
 | 
					 | 
				
			||||||
  sun: string;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					export type MarginDurations = {
 | 
				
			||||||
 | 
					  mon?: number;
 | 
				
			||||||
 | 
					  tue?: number;
 | 
				
			||||||
 | 
					  wed?: number;
 | 
				
			||||||
 | 
					  thu?: number;
 | 
				
			||||||
 | 
					  fri?: number;
 | 
				
			||||||
 | 
					  sat?: number;
 | 
				
			||||||
 | 
					  sun?: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					export type Schedule = {
 | 
				
			||||||
 | 
					  mon?: string;
 | 
				
			||||||
 | 
					  tue?: string;
 | 
				
			||||||
 | 
					  wed?: string;
 | 
				
			||||||
 | 
					  thu?: string;
 | 
				
			||||||
 | 
					  fri?: string;
 | 
				
			||||||
 | 
					  sat?: string;
 | 
				
			||||||
 | 
					  sun?: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,10 @@
 | 
				
			||||||
import { MatcherException } from '../../exceptions/matcher.exception';
 | 
					import { MatcherException } from '../../exceptions/matcher.exception';
 | 
				
			||||||
 | 
					import { MarginDurations } from './margin-durations.type';
 | 
				
			||||||
import { IRequestTime } from '../interfaces/time-request.interface';
 | 
					import { IRequestTime } from '../interfaces/time-request.interface';
 | 
				
			||||||
import { TimingFrequency } from './timing';
 | 
					import { TimingDays, TimingFrequency } from './timing';
 | 
				
			||||||
 | 
					import { Schedule } from './schedule.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class Time {
 | 
					export class Time {
 | 
				
			||||||
  _timeRequest: IRequestTime;
 | 
					  _timeRequest: IRequestTime;
 | 
				
			||||||
| 
						 | 
					@ -9,8 +13,8 @@ export class Time {
 | 
				
			||||||
  frequency: TimingFrequency;
 | 
					  frequency: TimingFrequency;
 | 
				
			||||||
  fromDate: Date;
 | 
					  fromDate: Date;
 | 
				
			||||||
  toDate: Date;
 | 
					  toDate: Date;
 | 
				
			||||||
  schedule: Array<Date>;
 | 
					  schedule: Schedule;
 | 
				
			||||||
  marginDurations: Array<number>;
 | 
					  marginDurations: MarginDurations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    timeRequest: IRequestTime,
 | 
					    timeRequest: IRequestTime,
 | 
				
			||||||
| 
						 | 
					@ -20,12 +24,25 @@ export class Time {
 | 
				
			||||||
    this._timeRequest = timeRequest;
 | 
					    this._timeRequest = timeRequest;
 | 
				
			||||||
    this._defaultMarginDuration = defaultMarginDuration;
 | 
					    this._defaultMarginDuration = defaultMarginDuration;
 | 
				
			||||||
    this._defaultValidityDuration = defaultValidityDuration;
 | 
					    this._defaultValidityDuration = defaultValidityDuration;
 | 
				
			||||||
 | 
					    this.schedule = {};
 | 
				
			||||||
 | 
					    this.marginDurations = {
 | 
				
			||||||
 | 
					      mon: defaultMarginDuration,
 | 
				
			||||||
 | 
					      tue: defaultMarginDuration,
 | 
				
			||||||
 | 
					      wed: defaultMarginDuration,
 | 
				
			||||||
 | 
					      thu: defaultMarginDuration,
 | 
				
			||||||
 | 
					      fri: defaultMarginDuration,
 | 
				
			||||||
 | 
					      sat: defaultMarginDuration,
 | 
				
			||||||
 | 
					      sun: defaultMarginDuration,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init() {
 | 
					  init() {
 | 
				
			||||||
    this._validateBaseDate();
 | 
					    this._validateBaseDate();
 | 
				
			||||||
    this._validatePunctualDate();
 | 
					    this._validatePunctualRequest();
 | 
				
			||||||
    this._validateRecurrentDate();
 | 
					    this._validateRecurrentRequest();
 | 
				
			||||||
 | 
					    this._setPunctualRequest();
 | 
				
			||||||
 | 
					    this._setRecurrentRequest();
 | 
				
			||||||
 | 
					    this._setMargindurations();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _validateBaseDate() {
 | 
					  _validateBaseDate() {
 | 
				
			||||||
| 
						 | 
					@ -34,25 +51,118 @@ export class Time {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _validatePunctualDate() {
 | 
					  _validatePunctualRequest() {
 | 
				
			||||||
    if (this._timeRequest.departure) {
 | 
					    if (this._timeRequest.departure) {
 | 
				
			||||||
      this.fromDate = new Date(this._timeRequest.departure);
 | 
					      this.fromDate = this.toDate = new Date(this._timeRequest.departure);
 | 
				
			||||||
      if (!this._isDate(this.fromDate)) {
 | 
					      if (!this._isDate(this.fromDate)) {
 | 
				
			||||||
        throw new MatcherException(3, 'Wrong departure date');
 | 
					        throw new MatcherException(3, 'Wrong departure date');
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _validateRecurrentDate() {
 | 
					  _validateRecurrentRequest() {
 | 
				
			||||||
    if (this._timeRequest.fromDate) {
 | 
					    if (this._timeRequest.fromDate) {
 | 
				
			||||||
      this.fromDate = new Date(this._timeRequest.fromDate);
 | 
					      this.fromDate = new Date(this._timeRequest.fromDate);
 | 
				
			||||||
      if (!this._isDate(this.fromDate)) {
 | 
					      if (!this._isDate(this.fromDate)) {
 | 
				
			||||||
        throw new MatcherException(3, 'Wrong fromDate');
 | 
					        throw new MatcherException(3, 'Wrong fromDate');
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (this._timeRequest.toDate) {
 | 
				
			||||||
 | 
					      this.toDate = new Date(this._timeRequest.toDate);
 | 
				
			||||||
 | 
					      if (!this._isDate(this.toDate)) {
 | 
				
			||||||
 | 
					        throw new MatcherException(3, 'Wrong toDate');
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (this._timeRequest.fromDate) {
 | 
				
			||||||
 | 
					      this._validateSchedule();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _isDate(date: Date) {
 | 
					  _validateSchedule() {
 | 
				
			||||||
 | 
					    if (!this._timeRequest.schedule) {
 | 
				
			||||||
 | 
					      throw new MatcherException(3, 'Schedule is required');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					      !Object.keys(this._timeRequest.schedule).some((elem) =>
 | 
				
			||||||
 | 
					        days.includes(elem),
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					      throw new MatcherException(3, 'No valid day in the given schedule');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Object.keys(this._timeRequest.schedule).map((day) => {
 | 
				
			||||||
 | 
					      const time = new Date('1970-01-01 ' + this._timeRequest.schedule[day]);
 | 
				
			||||||
 | 
					      if (!this._isDate(time)) {
 | 
				
			||||||
 | 
					        throw new MatcherException(3, `Wrong time for ${day} in schedule`);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setPunctualRequest() {
 | 
				
			||||||
 | 
					    if (this._timeRequest.departure) {
 | 
				
			||||||
 | 
					      this.frequency = TimingFrequency.FREQUENCY_PUNCTUAL;
 | 
				
			||||||
 | 
					      this.schedule[TimingDays[this.fromDate.getDay()]] =
 | 
				
			||||||
 | 
					        this.fromDate.getHours() + ':' + this.fromDate.getMinutes();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setRecurrentRequest() {
 | 
				
			||||||
 | 
					    if (this._timeRequest.fromDate) {
 | 
				
			||||||
 | 
					      this.frequency = TimingFrequency.FREQUENCY_RECURRENT;
 | 
				
			||||||
 | 
					      if (!this.toDate) {
 | 
				
			||||||
 | 
					        this.toDate = this._addDays(
 | 
				
			||||||
 | 
					          this.fromDate,
 | 
				
			||||||
 | 
					          this._defaultValidityDuration,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this._setSchedule();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setSchedule() {
 | 
				
			||||||
 | 
					    Object.keys(this._timeRequest.schedule).map((day) => {
 | 
				
			||||||
 | 
					      this.schedule[day] = this._timeRequest.schedule[day];
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setMargindurations() {
 | 
				
			||||||
 | 
					    if (this._timeRequest.marginDuration) {
 | 
				
			||||||
 | 
					      const duration = Math.abs(this._timeRequest.marginDuration);
 | 
				
			||||||
 | 
					      this.marginDurations = {
 | 
				
			||||||
 | 
					        mon: duration,
 | 
				
			||||||
 | 
					        tue: duration,
 | 
				
			||||||
 | 
					        wed: duration,
 | 
				
			||||||
 | 
					        thu: duration,
 | 
				
			||||||
 | 
					        fri: duration,
 | 
				
			||||||
 | 
					        sat: duration,
 | 
				
			||||||
 | 
					        sun: duration,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (this._timeRequest.marginDurations) {
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        !Object.keys(this._timeRequest.marginDurations).some((elem) =>
 | 
				
			||||||
 | 
					          days.includes(elem),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					      ) {
 | 
				
			||||||
 | 
					        throw new MatcherException(
 | 
				
			||||||
 | 
					          3,
 | 
				
			||||||
 | 
					          'No valid day in the given margin durations',
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      Object.keys(this._timeRequest.marginDurations).map((day) => {
 | 
				
			||||||
 | 
					        this.marginDurations[day] = Math.abs(
 | 
				
			||||||
 | 
					          this._timeRequest.marginDurations[day],
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _isDate = (date: Date): boolean => {
 | 
				
			||||||
    return date instanceof Date && isFinite(+date);
 | 
					    return date instanceof Date && isFinite(+date);
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _addDays = (date: Date, days: number): Date => {
 | 
				
			||||||
 | 
					    const result = new Date(date);
 | 
				
			||||||
 | 
					    result.setDate(result.getDate() + days);
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,11 +4,11 @@ export enum TimingFrequency {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum TimingDays {
 | 
					export enum TimingDays {
 | 
				
			||||||
 | 
					  'sun',
 | 
				
			||||||
  'mon',
 | 
					  'mon',
 | 
				
			||||||
  'tue',
 | 
					  'tue',
 | 
				
			||||||
  'wed',
 | 
					  'wed',
 | 
				
			||||||
  'thu',
 | 
					  'thu',
 | 
				
			||||||
  'fri',
 | 
					  'fri',
 | 
				
			||||||
  'sat',
 | 
					  'sat',
 | 
				
			||||||
  'sun',
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
export interface IDefaultParams {
 | 
					export type IDefaultParams = {
 | 
				
			||||||
  DEFAULT_IDENTIFIER: number;
 | 
					  DEFAULT_IDENTIFIER: number;
 | 
				
			||||||
  MARGIN_DURATION: number;
 | 
					  MARGIN_DURATION: number;
 | 
				
			||||||
  VALIDITY_DURATION: number;
 | 
					  VALIDITY_DURATION: number;
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
export interface IRequestPerson {
 | 
					export interface IRequestPerson {
 | 
				
			||||||
  identifier: number;
 | 
					  identifier?: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +0,0 @@
 | 
				
			||||||
export interface IRequestRole {
 | 
					 | 
				
			||||||
  driver: boolean;
 | 
					 | 
				
			||||||
  passenger: boolean;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,11 @@
 | 
				
			||||||
import { Schedule } from '../dtos/schedule.type';
 | 
					import { MarginDurations } from '../entities/margin-durations.type';
 | 
				
			||||||
 | 
					import { Schedule } from '../entities/schedule.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IRequestTime {
 | 
					export interface IRequestTime {
 | 
				
			||||||
  departure?: string;
 | 
					  departure?: string;
 | 
				
			||||||
  fromDate?: string;
 | 
					  fromDate?: string;
 | 
				
			||||||
 | 
					  toDate?: string;
 | 
				
			||||||
  schedule?: Schedule;
 | 
					  schedule?: Schedule;
 | 
				
			||||||
 | 
					  marginDuration?: number;
 | 
				
			||||||
 | 
					  marginDurations?: MarginDurations;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,36 +5,30 @@ import { Requirement } from '../domain/entities/requirement';
 | 
				
			||||||
import { Role } from '../domain/entities/role.enum';
 | 
					import { Role } from '../domain/entities/role.enum';
 | 
				
			||||||
import { Settings } from '../domain/entities/settings';
 | 
					import { Settings } from '../domain/entities/settings';
 | 
				
			||||||
import { Time } from '../domain/entities/time';
 | 
					import { Time } from '../domain/entities/time';
 | 
				
			||||||
import { IDefaultParams } from '../domain/interfaces/default-params.interface';
 | 
					import { IDefaultParams } from '../domain/interfaces/default-params.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MatchQuery {
 | 
					export class MatchQuery {
 | 
				
			||||||
  private readonly _matchRequest: MatchRequest;
 | 
					  private readonly _matchRequest: MatchRequest;
 | 
				
			||||||
  private readonly _defaultParams: IDefaultParams;
 | 
					  private readonly _defaultParams: IDefaultParams;
 | 
				
			||||||
  person: Person;
 | 
					  person: Person;
 | 
				
			||||||
  exclusions: Array<number>;
 | 
					 | 
				
			||||||
  time: Time;
 | 
					 | 
				
			||||||
  geography: Geography;
 | 
					 | 
				
			||||||
  roles: Array<Role>;
 | 
					  roles: Array<Role>;
 | 
				
			||||||
 | 
					  time: Time;
 | 
				
			||||||
 | 
					  exclusions: Array<number>;
 | 
				
			||||||
 | 
					  geography: Geography;
 | 
				
			||||||
  requirement: Requirement;
 | 
					  requirement: Requirement;
 | 
				
			||||||
  settings: Settings;
 | 
					  settings: Settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(matchRequest: MatchRequest, defaultParams: IDefaultParams) {
 | 
					  constructor(matchRequest: MatchRequest, defaultParams: IDefaultParams) {
 | 
				
			||||||
    this._matchRequest = matchRequest;
 | 
					    this._matchRequest = matchRequest;
 | 
				
			||||||
    this._defaultParams = defaultParams;
 | 
					    this._defaultParams = defaultParams;
 | 
				
			||||||
    this._initialize();
 | 
					 | 
				
			||||||
    this._setPerson();
 | 
					    this._setPerson();
 | 
				
			||||||
    this._setExclusions();
 | 
					 | 
				
			||||||
    this._setRoles();
 | 
					    this._setRoles();
 | 
				
			||||||
    this._setTime();
 | 
					    this._setTime();
 | 
				
			||||||
    // console.log(this);
 | 
					    this._initialize();
 | 
				
			||||||
 | 
					    this._setExclusions();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _initialize() {
 | 
					  _initialize() {
 | 
				
			||||||
    if (
 | 
					 | 
				
			||||||
      this._matchRequest.driver === undefined &&
 | 
					 | 
				
			||||||
      this._matchRequest.passenger === undefined
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
      this._matchRequest.passenger = true;
 | 
					 | 
				
			||||||
    this.geography = new Geography();
 | 
					    this.geography = new Geography();
 | 
				
			||||||
    this.requirement = new Requirement();
 | 
					    this.requirement = new Requirement();
 | 
				
			||||||
    this.settings = new Settings();
 | 
					    this.settings = new Settings();
 | 
				
			||||||
| 
						 | 
					@ -49,18 +43,11 @@ export class MatchQuery {
 | 
				
			||||||
    this.person.init();
 | 
					    this.person.init();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _setExclusions() {
 | 
					 | 
				
			||||||
    this.exclusions = [];
 | 
					 | 
				
			||||||
    if (this._matchRequest.identifier)
 | 
					 | 
				
			||||||
      this.exclusions.push(this._matchRequest.identifier);
 | 
					 | 
				
			||||||
    if (this._matchRequest.exclusions)
 | 
					 | 
				
			||||||
      this.exclusions.push(...this._matchRequest.exclusions);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _setRoles() {
 | 
					  _setRoles() {
 | 
				
			||||||
    this.roles = [];
 | 
					    this.roles = [];
 | 
				
			||||||
    if (this._matchRequest.driver) this.roles.push(Role.DRIVER);
 | 
					    if (this._matchRequest.driver) this.roles.push(Role.DRIVER);
 | 
				
			||||||
    if (this._matchRequest.passenger) this.roles.push(Role.PASSENGER);
 | 
					    if (this._matchRequest.passenger) this.roles.push(Role.PASSENGER);
 | 
				
			||||||
 | 
					    if (this.roles.length == 0) this.roles.push(Role.PASSENGER);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _setTime() {
 | 
					  _setTime() {
 | 
				
			||||||
| 
						 | 
					@ -71,4 +58,12 @@ export class MatchQuery {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    this.time.init();
 | 
					    this.time.init();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _setExclusions() {
 | 
				
			||||||
 | 
					    this.exclusions = [];
 | 
				
			||||||
 | 
					    if (this._matchRequest.identifier)
 | 
				
			||||||
 | 
					      this.exclusions.push(this._matchRequest.identifier);
 | 
				
			||||||
 | 
					    if (this._matchRequest.exclusions)
 | 
				
			||||||
 | 
					      this.exclusions.push(...this._matchRequest.exclusions);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
import { ConfigService } from '@nestjs/config';
 | 
					import { ConfigService } from '@nestjs/config';
 | 
				
			||||||
import { Test, TestingModule } from '@nestjs/testing';
 | 
					import { Test, TestingModule } from '@nestjs/testing';
 | 
				
			||||||
import { DefaultParamsProvider } from '../../adapters/secondaries/default-params.provider';
 | 
					import { DefaultParamsProvider } from '../../adapters/secondaries/default-params.provider';
 | 
				
			||||||
import { IDefaultParams } from '../../domain/interfaces/default-params.interface';
 | 
					import { IDefaultParams } from '../../domain/interfaces/default-params.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mockConfigService = {
 | 
					const mockConfigService = {
 | 
				
			||||||
  get: jest.fn().mockImplementationOnce(() => 99),
 | 
					  get: jest.fn().mockImplementationOnce(() => 99),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ import { MatchQuery } from '../../queries/match.query';
 | 
				
			||||||
import { AdRepository } from '../../adapters/secondaries/ad.repository';
 | 
					import { AdRepository } from '../../adapters/secondaries/ad.repository';
 | 
				
			||||||
import { AutomapperModule } from '@automapper/nestjs';
 | 
					import { AutomapperModule } from '@automapper/nestjs';
 | 
				
			||||||
import { classes } from '@automapper/classes';
 | 
					import { classes } from '@automapper/classes';
 | 
				
			||||||
import { IDefaultParams } from '../../domain/interfaces/default-params.interface';
 | 
					import { IDefaultParams } from '../../domain/interfaces/default-params.type';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mockAdRepository = {};
 | 
					const mockAdRepository = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					import { Person } from '../../domain/entities/person';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DEFAULT_IDENTIFIER = 0;
 | 
				
			||||||
 | 
					const MARGIN_DURATION = 900;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Person entity', () => {
 | 
				
			||||||
 | 
					  it('should be defined', () => {
 | 
				
			||||||
 | 
					    const person = new Person(
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        identifier: 1,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      DEFAULT_IDENTIFIER,
 | 
				
			||||||
 | 
					      MARGIN_DURATION,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    expect(person).toBeDefined();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('init', () => {
 | 
				
			||||||
 | 
					    it('should initialize a person with an identifier', () => {
 | 
				
			||||||
 | 
					      const person = new Person(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          identifier: 1,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        DEFAULT_IDENTIFIER,
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      person.init();
 | 
				
			||||||
 | 
					      expect(person.identifier).toBe(1);
 | 
				
			||||||
 | 
					      expect(person.marginDurations[0]).toBe(900);
 | 
				
			||||||
 | 
					      expect(person.marginDurations[6]).toBe(900);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should initialize a person without an identifier', () => {
 | 
				
			||||||
 | 
					      const person = new Person({}, DEFAULT_IDENTIFIER, MARGIN_DURATION);
 | 
				
			||||||
 | 
					      person.init();
 | 
				
			||||||
 | 
					      expect(person.identifier).toBe(0);
 | 
				
			||||||
 | 
					      expect(person.marginDurations[0]).toBe(900);
 | 
				
			||||||
 | 
					      expect(person.marginDurations[6]).toBe(900);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -1,31 +1,14 @@
 | 
				
			||||||
import { Time } from '../../domain/entities/time';
 | 
					import { Time } from '../../domain/entities/time';
 | 
				
			||||||
import { IRequestTime } from '../../domain/interfaces/time-request.interface';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MARGIN_DURATION = 900;
 | 
					const MARGIN_DURATION = 900;
 | 
				
			||||||
const VALIDITY_DURATION = 365;
 | 
					const VALIDITY_DURATION = 365;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const punctualTimeRequest: IRequestTime = {
 | 
					 | 
				
			||||||
  departure: '2023-04-01 12:24:00',
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const invalidPunctualTimeRequest: IRequestTime = {
 | 
					 | 
				
			||||||
  departure: '2023-15-01 12:24:00',
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const recurrentTimeRequest: IRequestTime = {
 | 
					 | 
				
			||||||
  fromDate: '2023-04-01',
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const invalidRecurrentTimeRequest: IRequestTime = {
 | 
					 | 
				
			||||||
  fromDate: '2023-15-01',
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const expectedPunctualFromDate = new Date(punctualTimeRequest.departure);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe('Time entity', () => {
 | 
					describe('Time entity', () => {
 | 
				
			||||||
  it('should be defined', () => {
 | 
					  it('should be defined', () => {
 | 
				
			||||||
    const time = new Time(
 | 
					    const time = new Time(
 | 
				
			||||||
      punctualTimeRequest,
 | 
					      {
 | 
				
			||||||
 | 
					        departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      MARGIN_DURATION,
 | 
					      MARGIN_DURATION,
 | 
				
			||||||
      VALIDITY_DURATION,
 | 
					      VALIDITY_DURATION,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
| 
						 | 
					@ -35,24 +18,74 @@ describe('Time entity', () => {
 | 
				
			||||||
  describe('init', () => {
 | 
					  describe('init', () => {
 | 
				
			||||||
    it('should initialize a punctual time request', () => {
 | 
					    it('should initialize a punctual time request', () => {
 | 
				
			||||||
      const time = new Time(
 | 
					      const time = new Time(
 | 
				
			||||||
        punctualTimeRequest,
 | 
					        {
 | 
				
			||||||
 | 
					          departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        MARGIN_DURATION,
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
        VALIDITY_DURATION,
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      time.init();
 | 
					      time.init();
 | 
				
			||||||
      expect(time.fromDate.getFullYear()).toBe(
 | 
					      expect(time.fromDate.getFullYear()).toBe(
 | 
				
			||||||
        expectedPunctualFromDate.getFullYear(),
 | 
					        new Date('2023-04-01 12:24:00').getFullYear(),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('should initialize a punctual time request with specific single margin duration', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					          marginDuration: 300,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      time.init();
 | 
				
			||||||
 | 
					      expect(time.marginDurations['tue']).toBe(300);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should initialize a punctual time request with specific margin durations', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					          marginDurations: {
 | 
				
			||||||
 | 
					            sat: 350,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      time.init();
 | 
				
			||||||
 | 
					      expect(time.marginDurations['tue']).toBe(900);
 | 
				
			||||||
 | 
					      expect(time.marginDurations['sat']).toBe(350);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should initialize a punctual time request with specific single margin duration and margin durations', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					          marginDuration: 500,
 | 
				
			||||||
 | 
					          marginDurations: {
 | 
				
			||||||
 | 
					            sat: 350,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      time.init();
 | 
				
			||||||
 | 
					      expect(time.marginDurations['tue']).toBe(500);
 | 
				
			||||||
 | 
					      expect(time.marginDurations['sat']).toBe(350);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
    it('should initialize a recurrent time request', () => {
 | 
					    it('should initialize a recurrent time request', () => {
 | 
				
			||||||
      const time = new Time(
 | 
					      const time = new Time(
 | 
				
			||||||
        recurrentTimeRequest,
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-04-01',
 | 
				
			||||||
 | 
					          schedule: {
 | 
				
			||||||
 | 
					            mon: '12:00',
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        MARGIN_DURATION,
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
        VALIDITY_DURATION,
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      time.init();
 | 
					      time.init();
 | 
				
			||||||
      expect(time.fromDate.getFullYear()).toBe(
 | 
					      expect(time.fromDate.getFullYear()).toBe(
 | 
				
			||||||
        expectedPunctualFromDate.getFullYear(),
 | 
					        new Date('2023-04-01').getFullYear(),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    it('should throw an exception if no date is provided', () => {
 | 
					    it('should throw an exception if no date is provided', () => {
 | 
				
			||||||
| 
						 | 
					@ -61,19 +94,82 @@ describe('Time entity', () => {
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    it('should throw an exception if punctual date is invalid', () => {
 | 
					    it('should throw an exception if punctual date is invalid', () => {
 | 
				
			||||||
      const time = new Time(
 | 
					      const time = new Time(
 | 
				
			||||||
        invalidPunctualTimeRequest,
 | 
					        {
 | 
				
			||||||
 | 
					          departure: '2023-15-01 12:24:00',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        MARGIN_DURATION,
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
        VALIDITY_DURATION,
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => time.init()).toThrow();
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    it('should throw an exception if recuurent date is invalid', () => {
 | 
					    it('should throw an exception if recurrent fromDate is invalid', () => {
 | 
				
			||||||
      const time = new Time(
 | 
					      const time = new Time(
 | 
				
			||||||
        invalidRecurrentTimeRequest,
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-15-01',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should throw an exception if recurrent toDate is invalid', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-04-01',
 | 
				
			||||||
 | 
					          toDate: '2023-13-01',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should throw an exception if schedule is missing', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-04-01',
 | 
				
			||||||
 | 
					          toDate: '2024-03-31',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should throw an exception if schedule is empty', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-04-01',
 | 
				
			||||||
 | 
					          toDate: '2024-03-31',
 | 
				
			||||||
 | 
					          schedule: {},
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should throw an exception if schedule is invalid', () => {
 | 
				
			||||||
 | 
					      const time = new Time(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fromDate: '2023-04-01',
 | 
				
			||||||
 | 
					          toDate: '2024-03-31',
 | 
				
			||||||
 | 
					          schedule: {
 | 
				
			||||||
 | 
					            mon: '32:78',
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        MARGIN_DURATION,
 | 
					        MARGIN_DURATION,
 | 
				
			||||||
        VALIDITY_DURATION,
 | 
					        VALIDITY_DURATION,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      expect(() => time.init()).toThrow();
 | 
					      expect(() => time.init()).toThrow();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					  it('should throw an exception if margin durations is provided but empty', () => {
 | 
				
			||||||
 | 
					    const time = new Time(
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        departure: '2023-04-01 12:24:00',
 | 
				
			||||||
 | 
					        marginDurations: {},
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      MARGIN_DURATION,
 | 
				
			||||||
 | 
					      VALIDITY_DURATION,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    expect(() => time.init()).toThrow();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue