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,
"time": "07:00",
"margin": 600,
"margin": 600
},
{
"day": 2,
"time": "07:05",
"margin": 600,
"margin": 600
},
{
"day": 5,
"time": "07:10",
"margin": 600,
"margin": 600
}
],
"waypoints": [

View File

@ -26,10 +26,14 @@ import { HEALTH_CRITICAL_LOGGING_KEY, SERVICE_NAME } from './app.constants';
useFactory: async (
configService: ConfigService,
): Promise<ConfigurationModuleOptions> => ({
domain: configService.get<string>('SERVICE_CONFIGURATION_DOMAIN') as string,
domain: configService.get<string>(
'SERVICE_CONFIGURATION_DOMAIN',
) as string,
messageBroker: {
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: {
host: configService.get<string>('REDIS_HOST') as string,

View File

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

View File

@ -15,26 +15,48 @@ import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port';
@CommandHandler(CreateAdCommand)
export class CreateAdService implements ICommandHandler {
constructor(
@Inject(AD_REPOSITORY)
private readonly repository: AdRepositoryPort,
@Inject(INPUT_DATETIME_TRANSFORMER)
private readonly datetimeTransformer: DateTimeTransformerPort,
) {
}
) {}
async execute(command: CreateAdCommand): Promise<AggregateID> {
const ad = AdEntity.create(
{
userId: command.userId,
driver: command.driver,
passenger: command.passenger,
frequency: command.frequency,
fromDate: this.datetimeTransformer.fromDate(
const ad = AdEntity.create({
userId: command.userId,
driver: command.driver,
passenger: command.passenger,
frequency: command.frequency,
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,
time: command.schedule[0].time,
time: scheduleItem.time,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
@ -42,11 +64,10 @@ export class CreateAdService implements ICommandHandler {
},
command.frequency,
),
toDate: this.datetimeTransformer.toDate(
command.toDate,
time: this.datetimeTransformer.time(
{
date: command.fromDate,
time: command.schedule[0].time,
time: scheduleItem.time,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
@ -54,52 +75,27 @@ export class CreateAdService implements ICommandHandler {
},
command.frequency,
),
schedule: command.schedule.map((scheduleItem: ScheduleItem) => ({
day: this.datetimeTransformer.day(
scheduleItem.day,
{
date: command.fromDate,
time: scheduleItem.time,
coordinates: {
lon: command.waypoints[0].lon,
lat: command.waypoints[0].lat,
},
},
command.frequency,
),
time: this.datetimeTransformer.time(
{
date: command.fromDate,
time: scheduleItem.time,
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,
},
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 {
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> {
protected readonly _id: AggregateID;
static create = (
create: CreateAdProps
): AdEntity => {
static create = (create: CreateAdProps): AdEntity => {
const id = v4();
const props: AdProps = { ...create };
const ad = new AdEntity({ id, props });

View File

@ -5,10 +5,7 @@ import {
GeoDateTime,
} from '../core/application/ports/datetime-transformer.port';
import { TimeConverterPort } from '../core/application/ports/time-converter.port';
import {
TIMEZONE_FINDER,
TIME_CONVERTER,
} from '../ad.di-tokens';
import { TIMEZONE_FINDER, TIME_CONVERTER } from '../ad.di-tokens';
import { TimezoneFinderPort } from '../core/application/ports/timezone-finder.port';
@Injectable()
@ -17,8 +14,7 @@ export class InputDateTimeTransformer implements DateTimeTransformerPort {
@Inject(TIMEZONE_FINDER)
private readonly timezoneFinder: TimezoneFinderPort,
@Inject(TIME_CONVERTER) private readonly timeConverter: TimeConverterPort,
) {
}
) {}
/**
* 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';
@Injectable()

View File

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

View File

@ -24,16 +24,16 @@ export class CreateAdRequestDto {
@IsBoolean()
@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', {
message: 'Number of seats proposed as a driver is required'
message: 'Number of seats proposed as a driver is required',
})
driver: boolean;
@IsBoolean()
@HasSeats('seatsRequested', {
message: 'Number of seats requested as a passenger is required'
message: 'Number of seats requested as a passenger is required',
})
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 {
@IsInt()

View File

@ -19,7 +19,7 @@ export function HasRole(
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
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) {
const [relatedPropertyName] = args.constraints;
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';
export class WaypointDto extends AddressDto {

View File

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

View File

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

View File

@ -102,9 +102,8 @@ describe('create-ad.service', () => {
AdEntity.create = jest.fn().mockReturnValue({
id: '047a6ecf-23d4-4d3e-877c-3225d560a8da',
});
const result: AggregateID = await createAdService.execute(
createAdCommand,
);
const result: AggregateID =
await createAdService.execute(createAdCommand);
expect(result).toBe('047a6ecf-23d4-4d3e-877c-3225d560a8da');
});
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 { AdEntity } from '@modules/ad/core/domain/ad.entity';
import {
CreateAdProps,
Frequency,
} from '@modules/ad/core/domain/ad.types';
import { 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 { 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';
@ -59,9 +56,7 @@ const punctualPassengerCreateAdProps: CreateAdProps = {
passenger: true,
};
const ad: AdEntity = AdEntity.create(
punctualPassengerCreateAdProps,
);
const ad: AdEntity = AdEntity.create(punctualPassengerCreateAdProps);
const mockAdRepository = {
findOneById: jest.fn().mockImplementation(() => ad),
@ -95,9 +90,8 @@ describe('find-ad-by-id.query-handler', () => {
const findAdbyIdQuery = new FindAdByIdQuery(
'dd264806-13b4-4226-9b18-87adf0ad5dd1',
);
const ad: AdEntity = await findAdByIdQueryHandler.execute(
findAdbyIdQuery,
);
const ad: AdEntity =
await findAdByIdQueryHandler.execute(findAdbyIdQuery);
expect(ad.getProps().fromDate).toBe('2023-06-22');
});
});

View File

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

View File

@ -1,7 +1,4 @@
import {
TIMEZONE_FINDER,
TIME_CONVERTER,
} from '@modules/ad/ad.di-tokens';
import { TIMEZONE_FINDER, TIME_CONVERTER } from '@modules/ad/ad.di-tokens';
import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port';
import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.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', () => {
class MyClass {
@HasSeats('seatsProposed')
driver:boolean;
driver: boolean;
@HasSeats('seatsRequested')
passenger: boolean;
seatsProposed?: number;
seatsRequested?: number;
}
}
it('should return a property decorator has a function', () => {
const hasSeats = HasSeats('property');
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 { WaypointDto } from "@modules/ad/interface/grpc-controllers/dtos/waypoint.dto";
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';
describe('addresses position validator', () => {
const waypoint1: WaypointDto = {

View File

@ -3,7 +3,11 @@ import { MESSAGE_PUBLISHER } from './messager.di-tokens';
import { ConfigModule, ConfigService } from '@nestjs/config';
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 = [
MessageBrokerModule.forRootAsync({
@ -15,7 +19,9 @@ const imports = [
uri: configService.get<string>('MESSAGE_BROKER_URI') as string,
exchange: {
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,
}),