diff --git a/src/controllers/admin-controller/iot-device.controller.ts b/src/controllers/admin-controller/iot-device.controller.ts index b07c4242..42ddc134 100644 --- a/src/controllers/admin-controller/iot-device.controller.ts +++ b/src/controllers/admin-controller/iot-device.controller.ts @@ -35,6 +35,7 @@ import { UpdateIoTDeviceDto } from "@dto/update-iot-device.dto"; import { IoTDevice } from "@entities/iot-device.entity"; import { ErrorCodes } from "@enum/error-codes.enum"; import { + checkIfUserHasAdminAccessToOrganization, checkIfUserHasReadAccessToApplication, checkIfUserHasWriteAccessToApplication, } from "@helpers/security-helper"; @@ -58,6 +59,7 @@ import { ensureUpdatePayload as ensureIoTDeviceUpdatePayload, } from "@helpers/iot-device.helper"; import { DeviceStatsResponseDto } from "@dto/chirpstack/device/device-stats.response.dto"; +import { GenericHTTPDevice } from "@entities/generic-http-device.entity"; @ApiTags("IoT Device") @Controller("iot-device") @@ -360,4 +362,30 @@ export class IoTDeviceController { throw err; } } + + @Put("resetHttpDeviceApiKey/:id") + @ApiOperation({ summary: "Reset the API key of a generic HTTP device" }) + @ApiBadRequestResponse() + async resetHttpDeviceApiKey( + @Req() req: AuthenticatedRequest, + @Param("id", new ParseIntPipe()) id: number + ): Promise> { + try { + const oldIotDevice = await this.iotDeviceService.findOne(id); + checkIfUserHasWriteAccessToApplication(req, oldIotDevice?.application?.id); + + if (oldIotDevice.type !== IoTDeviceType.GenericHttp) { + throw new BadRequestException("The requested device is not a generic HTTP device"); + } + + const result = await this.iotDeviceService.resetHttpDeviceApiKey(oldIotDevice as GenericHTTPDevice); + AuditLog.success(ActionType.UPDATE, IoTDevice.name, req.user.userId, id); + return { + apiKey: result.apiKey, + }; + } catch (err) { + AuditLog.fail(ActionType.UPDATE, IoTDevice.name, req.user.userId, id); + throw err; + } + } } diff --git a/src/services/device-management/iot-device.service.ts b/src/services/device-management/iot-device.service.ts index cd1d9dbd..324aa7e9 100644 --- a/src/services/device-management/iot-device.service.ts +++ b/src/services/device-management/iot-device.service.ts @@ -50,6 +50,7 @@ import { SigFoxGroupService } from "@services/sigfox/sigfox-group.service"; import { DeleteResult, getManager, ILike, Repository, SelectQueryBuilder } from "typeorm"; import { DeviceModelService } from "./device-model.service"; import { IoTLoRaWANDeviceService } from "./iot-lorawan-device.service"; +import { v4 as uuidv4 } from "uuid"; import { SigFoxMessagesService } from "@services/sigfox/sigfox-messages.service"; import { subtractDays } from "@helpers/date.helper"; import { DeviceStatsResponseDto } from "@dto/chirpstack/device/device-stats.response.dto"; @@ -682,6 +683,11 @@ export class IoTDeviceService { } } + resetHttpDeviceApiKey(httpDevice: GenericHTTPDevice): Promise { + httpDevice.apiKey = uuidv4(); + return this.iotDeviceRepository.save(httpDevice); + } + private async getApplicationsByIds(applicationIds: number[]) { return applicationIds.length ? await this.applicationService.findManyByIds(applicationIds)