mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-17 03:05:13 +00:00
Add user permission guards and update device service methods
This commit is contained in:
@ -9,6 +9,7 @@ import {
|
|||||||
HttpException,
|
HttpException,
|
||||||
HttpStatus,
|
HttpStatus,
|
||||||
UseGuards,
|
UseGuards,
|
||||||
|
Req,
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
|
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
|
||||||
import {
|
import {
|
||||||
@ -23,6 +24,8 @@ import { ControlDeviceDto } from '../dtos/control.device.dto';
|
|||||||
import { CheckRoomGuard } from 'src/guards/room.guard';
|
import { CheckRoomGuard } from 'src/guards/room.guard';
|
||||||
import { CheckGroupGuard } from 'src/guards/group.guard';
|
import { CheckGroupGuard } from 'src/guards/group.guard';
|
||||||
import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard';
|
import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard';
|
||||||
|
import { CheckUserHavePermission } from 'src/guards/user.device.permission.guard';
|
||||||
|
import { CheckUserHaveControllablePermission } from 'src/guards/user.device.controllable.permission.guard';
|
||||||
|
|
||||||
@ApiTags('Device Module')
|
@ApiTags('Device Module')
|
||||||
@Controller({
|
@Controller({
|
||||||
@ -37,10 +40,13 @@ export class DeviceController {
|
|||||||
@Get('room')
|
@Get('room')
|
||||||
async getDevicesByRoomId(
|
async getDevicesByRoomId(
|
||||||
@Query() getDeviceByRoomUuidDto: GetDeviceByRoomUuidDto,
|
@Query() getDeviceByRoomUuidDto: GetDeviceByRoomUuidDto,
|
||||||
|
@Req() req: any,
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
|
const userUuid = req.user.uuid;
|
||||||
return await this.deviceService.getDevicesByRoomId(
|
return await this.deviceService.getDevicesByRoomId(
|
||||||
getDeviceByRoomUuidDto,
|
getDeviceByRoomUuidDto,
|
||||||
|
userUuid,
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
@ -68,10 +74,13 @@ export class DeviceController {
|
|||||||
@Get('group')
|
@Get('group')
|
||||||
async getDevicesByGroupId(
|
async getDevicesByGroupId(
|
||||||
@Query() getDeviceByGroupIdDto: GetDeviceByGroupIdDto,
|
@Query() getDeviceByGroupIdDto: GetDeviceByGroupIdDto,
|
||||||
|
@Req() req: any,
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
|
const userUuid = req.user.uuid;
|
||||||
return await this.deviceService.getDevicesByGroupId(
|
return await this.deviceService.getDevicesByGroupId(
|
||||||
getDeviceByGroupIdDto,
|
getDeviceByGroupIdDto,
|
||||||
|
userUuid,
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
@ -94,11 +103,18 @@ export class DeviceController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@UseGuards(JwtAuthGuard)
|
@UseGuards(JwtAuthGuard, CheckUserHavePermission)
|
||||||
@Get(':deviceUuid')
|
@Get(':deviceUuid')
|
||||||
async getDeviceDetailsByDeviceId(@Param('deviceUuid') deviceUuid: string) {
|
async getDeviceDetailsByDeviceId(
|
||||||
|
@Param('deviceUuid') deviceUuid: string,
|
||||||
|
@Req() req: any,
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
return await this.deviceService.getDeviceDetailsByDeviceId(deviceUuid);
|
const userUuid = req.user.uuid;
|
||||||
|
return await this.deviceService.getDeviceDetailsByDeviceId(
|
||||||
|
deviceUuid,
|
||||||
|
userUuid,
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
error.message || 'Internal server error',
|
error.message || 'Internal server error',
|
||||||
@ -107,7 +123,7 @@ export class DeviceController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@UseGuards(JwtAuthGuard)
|
@UseGuards(JwtAuthGuard, CheckUserHavePermission)
|
||||||
@Get(':deviceUuid/functions')
|
@Get(':deviceUuid/functions')
|
||||||
async getDeviceInstructionByDeviceId(
|
async getDeviceInstructionByDeviceId(
|
||||||
@Param('deviceUuid') deviceUuid: string,
|
@Param('deviceUuid') deviceUuid: string,
|
||||||
@ -124,7 +140,7 @@ export class DeviceController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@UseGuards(JwtAuthGuard)
|
@UseGuards(JwtAuthGuard, CheckUserHavePermission)
|
||||||
@Get(':deviceUuid/functions/status')
|
@Get(':deviceUuid/functions/status')
|
||||||
async getDevicesInstructionStatus(@Param('deviceUuid') deviceUuid: string) {
|
async getDevicesInstructionStatus(@Param('deviceUuid') deviceUuid: string) {
|
||||||
try {
|
try {
|
||||||
@ -138,11 +154,17 @@ export class DeviceController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@UseGuards(JwtAuthGuard)
|
@UseGuards(JwtAuthGuard, CheckUserHaveControllablePermission)
|
||||||
@Post('control')
|
@Post(':deviceUuid/control')
|
||||||
async controlDevice(@Body() controlDeviceDto: ControlDeviceDto) {
|
async controlDevice(
|
||||||
|
@Body() controlDeviceDto: ControlDeviceDto,
|
||||||
|
@Param('deviceUuid') deviceUuid: string,
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
return await this.deviceService.controlDevice(controlDeviceDto);
|
return await this.deviceService.controlDevice(
|
||||||
|
controlDeviceDto,
|
||||||
|
deviceUuid,
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
error.message || 'Internal server error',
|
error.message || 'Internal server error',
|
||||||
|
@ -12,6 +12,7 @@ import { GroupDeviceRepository } from '@app/common/modules/group-device/reposito
|
|||||||
import { GroupRepository } from '@app/common/modules/group/repositories';
|
import { GroupRepository } from '@app/common/modules/group/repositories';
|
||||||
import { GroupRepositoryModule } from '@app/common/modules/group/group.repository.module';
|
import { GroupRepositoryModule } from '@app/common/modules/group/group.repository.module';
|
||||||
import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories';
|
import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories';
|
||||||
|
import { UserRepository } from '@app/common/modules/user/repositories';
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
ConfigModule,
|
ConfigModule,
|
||||||
@ -29,6 +30,7 @@ import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-
|
|||||||
DeviceRepository,
|
DeviceRepository,
|
||||||
GroupDeviceRepository,
|
GroupDeviceRepository,
|
||||||
GroupRepository,
|
GroupRepository,
|
||||||
|
UserRepository,
|
||||||
],
|
],
|
||||||
exports: [DeviceService],
|
exports: [DeviceService],
|
||||||
})
|
})
|
||||||
|
@ -2,14 +2,6 @@ import { ApiProperty } from '@nestjs/swagger';
|
|||||||
import { IsNotEmpty, IsString } from 'class-validator';
|
import { IsNotEmpty, IsString } from 'class-validator';
|
||||||
|
|
||||||
export class ControlDeviceDto {
|
export class ControlDeviceDto {
|
||||||
@ApiProperty({
|
|
||||||
description: 'deviceUuid',
|
|
||||||
required: true,
|
|
||||||
})
|
|
||||||
@IsString()
|
|
||||||
@IsNotEmpty()
|
|
||||||
public deviceUuid: string;
|
|
||||||
|
|
||||||
@ApiProperty({
|
@ApiProperty({
|
||||||
description: 'code',
|
description: 'code',
|
||||||
required: true,
|
required: true,
|
||||||
|
@ -26,6 +26,7 @@ import { ControlDeviceDto } from '../dtos/control.device.dto';
|
|||||||
import { convertKeysToCamelCase } from '@app/common/helper/camelCaseConverter';
|
import { convertKeysToCamelCase } from '@app/common/helper/camelCaseConverter';
|
||||||
import { DeviceRepository } from '@app/common/modules/device/repositories';
|
import { DeviceRepository } from '@app/common/modules/device/repositories';
|
||||||
import { GroupDeviceRepository } from '@app/common/modules/group-device/repositories';
|
import { GroupDeviceRepository } from '@app/common/modules/group-device/repositories';
|
||||||
|
import { PermissionType } from '@app/common/constants/permission-type.enum';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DeviceService {
|
export class DeviceService {
|
||||||
@ -47,13 +48,25 @@ export class DeviceService {
|
|||||||
|
|
||||||
async getDevicesByRoomId(
|
async getDevicesByRoomId(
|
||||||
getDeviceByRoomUuidDto: GetDeviceByRoomUuidDto,
|
getDeviceByRoomUuidDto: GetDeviceByRoomUuidDto,
|
||||||
|
userUuid: string,
|
||||||
): Promise<GetDeviceDetailsInterface[]> {
|
): Promise<GetDeviceDetailsInterface[]> {
|
||||||
try {
|
try {
|
||||||
const devices = await this.deviceRepository.find({
|
const devices = await this.deviceRepository.find({
|
||||||
where: {
|
where: {
|
||||||
spaceDevice: { uuid: getDeviceByRoomUuidDto.roomUuid },
|
spaceDevice: { uuid: getDeviceByRoomUuidDto.roomUuid },
|
||||||
|
permission: {
|
||||||
|
userUuid,
|
||||||
|
permissionType: {
|
||||||
|
type: PermissionType.READ || PermissionType.CONTROLLABLE,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
relations: ['spaceDevice', 'productDevice'],
|
relations: [
|
||||||
|
'spaceDevice',
|
||||||
|
'productDevice',
|
||||||
|
'permission',
|
||||||
|
'permission.permissionType',
|
||||||
|
],
|
||||||
});
|
});
|
||||||
const devicesData = await Promise.all(
|
const devicesData = await Promise.all(
|
||||||
devices.map(async (device) => {
|
devices.map(async (device) => {
|
||||||
@ -64,6 +77,7 @@ export class DeviceService {
|
|||||||
uuid: device.uuid,
|
uuid: device.uuid,
|
||||||
productUuid: device.productDevice.uuid,
|
productUuid: device.productDevice.uuid,
|
||||||
productType: device.productDevice.prodType,
|
productType: device.productDevice.prodType,
|
||||||
|
permissionType: device.permission[0].permissionType.type,
|
||||||
} as GetDeviceDetailsInterface;
|
} as GetDeviceDetailsInterface;
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -77,11 +91,29 @@ export class DeviceService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDevicesByGroupId(getDeviceByGroupIdDto: GetDeviceByGroupIdDto) {
|
async getDevicesByGroupId(
|
||||||
|
getDeviceByGroupIdDto: GetDeviceByGroupIdDto,
|
||||||
|
userUuid: string,
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
const groupDevices = await this.groupDeviceRepository.find({
|
const groupDevices = await this.groupDeviceRepository.find({
|
||||||
where: { group: { uuid: getDeviceByGroupIdDto.groupUuid } },
|
where: {
|
||||||
relations: ['device'],
|
group: { uuid: getDeviceByGroupIdDto.groupUuid },
|
||||||
|
device: {
|
||||||
|
permission: {
|
||||||
|
userUuid,
|
||||||
|
permissionType: {
|
||||||
|
type: PermissionType.READ || PermissionType.CONTROLLABLE,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
relations: [
|
||||||
|
'device',
|
||||||
|
'device.productDevice',
|
||||||
|
'device.permission',
|
||||||
|
'device.permission.permissionType',
|
||||||
|
],
|
||||||
});
|
});
|
||||||
const devicesData = await Promise.all(
|
const devicesData = await Promise.all(
|
||||||
groupDevices.map(async (device) => {
|
groupDevices.map(async (device) => {
|
||||||
@ -89,9 +121,10 @@ export class DeviceService {
|
|||||||
...(await this.getDeviceDetailsByDeviceIdTuya(
|
...(await this.getDeviceDetailsByDeviceIdTuya(
|
||||||
device.device.deviceTuyaUuid,
|
device.device.deviceTuyaUuid,
|
||||||
)),
|
)),
|
||||||
uuid: device.uuid,
|
uuid: device.device.uuid,
|
||||||
productUuid: device.device.productDevice.uuid,
|
productUuid: device.device.productDevice.uuid,
|
||||||
productType: device.device.productDevice.prodType,
|
productType: device.device.productDevice.prodType,
|
||||||
|
permissionType: device.device.permission[0].permissionType.type,
|
||||||
} as GetDeviceDetailsInterface;
|
} as GetDeviceDetailsInterface;
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -104,7 +137,6 @@ export class DeviceService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async addDeviceInRoom(addDeviceInRoomDto: AddDeviceInRoomDto) {
|
async addDeviceInRoom(addDeviceInRoomDto: AddDeviceInRoomDto) {
|
||||||
try {
|
try {
|
||||||
const device = await this.getDeviceDetailsByDeviceIdTuya(
|
const device = await this.getDeviceDetailsByDeviceIdTuya(
|
||||||
@ -158,11 +190,11 @@ export class DeviceService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async controlDevice(controlDeviceDto: ControlDeviceDto) {
|
async controlDevice(controlDeviceDto: ControlDeviceDto, deviceUuid: string) {
|
||||||
try {
|
try {
|
||||||
const deviceDetails = await this.deviceRepository.findOne({
|
const deviceDetails = await this.deviceRepository.findOne({
|
||||||
where: {
|
where: {
|
||||||
uuid: controlDeviceDto.deviceUuid,
|
uuid: deviceUuid,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -183,7 +215,10 @@ export class DeviceService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException('Device Not Found', HttpStatus.NOT_FOUND);
|
throw new HttpException(
|
||||||
|
error.message || 'Device Not Found',
|
||||||
|
error.status || HttpStatus.NOT_FOUND,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async controlDeviceTuya(
|
async controlDeviceTuya(
|
||||||
@ -211,13 +246,18 @@ export class DeviceService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDeviceDetailsByDeviceId(deviceUuid: string) {
|
async getDeviceDetailsByDeviceId(deviceUuid: string, userUuid: string) {
|
||||||
try {
|
try {
|
||||||
|
const userDevicePermission = await this.getUserDevicePermission(
|
||||||
|
userUuid,
|
||||||
|
deviceUuid,
|
||||||
|
);
|
||||||
|
|
||||||
const deviceDetails = await this.deviceRepository.findOne({
|
const deviceDetails = await this.deviceRepository.findOne({
|
||||||
where: {
|
where: {
|
||||||
uuid: deviceUuid,
|
uuid: deviceUuid,
|
||||||
},
|
},
|
||||||
relations: ['productDevice', 'permission'],
|
relations: ['productDevice'],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!deviceDetails) {
|
if (!deviceDetails) {
|
||||||
@ -227,16 +267,19 @@ export class DeviceService {
|
|||||||
const response = await this.getDeviceDetailsByDeviceIdTuya(
|
const response = await this.getDeviceDetailsByDeviceIdTuya(
|
||||||
deviceDetails.deviceTuyaUuid,
|
deviceDetails.deviceTuyaUuid,
|
||||||
);
|
);
|
||||||
console.log('response', deviceDetails);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...response,
|
...response,
|
||||||
uuid: deviceDetails.uuid,
|
uuid: deviceDetails.uuid,
|
||||||
productUuid: deviceDetails.productDevice.uuid,
|
productUuid: deviceDetails.productDevice.uuid,
|
||||||
productType: deviceDetails.productDevice.prodType,
|
productType: deviceDetails.productDevice.prodType,
|
||||||
|
permissionType: userDevicePermission,
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException('Device Not Found', HttpStatus.NOT_FOUND);
|
throw new HttpException(
|
||||||
|
error.message || 'Device Not Found',
|
||||||
|
HttpStatus.NOT_FOUND,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async getDeviceDetailsByDeviceIdTuya(
|
async getDeviceDetailsByDeviceIdTuya(
|
||||||
@ -259,6 +302,7 @@ export class DeviceService {
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
const { productName, productId, ...rest } = camelCaseResponse.result;
|
const { productName, productId, ...rest } = camelCaseResponse.result;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...rest,
|
...rest,
|
||||||
productUuid: product.uuid,
|
productUuid: product.uuid,
|
||||||
@ -372,4 +416,13 @@ export class DeviceService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private async getUserDevicePermission(userUuid: string, deviceUuid: string) {
|
||||||
|
const device = await this.deviceRepository.findOne({
|
||||||
|
where: {
|
||||||
|
uuid: deviceUuid,
|
||||||
|
},
|
||||||
|
relations: ['permission', 'permission.permissionType'],
|
||||||
|
});
|
||||||
|
return device.permission[0].permissionType.type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user