mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-11-26 08:34:55 +00:00
SPRINT-1 related tasks done
This commit is contained in:
@ -8,6 +8,7 @@ import { HomeModule } from './home/home.module';
|
||||
import { RoomModule } from './room/room.module';
|
||||
import { GroupModule } from './group/group.module';
|
||||
import { DeviceModule } from './device/device.module';
|
||||
import { UserDevicePermissionModule } from './user-device-permission/user-device-permission.module';
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot({
|
||||
@ -19,6 +20,7 @@ import { DeviceModule } from './device/device.module';
|
||||
RoomModule,
|
||||
GroupModule,
|
||||
DeviceModule,
|
||||
UserDevicePermissionModule
|
||||
],
|
||||
controllers: [AuthenticationController],
|
||||
})
|
||||
|
||||
@ -2,9 +2,11 @@ import {
|
||||
Body,
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
HttpStatus,
|
||||
Param,
|
||||
Post,
|
||||
Req,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { UserAuthService } from '../services/user-auth.service';
|
||||
@ -14,6 +16,8 @@ import { ResponseMessage } from '../../../libs/common/src/response/response.deco
|
||||
import { UserLoginDto } from '../dtos/user-login.dto';
|
||||
import { JwtAuthGuard } from '../../../libs/common/src/guards/jwt.auth.guard';
|
||||
import { ForgetPasswordDto, UserOtpDto, VerifyOtpDto } from '../dtos';
|
||||
import { Request } from 'express';
|
||||
import { RefreshTokenGuard } from '@app/common/guards/jwt-refresh.auth.guard';
|
||||
|
||||
@Controller({
|
||||
version: '1',
|
||||
@ -93,4 +97,33 @@ export class UserAuthController {
|
||||
message: 'Password changed successfully',
|
||||
};
|
||||
}
|
||||
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Get('user/list')
|
||||
async userList(@Req() req) {
|
||||
const userList = await this.userAuthService.userList();
|
||||
return {
|
||||
statusCode: HttpStatus.OK,
|
||||
data: userList,
|
||||
message: 'User List Fetched Successfully',
|
||||
};
|
||||
}
|
||||
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(RefreshTokenGuard)
|
||||
@Get('refresh-token')
|
||||
async refreshToken(@Req() req) {
|
||||
const refreshToken = await this.userAuthService.refreshToken(
|
||||
req.user.uuid,
|
||||
req.headers.authorization,
|
||||
req.user.type,
|
||||
req.user.sessionId,
|
||||
);
|
||||
return {
|
||||
statusCode: HttpStatus.OK,
|
||||
data: refreshToken,
|
||||
message: 'Refresh Token added Successfully',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { UserRepository } from '../../../libs/common/src/modules/user/repositories';
|
||||
import {
|
||||
BadRequestException,
|
||||
ForbiddenException,
|
||||
Injectable,
|
||||
UnauthorizedException,
|
||||
} from '@nestjs/common';
|
||||
@ -14,7 +15,7 @@ import { ForgetPasswordDto, UserOtpDto, VerifyOtpDto } from '../dtos';
|
||||
import { EmailService } from '../../../libs/common/src/util/email.service';
|
||||
import { OtpType } from '../../../libs/common/src/constants/otp-type.enum';
|
||||
import { UserEntity } from '../../../libs/common/src/modules/user/entities/user.entity';
|
||||
import { ILoginResponse } from '../constants/login.response.constant';
|
||||
import * as argon2 from 'argon2';
|
||||
|
||||
@Injectable()
|
||||
export class UserAuthService {
|
||||
@ -64,7 +65,7 @@ export class UserAuthService {
|
||||
);
|
||||
}
|
||||
|
||||
async userLogin(data: UserLoginDto): Promise<ILoginResponse> {
|
||||
async userLogin(data: UserLoginDto) {
|
||||
const user = await this.authService.validateUser(data.email, data.password);
|
||||
if (!user) {
|
||||
throw new UnauthorizedException('Invalid login credentials.');
|
||||
@ -86,7 +87,7 @@ export class UserAuthService {
|
||||
|
||||
return await this.authService.login({
|
||||
email: user.email,
|
||||
userId: user.id,
|
||||
userId: user.uuid,
|
||||
uuid: user.uuid,
|
||||
sessionId: session[1].uuid,
|
||||
});
|
||||
@ -97,7 +98,7 @@ export class UserAuthService {
|
||||
if (!user) {
|
||||
throw new BadRequestException('User does not found');
|
||||
}
|
||||
return await this.userRepository.delete({ uuid });
|
||||
return await this.userRepository.update({ uuid }, { isActive: false });
|
||||
}
|
||||
|
||||
async findOneById(id: string): Promise<UserEntity> {
|
||||
@ -148,4 +149,41 @@ export class UserAuthService {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async userList(): Promise<UserEntity[]> {
|
||||
return await this.userRepository.find({
|
||||
where: { isActive: true },
|
||||
select: {
|
||||
firstName: true,
|
||||
lastName: true,
|
||||
email: true,
|
||||
isActive: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async refreshToken(
|
||||
userId: string,
|
||||
refreshToken: string,
|
||||
type: string,
|
||||
sessionId: string,
|
||||
) {
|
||||
const user = await this.userRepository.findOne({ where: { uuid: userId } });
|
||||
if (!user || !user.refreshToken)
|
||||
throw new ForbiddenException('Access Denied');
|
||||
const refreshTokenMatches = await argon2.verify(
|
||||
user.refreshToken,
|
||||
refreshToken,
|
||||
);
|
||||
if (!refreshTokenMatches) throw new ForbiddenException('Access Denied');
|
||||
const tokens = await this.authService.getTokens({
|
||||
email: user.email,
|
||||
userId: user.uuid,
|
||||
uuid: user.uuid,
|
||||
type,
|
||||
sessionId,
|
||||
});
|
||||
await this.authService.updateRefreshToken(user.uuid, tokens.refreshToken);
|
||||
return tokens;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import AuthConfig from './auth.config';
|
||||
import AppConfig from './app.config';
|
||||
|
||||
export default [AuthConfig, AppConfig];
|
||||
import JwtConfig from './jwt.config';
|
||||
export default [AuthConfig, AppConfig, JwtConfig];
|
||||
|
||||
0
src/user-device-permission/controllers/index.ts
Normal file
0
src/user-device-permission/controllers/index.ts
Normal file
@ -0,0 +1,68 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
HttpStatus,
|
||||
Param,
|
||||
Post,
|
||||
Put,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||
import { UserDevicePermissionService } from '../services/user-device-permission.service';
|
||||
import { UserDevicePermissionAddDto } from '../dtos/user-device-permission.add.dto';
|
||||
import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard';
|
||||
import { UserDevicePermissionEditDto } from '../dtos/user-device-permission.edit.dto';
|
||||
|
||||
@ApiTags('Device Permission Module')
|
||||
@Controller({
|
||||
version: '1',
|
||||
path: 'device-permission',
|
||||
})
|
||||
export class UserDevicePermissionController {
|
||||
constructor(
|
||||
private readonly userDevicePermissionService: UserDevicePermissionService,
|
||||
) {}
|
||||
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Post('add')
|
||||
async addDevicePermission(
|
||||
@Body() userDevicePermissionDto: UserDevicePermissionAddDto,
|
||||
) {
|
||||
try {
|
||||
const addDetails =
|
||||
await this.userDevicePermissionService.addUserPermission(
|
||||
userDevicePermissionDto,
|
||||
);
|
||||
return {
|
||||
statusCode: HttpStatus.CREATED,
|
||||
message: 'User Permission for Devices Added Successfully',
|
||||
data: addDetails,
|
||||
};
|
||||
} catch (err) {
|
||||
throw new Error(err);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Put('edit/:userId')
|
||||
async editDevicePermission(
|
||||
@Param('userId') userId: string,
|
||||
@Body() userDevicePermissionEditDto: UserDevicePermissionEditDto,
|
||||
) {
|
||||
try {
|
||||
await this.userDevicePermissionService.editUserPermission(
|
||||
userId,
|
||||
userDevicePermissionEditDto,
|
||||
);
|
||||
return {
|
||||
statusCode: HttpStatus.OK,
|
||||
message: 'User Permission for Devices Updated Successfully',
|
||||
data: {},
|
||||
};
|
||||
} catch (err) {
|
||||
throw new Error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
0
src/user-device-permission/dtos/index.ts
Normal file
0
src/user-device-permission/dtos/index.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
import { IsNotEmpty, IsString } from 'class-validator';
|
||||
|
||||
export class UserDevicePermissionAddDto {
|
||||
@ApiProperty({
|
||||
description: 'user id',
|
||||
required: true,
|
||||
})
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
userId: string;
|
||||
|
||||
@ApiProperty({
|
||||
description: 'permission type id',
|
||||
required: true,
|
||||
})
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
permissionTypeId: string;
|
||||
|
||||
@ApiProperty({
|
||||
description: 'device id',
|
||||
required: true,
|
||||
})
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
deviceId: string;
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
import { OmitType } from '@nestjs/swagger';
|
||||
import { UserDevicePermissionAddDto } from './user-device-permission.add.dto';
|
||||
|
||||
export class UserDevicePermissionEditDto extends OmitType(
|
||||
UserDevicePermissionAddDto,
|
||||
['userId'],
|
||||
) {}
|
||||
0
src/user-device-permission/services/index.ts
Normal file
0
src/user-device-permission/services/index.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import { DeviceUserTypeRepository } from '@app/common/modules/device/repositories';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { UserDevicePermissionAddDto } from '../dtos/user-device-permission.add.dto';
|
||||
import { UserDevicePermissionEditDto } from '../dtos/user-device-permission.edit.dto';
|
||||
|
||||
@Injectable()
|
||||
export class UserDevicePermissionService {
|
||||
constructor(
|
||||
private readonly deviceUserTypeRepository: DeviceUserTypeRepository,
|
||||
) {}
|
||||
|
||||
async addUserPermission(userDevicePermissionDto: UserDevicePermissionAddDto) {
|
||||
return await this.deviceUserTypeRepository.save({
|
||||
userUuid: userDevicePermissionDto.userId,
|
||||
deviceUuid: userDevicePermissionDto.deviceId,
|
||||
permissionTypeUuid: userDevicePermissionDto.permissionTypeId,
|
||||
});
|
||||
}
|
||||
|
||||
async editUserPermission(
|
||||
userId: string,
|
||||
userDevicePermissionEditDto: UserDevicePermissionEditDto,
|
||||
) {
|
||||
return await this.deviceUserTypeRepository.update(
|
||||
{ userUuid: userId },
|
||||
{
|
||||
deviceUuid: userDevicePermissionEditDto.deviceId,
|
||||
permissionTypeUuid: userDevicePermissionEditDto.permissionTypeId,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
21
src/user-device-permission/user-device-permission.module.ts
Normal file
21
src/user-device-permission/user-device-permission.module.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { DeviceRepositoryModule } from '@app/common/modules/device';
|
||||
import {
|
||||
DeviceRepository,
|
||||
DeviceUserTypeRepository,
|
||||
} from '@app/common/modules/device/repositories';
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
import { UserDevicePermissionService } from './services/user-device-permission.service';
|
||||
import { UserDevicePermissionController } from './controllers/user-device-permission.controller';
|
||||
|
||||
@Module({
|
||||
imports: [ConfigModule, DeviceRepositoryModule],
|
||||
controllers: [UserDevicePermissionController],
|
||||
providers: [
|
||||
DeviceUserTypeRepository,
|
||||
DeviceRepository,
|
||||
UserDevicePermissionService,
|
||||
],
|
||||
exports: [UserDevicePermissionService],
|
||||
})
|
||||
export class UserDevicePermissionModule {}
|
||||
Reference in New Issue
Block a user