From dfca913bccac208ad362bb175114f75df5c6f031 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:37:09 +0300 Subject: [PATCH] Add user permissions to devices when joining a unit --- src/unit/services/unit.service.ts | 102 ++++++++++++++++++++++++------ src/unit/unit.module.ts | 6 ++ 2 files changed, 89 insertions(+), 19 deletions(-) diff --git a/src/unit/services/unit.service.ts b/src/unit/services/unit.service.ts index f0472af..e7511c6 100644 --- a/src/unit/services/unit.service.ts +++ b/src/unit/services/unit.service.ts @@ -19,6 +19,8 @@ import { SpaceEntity } from '@app/common/modules/space/entities'; import { UpdateUnitNameDto } from '../dtos/update.unit.dto'; import { UserSpaceRepository } from '@app/common/modules/user-space/repositories'; import { generateRandomString } from '@app/common/helper/randomString'; +import { UserDevicePermissionService } from 'src/user-device-permission/services'; +import { PermissionType } from '@app/common/constants/permission-type.enum'; @Injectable() export class UnitService { @@ -26,6 +28,7 @@ export class UnitService { private readonly spaceRepository: SpaceRepository, private readonly spaceTypeRepository: SpaceTypeRepository, private readonly userSpaceRepository: UserSpaceRepository, + private readonly userDevicePermissionService: UserDevicePermissionService, ) {} async addUnit(addUnitDto: AddUnitDto) { @@ -314,25 +317,20 @@ export class UnitService { addUserUnitUsingCodeDto: AddUserUnitUsingCodeDto, ) { try { - const unit = await this.spaceRepository.findOneOrFail({ - where: { - invitationCode: addUserUnitUsingCodeDto.inviteCode, - spaceType: { type: 'unit' }, - }, - relations: ['spaceType'], - }); - if (unit.invitationCode) { - const user = await this.addUserUnit({ - userUuid: addUserUnitUsingCodeDto.userUuid, - unitUuid: unit.uuid, - }); - if (user.uuid) { - await this.spaceRepository.update( - { uuid: unit.uuid }, - { invitationCode: null }, - ); - } - } + const unit = await this.findUnitByInviteCode( + addUserUnitUsingCodeDto.inviteCode, + ); + + await this.addUserToUnit(addUserUnitUsingCodeDto.userUuid, unit.uuid); + + await this.clearUnitInvitationCode(unit.uuid); + + const deviceUUIDs = await this.getDeviceUUIDsForUnit(unit.uuid); + + await this.addUserPermissionsToDevices( + addUserUnitUsingCodeDto.userUuid, + deviceUUIDs, + ); } catch (err) { throw new HttpException( 'Invalid invitation code', @@ -340,4 +338,70 @@ export class UnitService { ); } } + + private async findUnitByInviteCode(inviteCode: string): Promise { + const unit = await this.spaceRepository.findOneOrFail({ + where: { + invitationCode: inviteCode, + spaceType: { type: 'unit' }, + }, + relations: ['spaceType'], + }); + + return unit; + } + + private async addUserToUnit(userUuid: string, unitUuid: string) { + const user = await this.addUserUnit({ userUuid, unitUuid }); + + if (user.uuid) { + return user; + } else { + throw new HttpException( + 'Failed to add user to unit', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + + private async clearUnitInvitationCode(unitUuid: string) { + await this.spaceRepository.update( + { uuid: unitUuid }, + { invitationCode: null }, + ); + } + + private async getDeviceUUIDsForUnit( + unitUuid: string, + ): Promise<{ uuid: string }[]> { + const devices = await this.spaceRepository.find({ + where: { parent: { uuid: unitUuid } }, + relations: ['devicesSpaceEntity', 'devicesSpaceEntity.productDevice'], + }); + + const allDevices = devices.flatMap((space) => space.devicesSpaceEntity); + + return allDevices.map((device) => ({ uuid: device.uuid })); + } + + private async addUserPermissionsToDevices( + userUuid: string, + deviceUUIDs: { uuid: string }[], + ): Promise { + const permissionPromises = deviceUUIDs.map(async (device) => { + try { + await this.userDevicePermissionService.addUserPermission({ + userUuid, + deviceUuid: device.uuid, + permissionType: PermissionType.CONTROLLABLE, + }); + } catch (error) { + console.error( + `Failed to add permission for device ${device.uuid}: ${error.message}`, + ); + } + }); + + await Promise.all(permissionPromises); + } } diff --git a/src/unit/unit.module.ts b/src/unit/unit.module.ts index 569ef39..7924e4a 100644 --- a/src/unit/unit.module.ts +++ b/src/unit/unit.module.ts @@ -10,6 +10,9 @@ import { UserSpaceRepositoryModule } from '@app/common/modules/user-space/user.s import { UserSpaceRepository } from '@app/common/modules/user-space/repositories'; import { UserRepositoryModule } from '@app/common/modules/user/user.repository.module'; import { UserRepository } from '@app/common/modules/user/repositories'; +import { UserDevicePermissionService } from 'src/user-device-permission/services'; +import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories'; +import { PermissionTypeRepository } from '@app/common/modules/permission/repositories'; @Module({ imports: [ @@ -26,6 +29,9 @@ import { UserRepository } from '@app/common/modules/user/repositories'; SpaceTypeRepository, UserSpaceRepository, UserRepository, + UserDevicePermissionService, + DeviceUserPermissionRepository, + PermissionTypeRepository, ], exports: [UnitService], })