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..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 @@ -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") @@ -205,6 +206,33 @@ export class IoTDevicePayloadDecoderDataTargetConnectionController { } } + @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; + } + } + @Delete(":id") @ApplicationAdmin() @ApiNotFoundResponse({ 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); }