Skip to content

Commit

Permalink
Merge pull request #420 from BaseAdresseNationale/fufeck_correct-open…
Browse files Browse the repository at this point in the history
…api-dto

Correct openapi dto
  • Loading branch information
fufeck authored Dec 19, 2023
2 parents 7757b6d + 3d375c9 commit b5d64d5
Show file tree
Hide file tree
Showing 30 changed files with 664 additions and 98 deletions.
4 changes: 3 additions & 1 deletion .env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ API_DEPOT_CLIENT_ID=
API_DEPOT_CLIENT_SECRET=
BAN_API_URL=https://plateforme.adresse.data.gouv.fr
URL_CONTOURS_COMMUNES=http://etalab-datasets.geo.data.gouv.fr/contours-administratifs/2023/geojson/communes-100m.geojson
RUN_CRON_IN_API=false
DISABLE_TASKS=false
RUN_CRON_IN_API=false
PRINT_MEMORY_USAGE=false
21 changes: 21 additions & 0 deletions apps/api/src/lib/utils/memory-usage.utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export const printMemoryUsage = () => {
const formatMemoryUsage = (data) =>
`${Math.round((data / 1024 / 1024) * 100) / 100} MB`;

const memoryData = process.memoryUsage();

const memoryUsage = {
rss: `${formatMemoryUsage(
memoryData.rss,
)} -> Resident Set Size - total memory allocated for the process execution`,
heapTotal: `${formatMemoryUsage(
memoryData.heapTotal,
)} -> total size of the allocated heap`,
heapUsed: `${formatMemoryUsage(
memoryData.heapUsed,
)} -> actual memory used during the execution`,
external: `${formatMemoryUsage(memoryData.external)} -> V8 external memory`,
};

console.log(memoryUsage);
};
5 changes: 5 additions & 0 deletions apps/api/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as cors from 'cors';
import * as morgan from 'morgan';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ExpressAdapter } from '@nestjs/platform-express';
import { printMemoryUsage } from './lib/utils/memory-usage.utils';

import { ApiModule } from './api.module';
import * as apiLegacy from '../../legacy-api/routes';
Expand Down Expand Up @@ -51,6 +52,10 @@ async function bootstrap() {
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);

if (process.env.PRINT_MEMORY_USAGE === 'true') {
setInterval(printMemoryUsage, 1000);
}

await app.listen(process.env.PORT || 5000);
}
bootstrap();
38 changes: 28 additions & 10 deletions apps/api/src/modules/base_locale/base_locale.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ import { FileInterceptor } from '@nestjs/platform-express';
import { RecoverBaseLocaleDTO } from './dto/recover_base_locale.dto';
import { getEditorUrl } from '@/shared/modules/mailer/mailer.utils';
import { AllDeletedInBalDTO } from './dto/all_deleted_in_bal.dto';
import { Numero } from '@/shared/schemas/numero/numero.schema';
import { BatchNumeroResponseDTO } from '../numeros/dto/batch_numero_response.dto';

@ApiTags('bases-locales')
@Controller('bases-locales')
Expand Down Expand Up @@ -360,14 +360,16 @@ export class BaseLocaleController {
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiResponse({
status: HttpStatus.OK,
type: String,
isArray: true,
})
async getBaseLocaleParcelles(
@Req() req: CustomRequest,
@Res() res: Response,
) {
const parcelles: (Toponyme | Numero)[] =
await this.baseLocaleService.getParcelles(req.baseLocale);
const parcelles: string[] = await this.baseLocaleService.getParcelles(
req.baseLocale,
);

res.status(HttpStatus.OK).json(parcelles);
}
Expand Down Expand Up @@ -430,22 +432,36 @@ export class BaseLocaleController {
res.status(HttpStatus.OK).json(allDeleted);
}

@Put(':baseLocaleId/numeros/certify-all')
@ApiOperation({
summary: 'Certify all numeros in Bal',
operationId: 'certifyAllNumeros',
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiResponse({ status: HttpStatus.OK, type: BatchNumeroResponseDTO })
@ApiBearerAuth('admin-token')
@UseGuards(AdminGuard)
async certifyAllNumeros(@Req() req: CustomRequest, @Res() res: Response) {
await this.numeroService.certifyAllNumeros(req.baseLocale);
res.status(HttpStatus.OK).json(true);
}

@Put(':baseLocaleId/numeros/batch')
@ApiOperation({
summary: 'Multi update numeros',
operationId: 'updateNumeros',
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiBody({ type: UpdateBatchNumeroDTO, required: true })
@ApiResponse({ status: HttpStatus.OK })
@ApiResponse({ status: HttpStatus.OK, type: BatchNumeroResponseDTO })
@ApiBearerAuth('admin-token')
@UseGuards(AdminGuard)
async batchNumeros(
@Req() req: CustomRequest,
@Body() updateBatchNumeroDto: UpdateBatchNumeroDTO,
@Res() res: Response,
) {
const result: any = await this.numeroService.updateBatch(
const result: BatchNumeroResponseDTO = await this.numeroService.updateBatch(
req.baseLocale,
updateBatchNumeroDto,
);
Expand All @@ -459,18 +475,19 @@ export class BaseLocaleController {
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiBody({ type: DeleteBatchNumeroDTO, required: true })
@ApiResponse({ status: HttpStatus.OK })
@ApiResponse({ status: HttpStatus.OK, type: BatchNumeroResponseDTO })
@ApiBearerAuth('admin-token')
@UseGuards(AdminGuard)
async softDeleteNumeros(
@Req() req: CustomRequest,
@Body() deleteBatchNumeroDto: DeleteBatchNumeroDTO,
@Res() res: Response,
) {
const result: any = await this.numeroService.softDeleteBatch(
req.baseLocale,
deleteBatchNumeroDto,
);
const result: BatchNumeroResponseDTO =
await this.numeroService.softDeleteBatch(
req.baseLocale,
deleteBatchNumeroDto,
);
res.status(HttpStatus.OK).json(result);
}

Expand Down Expand Up @@ -501,6 +518,7 @@ export class BaseLocaleController {
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiResponse({
status: HttpStatus.OK,
type: ExtendedVoieDTO,
isArray: true,
})
@ApiBearerAuth('admin-token')
Expand Down
10 changes: 5 additions & 5 deletions apps/api/src/modules/base_locale/base_locale.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export class BaseLocaleService {
const filter = {
_id: id,
};
const baseLocale = await this.baseLocaleModel.findOne(filter).exec();
const baseLocale = await this.baseLocaleModel.findOne(filter).lean().exec();

if (!baseLocale) {
throw new HttpException(
Expand All @@ -78,7 +78,7 @@ export class BaseLocaleService {
}

async findOne(filter?: FilterQuery<BaseLocale>): Promise<BaseLocale> {
return this.baseLocaleModel.findOne(filter);
return this.baseLocaleModel.findOne(filter).lean();
}

async count(filter?: FilterQuery<BaseLocale>): Promise<number> {
Expand Down Expand Up @@ -106,7 +106,7 @@ export class BaseLocaleService {
query.skip(offset);
}

return query.exec();
return query.lean().exec();
}

async createOne(createInput: CreateBaseLocaleDTO): Promise<BaseLocale> {
Expand Down Expand Up @@ -329,7 +329,7 @@ export class BaseLocaleService {
const voiesPopulate: PopulateVoie[] = [];
for (const voie of voies) {
const voiePopulate: PopulateVoie = {
...voie.toObject(),
...voie,
numeros: numerosByVoieId[voie._id.toString()] || [],
};
voiesPopulate.push(voiePopulate);
Expand Down Expand Up @@ -374,7 +374,7 @@ export class BaseLocaleService {
return extendWithNumeros(baseLocale, numeros);
}

async getParcelles(basesLocale: BaseLocale): Promise<(Toponyme | Numero)[]> {
async getParcelles(basesLocale: BaseLocale): Promise<string[]> {
const toponymesWithParcelles = await this.toponymeService.findDistinct(
{
_bal: basesLocale._id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Response, Request } from 'express';
import { ApiParam, ApiTags, ApiResponse, ApiOperation } from '@nestjs/swagger';

import { CommuneService } from './commune.service';
import { CommuneExtraDTO } from './dto/commune.dto';

@ApiTags('commune')
@Controller('commune')
Expand All @@ -15,7 +16,7 @@ export class CommuneController {
operationId: 'findCommune',
})
@ApiParam({ name: 'codeCommune', required: true, type: String })
@ApiResponse({ status: 200 })
@ApiResponse({ status: 200, type: CommuneExtraDTO })
async getCommuneExtraData(@Req() req: Request, @Res() res: Response) {
const { codeCommune } = req.params;
const communeExtraData =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ApiProperty } from '@nestjs/swagger';

export class CommuneExtraDTO {
@ApiProperty()
isCOM: boolean;

@ApiProperty()
hasCadastre: boolean;

@ApiProperty()
hasOpenMapTiles: boolean;

@ApiProperty()
hasOrtho: boolean;

@ApiProperty()
hasPlanIGN: boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ import {
} from '@/shared/modules/api_depot/types/habilitation.type';
import { ApiProperty } from '@nestjs/swagger';

export class Strategy {
@ApiProperty({ enum: ['email', 'franceconnect'] })
type: 'email' | 'franceconnect';

@ApiProperty()
pinCode: string;

@ApiProperty()
pinCodeExpiration: Date;

@ApiProperty()
remainingAttempts: number;

@ApiProperty()
createdAt: Date;
}

export class HabilitationDTO implements Habilitation {
@ApiProperty()
_id: string;
Expand All @@ -19,13 +36,13 @@ export class HabilitationDTO implements Habilitation {
@ApiProperty()
franceconnectAuthenticationUrl?: string;

@ApiProperty()
@ApiProperty({ type: () => Strategy })
strategy?: EmailStrategy | FranceConnectStrategy;

@ApiProperty()
client?: string;

@ApiProperty()
@ApiProperty({ enum: StatusHabiliation })
status: StatusHabiliation;

@ApiProperty()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { ApiProperty } from '@nestjs/swagger';

export class SendPinCodeResponseDTO {
@ApiProperty({ required: true, nullable: false })
code: number;

@ApiProperty({ required: true, nullable: false })
message: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { ApiProperty } from '@nestjs/swagger';

export class ValidatePinCodeResponseDTO {
@ApiProperty({ required: true, nullable: false })
validated: boolean;

@ApiProperty({ required: false, nullable: true })
message?: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@ import {
ApiBearerAuth,
} from '@nestjs/swagger';

import { Habilitation } from '@/shared/modules/api_depot/types/habilitation.type';
import {
Habilitation,
StatusHabiliation,
} from '@/shared/modules/api_depot/types/habilitation.type';

import { CustomRequest } from '@/lib/types/request.type';
import { AdminGuard } from '@/lib/guards/admin.guard';
import { HabilitationService } from './habilitation.service';
import { ValidatePinCodeDTO } from './dto/validate-pin-code.dto';
import { HabilitationDTO } from './dto/habilitation.dto';
import { SendPinCodeResponseDTO } from './dto/send-pin-code.response.dto';
import { ValidatePinCodeResponseDTO } from './dto/validate-pin-code.response.dto';

@ApiTags('habilitation')
@Controller('')
Expand Down Expand Up @@ -75,13 +80,12 @@ export class HabilitationController {
operationId: 'sendPinCodeHabilitation',
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiResponse({ status: 200 })
@ApiResponse({ status: 200, type: SendPinCodeResponseDTO })
@ApiBearerAuth('admin-token')
@UseGuards(AdminGuard)
async sendPinCode(@Req() req: CustomRequest, @Res() res: Response) {
const sendPinCodeResponse = await this.habilitationService.sendPinCode(
req.baseLocale._habilitation,
);
const sendPinCodeResponse: SendPinCodeResponseDTO =
await this.habilitationService.sendPinCode(req.baseLocale._habilitation);

return res.status(sendPinCodeResponse.code).send({
code: sendPinCodeResponse.code,
Expand All @@ -96,7 +100,7 @@ export class HabilitationController {
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiBody({ type: ValidatePinCodeDTO, required: true })
@ApiResponse({ status: 200 })
@ApiResponse({ status: 200, type: ValidatePinCodeResponseDTO })
@ApiBearerAuth('admin-token')
@UseGuards(AdminGuard)
async validatePinCode(
Expand All @@ -109,10 +113,18 @@ export class HabilitationController {
req.baseLocale._habilitation,
body.code,
);
const response: ValidatePinCodeResponseDTO = {
validated: validationResponse.status === StatusHabiliation.ACCEPTED,
};

return res.status(200).send({ code: 200, ...validationResponse });
return res.status(200).send(response);
} catch (error) {
return res.status(200).send({ code: 200, message: error.message });
const response: ValidatePinCodeResponseDTO = {
validated: false,
message: error.message,
};

return res.status(200).send(response);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ export class HabilitationService {
return habilitation;
}

async sendPinCode(habilitationId: string) {
async sendPinCode(
habilitationId: string,
): Promise<{ code: number; message: string }> {
const habilitation = await this.findOne(habilitationId);

if (habilitation.status !== 'pending') {
Expand All @@ -50,16 +52,13 @@ export class HabilitationService {
);
}

const data =
const data: { code: number; message: string } =
await this.apiDepotService.sendPinCodeHabiliation(habilitationId);

return data;
}

async validatePinCode(
habilitationId: string,
code: number,
): Promise<{ validated: boolean }> {
async validatePinCode(habilitationId: string, code: number): Promise<any> {
const habilitation = await this.findOne(habilitationId);

if (habilitation.status !== 'pending') {
Expand Down
Loading

0 comments on commit b5d64d5

Please sign in to comment.