From 4e2b86f300b3c91b8a707f38d729a40a24898094 Mon Sep 17 00:00:00 2001 From: August Andersen Date: Fri, 2 May 2025 11:16:43 +0200 Subject: [PATCH 1/2] added append endpoint --- ...coder-data-target-connection.controller.ts | 28 +++++++++++++++++++ src/entities/dto/append-copied-device.dto.ts | 8 ++++++ ...-decoder-data-target-connection.service.ts | 22 +++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/entities/dto/append-copied-device.dto.ts diff --git a/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts b/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts index e8c5c5ed..ddef820f 100644 --- a/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts +++ b/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts @@ -41,6 +41,7 @@ import { IoTDeviceService } from "@services/device-management/iot-device.service import { AuditLog } from "@services/audit-log.service"; import { ActionType } from "@entities/audit-log-entry"; import { ApiAuth } from "@auth/swagger-auth-decorator"; +import { AppendCopiedDeviceDto } from "@dto/append-copied-device.dto"; @ApiTags("IoT-Device, PayloadDecoder and DataTarget Connection") @Controller("iot-device-payload-decoder-data-target-connection") @@ -231,4 +232,31 @@ export class IoTDevicePayloadDecoderDataTargetConnectionController { throw err; } } + + @Put("appendCopiedDevice/:id") + @ApplicationAdmin() + @ApiNotFoundResponse({ + description: "If the id of the entity doesn't exist", + }) + @ApiBadRequestResponse({ + description: "If one or more of the id's are invalid references.", + }) + async appendCopiedDevice( + @Req() req: AuthenticatedRequest, + @Param("id", new ParseIntPipe()) id: number, + @Body() dto: AppendCopiedDeviceDto + ): Promise { + try { + const newIotDevice = await this.iotDeviceService.findOne(dto.deviceId); + checkIfUserHasAccessToApplication(req, newIotDevice.application.id, ApplicationAccessScope.Write); + + const result = await this.service.appendCopiedDevice(id, newIotDevice, req.user.userId); + + AuditLog.success(ActionType.UPDATE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, result.id); + return result; + } catch (err) { + AuditLog.fail(ActionType.UPDATE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, id); + throw err; + } + } } diff --git a/src/entities/dto/append-copied-device.dto.ts b/src/entities/dto/append-copied-device.dto.ts new file mode 100644 index 00000000..aad1de08 --- /dev/null +++ b/src/entities/dto/append-copied-device.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsNumber } from "class-validator"; + +export class AppendCopiedDeviceDto { + @ApiProperty({ required: true }) + @IsNumber() + deviceId: number; +} diff --git a/src/services/device-management/iot-device-payload-decoder-data-target-connection.service.ts b/src/services/device-management/iot-device-payload-decoder-data-target-connection.service.ts index 1dd0e427..7b4f72fe 100644 --- a/src/services/device-management/iot-device-payload-decoder-data-target-connection.service.ts +++ b/src/services/device-management/iot-device-payload-decoder-data-target-connection.service.ts @@ -12,6 +12,7 @@ import { PayloadDecoderService } from "@services/data-management/payload-decoder import { DataTargetService } from "@services/data-targets/data-target.service"; import { IoTDeviceService } from "./iot-device.service"; +import { IoTDevice } from "@entities/iot-device.entity"; @Injectable() export class IoTDevicePayloadDecoderDataTargetConnectionService { @@ -173,6 +174,27 @@ export class IoTDevicePayloadDecoderDataTargetConnectionService { return await this.repository.save(mapped); } + async appendCopiedDevice( + id: number, + iotDevice: IoTDevice, + userId: number + ): Promise { + let connection; + try { + connection = await this.repository.findOneOrFail({ + where: { id }, + relations: ["iotDevices"], + }); + } catch (err) { + throw new NotFoundException(`Could not find IoTDevicePayloadDecoderDataTargetConnection by id: ${id}`); + } + + connection.iotDevices.push(iotDevice); + connection.updatedBy = userId; + + return await this.repository.save(connection); + } + async delete(id: number): Promise { return await this.repository.delete(id); } From 365be97c00706015d30afd2cb000bffa0f094376 Mon Sep 17 00:00:00 2001 From: August Andersen Date: Fri, 30 May 2025 09:35:56 +0200 Subject: [PATCH 2/2] PR change --- ...coder-data-target-connection.controller.ts | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts b/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts index ddef820f..29eeedde 100644 --- a/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts +++ b/src/controllers/admin-controller/iot-device-payload-decoder-data-target-connection.controller.ts @@ -206,33 +206,6 @@ export class IoTDevicePayloadDecoderDataTargetConnectionController { } } - @Delete(":id") - @ApplicationAdmin() - @ApiNotFoundResponse({ - description: "If the id of the entity doesn't exist", - }) - async delete( - @Req() req: AuthenticatedRequest, - @Param("id", new ParseIntPipe()) id: number - ): Promise { - try { - const oldConnection = await this.service.findOne(id); - await this.checkUserHasWriteAccessToAllIotDevices( - oldConnection.iotDevices.map(x => x.id), - req - ); - const result = await this.service.delete(id); - if (result.affected === 0) { - throw new NotFoundException(ErrorCodes.IdDoesNotExists); - } - AuditLog.success(ActionType.DELETE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, id); - return new DeleteResponseDto(result.affected); - } catch (err) { - AuditLog.fail(ActionType.DELETE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, id); - throw err; - } - } - @Put("appendCopiedDevice/:id") @ApplicationAdmin() @ApiNotFoundResponse({ @@ -259,4 +232,31 @@ export class IoTDevicePayloadDecoderDataTargetConnectionController { throw err; } } + + @Delete(":id") + @ApplicationAdmin() + @ApiNotFoundResponse({ + description: "If the id of the entity doesn't exist", + }) + async delete( + @Req() req: AuthenticatedRequest, + @Param("id", new ParseIntPipe()) id: number + ): Promise { + try { + const oldConnection = await this.service.findOne(id); + await this.checkUserHasWriteAccessToAllIotDevices( + oldConnection.iotDevices.map(x => x.id), + req + ); + const result = await this.service.delete(id); + if (result.affected === 0) { + throw new NotFoundException(ErrorCodes.IdDoesNotExists); + } + AuditLog.success(ActionType.DELETE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, id); + return new DeleteResponseDto(result.affected); + } catch (err) { + AuditLog.fail(ActionType.DELETE, IoTDevicePayloadDecoderDataTargetConnection.name, req.user.userId, id); + throw err; + } + } }