SPRINT-1 related tasks done

This commit is contained in:
VirajBrainvire
2024-04-17 18:52:58 +05:30
parent 34fcacde13
commit fbdf187ee1
40 changed files with 588 additions and 19 deletions

View File

@ -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],
})

View File

@ -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',
};
}
}

View File

@ -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;
}
}

View File

@ -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];

View 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);
}
}
}

View File

View 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;
}

View File

@ -0,0 +1,7 @@
import { OmitType } from '@nestjs/swagger';
import { UserDevicePermissionAddDto } from './user-device-permission.add.dto';
export class UserDevicePermissionEditDto extends OmitType(
UserDevicePermissionAddDto,
['userId'],
) {}

View 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,
},
);
}
}

View 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 {}