Add user permissions to devices when joining a unit

This commit is contained in:
faris Aljohari
2024-06-05 12:37:09 +03:00
parent c276d36da0
commit dfca913bcc
2 changed files with 89 additions and 19 deletions
+83 -19
View File
@@ -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<SpaceEntity> {
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<void> {
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);
}
}
+6
View File
@@ -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],
})