diff --git a/apps/api/src/modules/voie/dto/fusion_voie.dto.ts b/apps/api/src/modules/voie/dto/fusion_voie.dto.ts new file mode 100644 index 00000000..b140031e --- /dev/null +++ b/apps/api/src/modules/voie/dto/fusion_voie.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsMongoId } from 'class-validator'; + +export class FusionVoieDTO { + @IsMongoId({ each: true }) + @ApiProperty({ type: String, required: true, nullable: true, isArray: true }) + otherVoieIds: string[]; +} diff --git a/apps/api/src/modules/voie/voie.controller.ts b/apps/api/src/modules/voie/voie.controller.ts index 097408b7..43b40fcf 100644 --- a/apps/api/src/modules/voie/voie.controller.ts +++ b/apps/api/src/modules/voie/voie.controller.ts @@ -48,6 +48,7 @@ import { NumeroService } from '@/modules/numeros/numero.service'; import { filterComments } from '@/shared/utils/filter.utils'; import { FileInterceptor } from '@nestjs/platform-express'; import { DocumentFormat } from '@/lib/document/types'; +import { FusionVoieDTO } from './dto/fusion_voie.dto'; @ApiTags('voies') @Controller('voies') @@ -216,6 +217,28 @@ export class VoieController { res.status(HttpStatus.OK).json(result); } + @Put(':voieId/fusion') + @ApiOperation({ + summary: 'Fusionne plusieurs voie en une', + operationId: 'fusionVoies', + }) + @ApiParam({ name: 'voieId', required: true, type: String }) + @ApiBody({ type: FusionVoieDTO, required: true }) + @ApiResponse({ status: HttpStatus.OK, type: Voie }) + @ApiBearerAuth('admin-token') + @UseGuards(AdminGuard) + async fusionVoies( + @Req() req: CustomRequest, + @Body() { otherVoieIds }: FusionVoieDTO, + @Res() res: Response, + ) { + const result: Voie = await this.voieService.fusionVoie( + req.voie, + otherVoieIds, + ); + res.status(HttpStatus.OK).json(result); + } + @Put(':voieId/numeros/certify-all') @ApiOperation({ summary: 'Certify Voie numeros in Bal', diff --git a/apps/api/src/modules/voie/voie.service.ts b/apps/api/src/modules/voie/voie.service.ts index c5cbc46f..c24aeaa3 100644 --- a/apps/api/src/modules/voie/voie.service.ts +++ b/apps/api/src/modules/voie/voie.service.ts @@ -336,6 +336,23 @@ export class VoieService { return toponyme; } + public async fusionVoie(voie: Voie, otherVoieIds: string[]): Promise { + // On lance une erreur si la voie n'existe pas + if (!(await this.isVoieExist(voie.id))) { + throw new HttpException( + `Voie ${voie.id} is deleted`, + HttpStatus.BAD_REQUEST, + ); + } + this.numeroService.updateMany( + { voieId: In(otherVoieIds) }, + { voieId: voie.id }, + ); + this.deleteMany({ id: In(otherVoieIds) }); + + return this.findOneOrFail(voie.id); + } + public async extendVoies( balId: string, voies: Voie[],