pretty, lint

This commit is contained in:
sbriat 2023-10-16 17:25:17 +02:00
parent 106c225ee3
commit 3cf2667f92
22 changed files with 101 additions and 132 deletions

View File

@ -155,17 +155,17 @@ The app exposes the following [gRPC](https://grpc.io/) services :
{ {
"day": 1, "day": 1,
"time": "07:00", "time": "07:00",
"margin": 600, "margin": 600
}, },
{ {
"day": 2, "day": 2,
"time": "07:05", "time": "07:05",
"margin": 600, "margin": 600
}, },
{ {
"day": 5, "day": 5,
"time": "07:10", "time": "07:10",
"margin": 600, "margin": 600
} }
], ],
"waypoints": [ "waypoints": [

View File

@ -26,10 +26,14 @@ import { HEALTH_CRITICAL_LOGGING_KEY, SERVICE_NAME } from './app.constants';
useFactory: async ( useFactory: async (
configService: ConfigService, configService: ConfigService,
): Promise<ConfigurationModuleOptions> => ({ ): Promise<ConfigurationModuleOptions> => ({
domain: configService.get<string>('SERVICE_CONFIGURATION_DOMAIN') as string, domain: configService.get<string>(
'SERVICE_CONFIGURATION_DOMAIN',
) as string,
messageBroker: { messageBroker: {
uri: configService.get<string>('MESSAGE_BROKER_URI') as string, uri: configService.get<string>('MESSAGE_BROKER_URI') as string,
exchange: configService.get<string>('MESSAGE_BROKER_EXCHANGE') as string, exchange: configService.get<string>(
'MESSAGE_BROKER_EXCHANGE',
) as string,
}, },
redis: { redis: {
host: configService.get<string>('REDIS_HOST') as string, host: configService.get<string>('REDIS_HOST') as string,

View File

@ -81,11 +81,6 @@ const adapters: Provider[] = [
...orms, ...orms,
...adapters, ...adapters,
], ],
exports: [ exports: [PrismaService, AdMapper, AD_REPOSITORY, TIMEZONE_FINDER],
PrismaService,
AdMapper,
AD_REPOSITORY,
TIMEZONE_FINDER,
],
}) })
export class AdModule {} export class AdModule {}

View File

@ -15,26 +15,48 @@ import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port';
@CommandHandler(CreateAdCommand) @CommandHandler(CreateAdCommand)
export class CreateAdService implements ICommandHandler { export class CreateAdService implements ICommandHandler {
constructor( constructor(
@Inject(AD_REPOSITORY) @Inject(AD_REPOSITORY)
private readonly repository: AdRepositoryPort, private readonly repository: AdRepositoryPort,
@Inject(INPUT_DATETIME_TRANSFORMER) @Inject(INPUT_DATETIME_TRANSFORMER)
private readonly datetimeTransformer: DateTimeTransformerPort, private readonly datetimeTransformer: DateTimeTransformerPort,
) { ) {}
}
async execute(command: CreateAdCommand): Promise<AggregateID> { async execute(command: CreateAdCommand): Promise<AggregateID> {
const ad = AdEntity.create( const ad = AdEntity.create({
{ userId: command.userId,
userId: command.userId, driver: command.driver,
driver: command.driver, passenger: command.passenger,
passenger: command.passenger, frequency: command.frequency,
frequency: command.frequency, fromDate: this.datetimeTransformer.fromDate(
fromDate: this.datetimeTransformer.fromDate( {
date: command.fromDate,
time: command.schedule[0].time,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
},
},
command.frequency,
),
toDate: this.datetimeTransformer.toDate(
command.toDate,
{
date: command.fromDate,
time: command.schedule[0].time,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
},
},
command.frequency,
),
schedule: command.schedule.map((scheduleItem: ScheduleItem) => ({
day: this.datetimeTransformer.day(
scheduleItem.day,
{ {
date: command.fromDate, date: command.fromDate,
time: command.schedule[0].time, time: scheduleItem.time,
coordinates: { coordinates: {
lon: command.waypoints[0].lon, lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat, lat: command.waypoints[0].lat,
@ -42,11 +64,10 @@ export class CreateAdService implements ICommandHandler {
}, },
command.frequency, command.frequency,
), ),
toDate: this.datetimeTransformer.toDate( time: this.datetimeTransformer.time(
command.toDate,
{ {
date: command.fromDate, date: command.fromDate,
time: command.schedule[0].time, time: scheduleItem.time,
coordinates: { coordinates: {
lon: command.waypoints[0].lon, lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat, lat: command.waypoints[0].lat,
@ -54,52 +75,27 @@ export class CreateAdService implements ICommandHandler {
}, },
command.frequency, command.frequency,
), ),
schedule: command.schedule.map((scheduleItem: ScheduleItem) => ({ margin: scheduleItem.margin,
day: this.datetimeTransformer.day( })),
scheduleItem.day, seatsProposed: command.seatsProposed ?? 0,
{ seatsRequested: command.seatsRequested ?? 0,
date: command.fromDate, strict: command.strict,
time: scheduleItem.time, waypoints: command.waypoints.map((waypoint: Waypoint) => ({
coordinates: { position: waypoint.position,
lon: command.waypoints[0].lon, address: {
lat: command.waypoints[0].lat, name: waypoint.name,
}, houseNumber: waypoint.houseNumber,
}, street: waypoint.street,
command.frequency, postalCode: waypoint.postalCode,
), locality: waypoint.locality,
time: this.datetimeTransformer.time( country: waypoint.country,
{ coordinates: {
date: command.fromDate, lon: waypoint.lon,
time: scheduleItem.time, lat: waypoint.lat,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
},
},
command.frequency,
),
margin: scheduleItem.margin,
})),
seatsProposed: command.seatsProposed ?? 0,
seatsRequested: command.seatsRequested ?? 0,
strict: command.strict,
waypoints: command.waypoints.map((waypoint: Waypoint) => ({
position: waypoint.position,
address: {
name: waypoint.name,
houseNumber: waypoint.houseNumber,
street: waypoint.street,
postalCode: waypoint.postalCode,
locality: waypoint.locality,
country: waypoint.country,
coordinates: {
lon: waypoint.lon,
lat: waypoint.lat,
},
}, },
})), },
}, })),
); });
try { try {
await this.repository.insert(ad); await this.repository.insert(ad);

View File

@ -8,9 +8,7 @@ import { WaypointProps } from './value-objects/waypoint.value-object';
export class AdEntity extends AggregateRoot<AdProps> { export class AdEntity extends AggregateRoot<AdProps> {
protected readonly _id: AggregateID; protected readonly _id: AggregateID;
static create = ( static create = (create: CreateAdProps): AdEntity => {
create: CreateAdProps
): AdEntity => {
const id = v4(); const id = v4();
const props: AdProps = { ...create }; const props: AdProps = { ...create };
const ad = new AdEntity({ id, props }); const ad = new AdEntity({ id, props });

View File

@ -5,10 +5,7 @@ import {
GeoDateTime, GeoDateTime,
} from '../core/application/ports/datetime-transformer.port'; } from '../core/application/ports/datetime-transformer.port';
import { TimeConverterPort } from '../core/application/ports/time-converter.port'; import { TimeConverterPort } from '../core/application/ports/time-converter.port';
import { import { TIMEZONE_FINDER, TIME_CONVERTER } from '../ad.di-tokens';
TIMEZONE_FINDER,
TIME_CONVERTER,
} from '../ad.di-tokens';
import { TimezoneFinderPort } from '../core/application/ports/timezone-finder.port'; import { TimezoneFinderPort } from '../core/application/ports/timezone-finder.port';
@Injectable() @Injectable()
@ -17,8 +14,7 @@ export class InputDateTimeTransformer implements DateTimeTransformerPort {
@Inject(TIMEZONE_FINDER) @Inject(TIMEZONE_FINDER)
private readonly timezoneFinder: TimezoneFinderPort, private readonly timezoneFinder: TimezoneFinderPort,
@Inject(TIME_CONVERTER) private readonly timeConverter: TimeConverterPort, @Inject(TIME_CONVERTER) private readonly timeConverter: TimeConverterPort,
) { ) {}
}
/** /**
* Compute the fromDate : if an ad is punctual, the departure date * Compute the fromDate : if an ad is punctual, the departure date

View File

@ -1,4 +1,4 @@
import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
@Injectable() @Injectable()

View File

@ -4,8 +4,5 @@ import { TimezoneFinderPort } from '../core/application/ports/timezone-finder.po
@Injectable() @Injectable()
export class TimezoneFinder implements TimezoneFinderPort { export class TimezoneFinder implements TimezoneFinderPort {
timezones = ( timezones = (lon: number, lat: number): string[] => find(lat, lon);
lon: number,
lat: number,
): string[] => find(lat, lon);
} }

View File

@ -24,16 +24,16 @@ export class CreateAdRequestDto {
@IsBoolean() @IsBoolean()
@HasRole('passenger', { @HasRole('passenger', {
message: 'At least one of driver or passenger property needs to be truthy' message: 'At least one of driver or passenger property needs to be truthy',
}) })
@HasSeats('seatsProposed', { @HasSeats('seatsProposed', {
message: 'Number of seats proposed as a driver is required' message: 'Number of seats proposed as a driver is required',
}) })
driver: boolean; driver: boolean;
@IsBoolean() @IsBoolean()
@HasSeats('seatsRequested', { @HasSeats('seatsRequested', {
message: 'Number of seats requested as a passenger is required' message: 'Number of seats requested as a passenger is required',
}) })
passenger: boolean; passenger: boolean;

View File

@ -1,4 +1,4 @@
import { IsOptional, IsMilitaryTime, IsInt, Min, Max } from 'class-validator'; import { IsMilitaryTime, IsInt, Min, Max } from 'class-validator';
export class ScheduleItemDto { export class ScheduleItemDto {
@IsInt() @IsInt()

View File

@ -19,7 +19,7 @@ export function HasRole(
validate(value: any, args: ValidationArguments) { validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints; const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName]; const relatedValue = (args.object as any)[relatedPropertyName];
return value || relatedValue; return value || relatedValue;
}, },
}, },
}); });

View File

@ -19,7 +19,7 @@ export function HasSeats(
validate(value: any, args: ValidationArguments) { validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints; const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName]; const relatedValue = (args.object as any)[relatedPropertyName];
return (value && relatedValue>0) || !value; return (value && relatedValue > 0) || !value;
}, },
}, },
}); });

View File

@ -1,4 +1,4 @@
import { IsInt, IsOptional } from 'class-validator'; import { IsInt } from 'class-validator';
import { AddressDto } from './address.dto'; import { AddressDto } from './address.dto';
export class WaypointDto extends AddressDto { export class WaypointDto extends AddressDto {

View File

@ -7,10 +7,7 @@ import {
} from '@modules/ad/ad.di-tokens'; } from '@modules/ad/ad.di-tokens';
import { AdMapper } from '@modules/ad/ad.mapper'; import { AdMapper } from '@modules/ad/ad.mapper';
import { AdEntity } from '@modules/ad/core/domain/ad.entity'; import { AdEntity } from '@modules/ad/core/domain/ad.entity';
import { import { CreateAdProps, Frequency } from '@modules/ad/core/domain/ad.types';
CreateAdProps,
Frequency,
} from '@modules/ad/core/domain/ad.types';
import { AdRepository } from '@modules/ad/infrastructure/ad.repository'; import { AdRepository } from '@modules/ad/infrastructure/ad.repository';
import { OutputDateTimeTransformer } from '@modules/ad/infrastructure/output-datetime-transformer'; import { OutputDateTimeTransformer } from '@modules/ad/infrastructure/output-datetime-transformer';
import { PrismaService } from '@modules/ad/infrastructure/prisma.service'; import { PrismaService } from '@modules/ad/infrastructure/prisma.service';
@ -230,9 +227,7 @@ describe('Ad Repository', () => {
], ],
}; };
const adToCreate: AdEntity = AdEntity.create( const adToCreate: AdEntity = AdEntity.create(createAdProps);
createAdProps,
);
await adRepository.insert(adToCreate); await adRepository.insert(adToCreate);
const afterCount = await prismaService.ad.count(); const afterCount = await prismaService.ad.count();
@ -308,9 +303,7 @@ describe('Ad Repository', () => {
], ],
}; };
const adToCreate: AdEntity = AdEntity.create( const adToCreate: AdEntity = AdEntity.create(createAdProps);
createAdProps,
);
await adRepository.insert(adToCreate); await adRepository.insert(adToCreate);
const afterCount = await prismaService.ad.count(); const afterCount = await prismaService.ad.count();

View File

@ -1,8 +1,5 @@
import { AdEntity } from '@modules/ad/core/domain/ad.entity'; import { AdEntity } from '@modules/ad/core/domain/ad.entity';
import { import { CreateAdProps, Frequency } from '@modules/ad/core/domain/ad.types';
CreateAdProps,
Frequency,
} from '@modules/ad/core/domain/ad.types';
import { WaypointProps } from '@modules/ad/core/domain/value-objects/waypoint.value-object'; import { WaypointProps } from '@modules/ad/core/domain/value-objects/waypoint.value-object';
const originWaypointProps: WaypointProps = { const originWaypointProps: WaypointProps = {

View File

@ -102,9 +102,8 @@ describe('create-ad.service', () => {
AdEntity.create = jest.fn().mockReturnValue({ AdEntity.create = jest.fn().mockReturnValue({
id: '047a6ecf-23d4-4d3e-877c-3225d560a8da', id: '047a6ecf-23d4-4d3e-877c-3225d560a8da',
}); });
const result: AggregateID = await createAdService.execute( const result: AggregateID =
createAdCommand, await createAdService.execute(createAdCommand);
);
expect(result).toBe('047a6ecf-23d4-4d3e-877c-3225d560a8da'); expect(result).toBe('047a6ecf-23d4-4d3e-877c-3225d560a8da');
}); });
it('should throw an error if something bad happens', async () => { it('should throw an error if something bad happens', async () => {

View File

@ -1,9 +1,6 @@
import { AD_REPOSITORY } from '@modules/ad/ad.di-tokens'; import { AD_REPOSITORY } from '@modules/ad/ad.di-tokens';
import { AdEntity } from '@modules/ad/core/domain/ad.entity'; import { AdEntity } from '@modules/ad/core/domain/ad.entity';
import { import { CreateAdProps, Frequency } from '@modules/ad/core/domain/ad.types';
CreateAdProps,
Frequency,
} from '@modules/ad/core/domain/ad.types';
import { FindAdByIdQuery } from '@modules/ad/core/application/queries/find-ad-by-id/find-ad-by-id.query'; import { FindAdByIdQuery } from '@modules/ad/core/application/queries/find-ad-by-id/find-ad-by-id.query';
import { FindAdByIdQueryHandler } from '@modules/ad/core/application/queries/find-ad-by-id/find-ad-by-id.query-handler'; import { FindAdByIdQueryHandler } from '@modules/ad/core/application/queries/find-ad-by-id/find-ad-by-id.query-handler';
import { WaypointProps } from '@modules/ad/core/domain/value-objects/waypoint.value-object'; import { WaypointProps } from '@modules/ad/core/domain/value-objects/waypoint.value-object';
@ -59,9 +56,7 @@ const punctualPassengerCreateAdProps: CreateAdProps = {
passenger: true, passenger: true,
}; };
const ad: AdEntity = AdEntity.create( const ad: AdEntity = AdEntity.create(punctualPassengerCreateAdProps);
punctualPassengerCreateAdProps,
);
const mockAdRepository = { const mockAdRepository = {
findOneById: jest.fn().mockImplementation(() => ad), findOneById: jest.fn().mockImplementation(() => ad),
@ -95,9 +90,8 @@ describe('find-ad-by-id.query-handler', () => {
const findAdbyIdQuery = new FindAdByIdQuery( const findAdbyIdQuery = new FindAdByIdQuery(
'dd264806-13b4-4226-9b18-87adf0ad5dd1', 'dd264806-13b4-4226-9b18-87adf0ad5dd1',
); );
const ad: AdEntity = await findAdByIdQueryHandler.execute( const ad: AdEntity =
findAdbyIdQuery, await findAdByIdQueryHandler.execute(findAdbyIdQuery);
);
expect(ad.getProps().fromDate).toBe('2023-06-22'); expect(ad.getProps().fromDate).toBe('2023-06-22');
}); });
}); });

View File

@ -1,7 +1,4 @@
import { import { TIMEZONE_FINDER, TIME_CONVERTER } from '@modules/ad/ad.di-tokens';
TIMEZONE_FINDER,
TIME_CONVERTER,
} from '@modules/ad/ad.di-tokens';
import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port'; import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port';
import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.port'; import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.port';
import { TimezoneFinderPort } from '@modules/ad/core/application/ports/timezone-finder.port'; import { TimezoneFinderPort } from '@modules/ad/core/application/ports/timezone-finder.port';

View File

@ -1,7 +1,4 @@
import { import { TIMEZONE_FINDER, TIME_CONVERTER } from '@modules/ad/ad.di-tokens';
TIMEZONE_FINDER,
TIME_CONVERTER,
} from '@modules/ad/ad.di-tokens';
import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port'; import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port';
import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.port'; import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.port';
import { TimezoneFinderPort } from '@modules/ad/core/application/ports/timezone-finder.port'; import { TimezoneFinderPort } from '@modules/ad/core/application/ports/timezone-finder.port';

View File

@ -4,13 +4,13 @@ import { Validator } from 'class-validator';
describe('has seats decorator', () => { describe('has seats decorator', () => {
class MyClass { class MyClass {
@HasSeats('seatsProposed') @HasSeats('seatsProposed')
driver:boolean; driver: boolean;
@HasSeats('seatsRequested') @HasSeats('seatsRequested')
passenger: boolean; passenger: boolean;
seatsProposed?: number; seatsProposed?: number;
seatsRequested?: number; seatsRequested?: number;
} }
it('should return a property decorator has a function', () => { it('should return a property decorator has a function', () => {
const hasSeats = HasSeats('property'); const hasSeats = HasSeats('property');
expect(typeof hasSeats).toBe('function'); expect(typeof hasSeats).toBe('function');

View File

@ -1,5 +1,5 @@
import { hasValidPositionIndexes } from "@modules/ad/interface/grpc-controllers/dtos/validators/has-valid-position-indexes.validator"; import { hasValidPositionIndexes } from '@modules/ad/interface/grpc-controllers/dtos/validators/has-valid-position-indexes.validator';
import { WaypointDto } from "@modules/ad/interface/grpc-controllers/dtos/waypoint.dto"; import { WaypointDto } from '@modules/ad/interface/grpc-controllers/dtos/waypoint.dto';
describe('addresses position validator', () => { describe('addresses position validator', () => {
const waypoint1: WaypointDto = { const waypoint1: WaypointDto = {

View File

@ -3,7 +3,11 @@ import { MESSAGE_PUBLISHER } from './messager.di-tokens';
import { ConfigModule, ConfigService } from '@nestjs/config'; import { ConfigModule, ConfigService } from '@nestjs/config';
import { SERVICE_NAME } from '@src/app.constants'; import { SERVICE_NAME } from '@src/app.constants';
import { MessageBrokerModule, MessageBrokerModuleOptions, MessageBrokerPublisher } from '@mobicoop/message-broker-module'; import {
MessageBrokerModule,
MessageBrokerModuleOptions,
MessageBrokerPublisher,
} from '@mobicoop/message-broker-module';
const imports = [ const imports = [
MessageBrokerModule.forRootAsync({ MessageBrokerModule.forRootAsync({
@ -15,7 +19,9 @@ const imports = [
uri: configService.get<string>('MESSAGE_BROKER_URI') as string, uri: configService.get<string>('MESSAGE_BROKER_URI') as string,
exchange: { exchange: {
name: configService.get<string>('MESSAGE_BROKER_EXCHANGE') as string, name: configService.get<string>('MESSAGE_BROKER_EXCHANGE') as string,
durable: configService.get<boolean>('MESSAGE_BROKER_EXCHANGE_DURABILITY') as boolean durable: configService.get<boolean>(
'MESSAGE_BROKER_EXCHANGE_DURABILITY',
) as boolean,
}, },
name: SERVICE_NAME, name: SERVICE_NAME,
}), }),