diff --git a/apps/api/src/modules/base_locale/base_locale.controller.ts b/apps/api/src/modules/base_locale/base_locale.controller.ts index 238a79ca..5abfd55b 100644 --- a/apps/api/src/modules/base_locale/base_locale.controller.ts +++ b/apps/api/src/modules/base_locale/base_locale.controller.ts @@ -66,6 +66,8 @@ import { RecoverBaseLocaleDTO } from './dto/recover_base_locale.dto'; import { AllDeletedInBalDTO } from './dto/all_deleted_in_bal.dto'; import { BatchNumeroResponseDTO } from '../numeros/dto/batch_numero_response.dto'; import { isSuperAdmin } from '@/lib/utils/is-admin.utils'; +import { SearchNumeroDTO } from '../numeros/dto/search_numero.dto'; +import { Numero } from '@/shared/entities/numero.entity'; @ApiTags('bases-locales') @Controller('bases-locales') @@ -463,6 +465,29 @@ export class BaseLocaleController { res.status(HttpStatus.OK).json(allDeleted); } + @Put(':baseLocaleId/numeros') + @ApiOperation({ + summary: 'Search numero', + operationId: 'searchNumeros', + }) + @ApiParam({ name: 'baseLocaleId', required: true, type: String }) + @ApiBody({ type: SearchNumeroDTO, required: true }) + @ApiResponse({ status: HttpStatus.OK, type: Numero, isArray: true }) + @ApiBearerAuth('admin-token') + @UseGuards(AdminGuard) + async searchNumeros( + @Req() req: CustomRequest, + @Body() searchNumeroDTO: SearchNumeroDTO, + @Res() res: Response, + ) { + const result: Numero[] = + await this.numeroService.findManyWherePositionInPolygon( + req.baseLocale.id, + searchNumeroDTO.polygon, + ); + res.status(HttpStatus.OK).json(result); + } + @Put(':baseLocaleId/numeros/uncertify-all') @ApiOperation({ summary: 'Uncertify all numeros in Bal', diff --git a/apps/api/src/modules/numeros/dto/search_numero.dto.ts b/apps/api/src/modules/numeros/dto/search_numero.dto.ts new file mode 100644 index 00000000..eeab0674 --- /dev/null +++ b/apps/api/src/modules/numeros/dto/search_numero.dto.ts @@ -0,0 +1,11 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class SearchNumeroDTO { + @ApiProperty({ + type: [Number], + required: true, + nullable: false, + isArray: true, + }) + polygon: number[][]; +} diff --git a/apps/api/src/modules/numeros/numero.service.ts b/apps/api/src/modules/numeros/numero.service.ts index 34ee5724..c99f730a 100644 --- a/apps/api/src/modules/numeros/numero.service.ts +++ b/apps/api/src/modules/numeros/numero.service.ts @@ -183,6 +183,24 @@ export class NumeroService { return query.getMany(); } + async findManyWherePositionInPolygon( + balId: string, + polygon: number[][], + ): Promise { + const linestring: string = polygon + .map((arr) => `${arr[0]} ${arr[1]}`) + .join(','); + // Requète postgis qui permet de récupèré les numeros dans un polygon simple + const query = this.numerosRepository + .createQueryBuilder('numeros') + .leftJoinAndSelect('numeros.positions', 'positions') + .where('numeros.balId = :balId', { balId }) + .andWhere( + `ST_Contains(ST_Polygon('LINESTRING(${linestring})'::geometry, 4326), positions.point)`, + ); + return query.getMany(); + } + public async count(where: FindOptionsWhere): Promise { return this.numerosRepository.count({ where }); }