From 8b6666534e09d7d1daeaca2199b942263a7a6ecd Mon Sep 17 00:00:00 2001 From: vinod <31404750+vinodnextcoder@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:40:48 +0530 Subject: [PATCH 01/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a633190..c31c0cb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ![Prettier](https://img.shields.io/badge/Code%20style-prettier-informational?logo=prettier&logoColor=white) [![GPL v3 License](https://img.shields.io/badge/License-GPLv3-green.svg)](./LICENSE) -[![HitCount](https://hits.dwyl.com/anilahir/nestjs-authentication-and-authorization.svg)](https://hits.dwyl.com/vinodnextcoder/nestjs-jwt-auth-cookie-mongoose) +[![HitCount](https://hits.dwyl.com/vinodnextcoder/nestjs-jwt-auth-cookie-mongoose.svg)](https://hits.dwyl.com/vinodnextcoder/nestjs-jwt-auth-cookie-mongoose) ## Description From ccb39beade9a4ff1714a487cd0ec554b580fdc29 Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 31 Jan 2024 19:05:49 +0530 Subject: [PATCH 02/20] roles controller initial commit --- src/app.module.ts | 6 ++++-- src/roles/roles.controller.spec.ts | 27 +++++++++++++++++++++++++++ src/roles/roles.controller.ts | 23 +++++++++++++++++++++++ src/roles/roles.module.ts | 13 +++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/roles/roles.controller.spec.ts create mode 100644 src/roles/roles.controller.ts create mode 100644 src/roles/roles.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index 2a38978..7d62d1e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -6,7 +6,8 @@ import { LoggerService } from './common/service/logger.service'; import { LoggerMiddleware } from './common/service/loggermiddleware.service'; import { DatabaseModule } from './config/database.module'; import { helloModule } from './hello/hello.module'; -// import { EmailService } from './common/service/mail.service'; +import { roleModule } from './roles/roles.module'; + console.log(`${process.cwd()}/.env.${process.env.NODE_ENV}`) @Module({ @@ -19,7 +20,8 @@ console.log(`${process.cwd()}/.env.${process.env.NODE_ENV}`) DatabaseModule, UserModule, AuthModule, - helloModule + helloModule, + roleModule ], providers: [ LoggerService diff --git a/src/roles/roles.controller.spec.ts b/src/roles/roles.controller.spec.ts new file mode 100644 index 0000000..77d1bb2 --- /dev/null +++ b/src/roles/roles.controller.spec.ts @@ -0,0 +1,27 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RolesController } from './roles.controller'; +import { LoggerService } from '../common/service/logger.service'; + +describe('RolesController', () => { + let controller: RolesController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [RolesController], + providers: [ + { + provide: LoggerService, + useValue: { + log: jest.fn(), + }, + } + ], + }).compile(); + + controller = module.get(RolesController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/roles/roles.controller.ts b/src/roles/roles.controller.ts new file mode 100644 index 0000000..e9bf11b --- /dev/null +++ b/src/roles/roles.controller.ts @@ -0,0 +1,23 @@ +import { Controller, Get, Injectable } from '@nestjs/common'; +import { Public } from "../common/decorators"; +import { HttpCode } from '@nestjs/common'; +import { LoggerService } from '../common/service/logger.service'; +import { v4 as uuid } from 'uuid'; + + +@Injectable() +@Controller('v1/roles') +export class RolesController { + constructor( + private readonly logger: LoggerService + ) { } + + @Public() + @HttpCode(200) + @Get() + async helloWorld(): Promise { + const id: string = uuid(); + this.logger.log('roles controller called', id, 'roles.controler.ts', 'GET', '/', 'roles'); + return 'Hello World!'; + } +} diff --git a/src/roles/roles.module.ts b/src/roles/roles.module.ts new file mode 100644 index 0000000..e552860 --- /dev/null +++ b/src/roles/roles.module.ts @@ -0,0 +1,13 @@ + +import { Module } from "@nestjs/common"; +import { RolesController } from "./roles.controller"; +import { LoggerService } from "../common/service/logger.service"; + + +@Module({ + providers: [ + LoggerService + ], + controllers: [RolesController] +}) +export class roleModule { } From 543a8829c897080a8b410e7b0aaef7e629650973 Mon Sep 17 00:00:00 2001 From: vinod Date: Fri, 2 Feb 2024 11:36:02 +0530 Subject: [PATCH 03/20] update login service --- src/auth/auth.controller.spec.ts | 5 ++++- src/auth/auth.controller.ts | 11 ++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts index dfd51c8..2eaf7fc 100644 --- a/src/auth/auth.controller.spec.ts +++ b/src/auth/auth.controller.spec.ts @@ -53,7 +53,10 @@ describe("Auth Controller", () => { message: "SUCCESS", isSuccess: true, statusCode: 200, - data: null, + data: { + "access_token": "eyJhbGciOiJIUzI1NiJ9.sss.aaaaa", + "refresh_token": "eyJhbGciOiJIUzI1NiJ9.sss.aaaaa", + } }); expect(mockResponse.cookie).toHaveBeenCalledWith( diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index ef3c38b..538e3f2 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -60,6 +60,7 @@ export class AuthController { signInDto.email, signInDto.password ); + console.log(token) res.cookie("access_token", token.access_token, { httpOnly: false, @@ -82,7 +83,7 @@ export class AuthController { HttpStatus.OK, statusMessage[HttpStatus.OK], true, - null + token ); } @@ -100,7 +101,7 @@ export class AuthController { @GetCurrentUser("user") userId: string, @Res() res: Response ) { - const tokens = await this.authService.getTokens(payload); + const token = await this.authService.getTokens(payload); const id: string = uuid(); this.logger.log( "User refresh api called", @@ -110,7 +111,7 @@ export class AuthController { "/refresh", "refreshTokens" ); - res.cookie("access_token", tokens.access_token, { + res.cookie("access_token", token.access_token, { httpOnly: false, expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), path: "/", @@ -118,7 +119,7 @@ export class AuthController { secure: false, }); - res.cookie("refresh_token", tokens.refresh_token, { + res.cookie("refresh_token", token.refresh_token, { httpOnly: false, expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), path: "/", @@ -131,7 +132,7 @@ export class AuthController { HttpStatus.OK, statusMessage[HttpStatus.OK], true, - null + token ); } From 854724f563e7fdb68091dac00c7c78b6997b4e2d Mon Sep 17 00:00:00 2001 From: vinod Date: Fri, 2 Feb 2024 12:12:06 +0530 Subject: [PATCH 04/20] update login service --- src/auth/auth.controller.spec.ts | 23 ----------------------- src/auth/auth.controller.ts | 25 +++++++++++-------------- src/main.ts | 14 +++++++++++++- 3 files changed, 24 insertions(+), 38 deletions(-) diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts index 2eaf7fc..125c31c 100644 --- a/src/auth/auth.controller.spec.ts +++ b/src/auth/auth.controller.spec.ts @@ -59,29 +59,6 @@ describe("Auth Controller", () => { } }); - expect(mockResponse.cookie).toHaveBeenCalledWith( - 'access_token', - 'eyJhbGciOiJIUzI1NiJ9.sss.aaaaa', - expect.objectContaining({ - httpOnly: false, - expires: expect.any(Date), - path: '/', - sameSite: 'none', - secure: false, - }) - ); - - expect(mockResponse.cookie).toHaveBeenCalledWith( - 'refresh_token', - 'eyJhbGciOiJIUzI1NiJ9.sss.aaaaa', - expect.objectContaining({ - httpOnly: false, - expires: expect.any(Date), - path: '/', - sameSite: 'none', - secure: false, - }) - ); }); it("should call the service's signIn method", async () => { diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 538e3f2..762b46e 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -63,19 +63,17 @@ export class AuthController { console.log(token) res.cookie("access_token", token.access_token, { - httpOnly: false, - expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), - path: "/", - sameSite: "none", + httpOnly: true, secure: false, + sameSite: 'lax', + expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), }); res.cookie("refresh_token", token.refresh_token, { - httpOnly: false, - expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), - path: "/", - sameSite: "none", + httpOnly: true, secure: false, + sameSite: 'lax', + expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000) }); return sendResponse( @@ -112,19 +110,18 @@ export class AuthController { "refreshTokens" ); res.cookie("access_token", token.access_token, { - httpOnly: false, + httpOnly: true, expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), path: "/", - sameSite: "none", - secure: false, + secure: true, }); res.cookie("refresh_token", token.refresh_token, { - httpOnly: false, + httpOnly: true, expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000), path: "/", - sameSite: "none", - secure: false, + + secure: true, }); return sendResponse( diff --git a/src/main.ts b/src/main.ts index 881aef2..6016bf8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -40,7 +40,19 @@ async function bootstrap() { SwaggerModule.setup("api", app, document); app.use(helmet()); app.use(cookieParser()); - app.enableCors(); + app.enableCors({ + origin: [ + 'http://localhost:3000/', + 'http://example.com/', + 'http://www.example.com/', + 'http://app.example.com/', + 'https://example.com/', + 'https://www.example.com/', + 'https://app.example.com/', + ], + methods: ["GET", "POST"], + credentials: true + }); await app.listen(Number(process.env.PORT) || 3000); console.log(`Application is running on: ${await app.getUrl()}`); } From 1265818aebab63325f13c64fb742df47efc93922 Mon Sep 17 00:00:00 2001 From: vinod Date: Fri, 2 Feb 2024 16:28:14 +0530 Subject: [PATCH 05/20] disable email --- .env.development | 1 + src/users/users.controller.ts | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.env.development b/.env.development index 4ab1ee7..3114ae8 100644 --- a/.env.development +++ b/.env.development @@ -4,3 +4,4 @@ SERVER_URL=http://localhost:3000/ PORT=4000 JWT_KEY='MXvTnOhWYMYgYiFnBFRfX4Fnd4ZkXLK8qYU' IS_COOKIE_AUTH=false +IS_EMAIL=false diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 8bfc7e4..960be7f 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -53,7 +53,11 @@ export class UserController { const id: string = uuid(); this.logger.log('User create api called', id, 'users.controler.ts', 'POST', '/users', 'create'); const user = await this.userService.create(createCatDto); - await this.mailer.sendEmailVerification(user.email, user.email_code) + const isMAil = process.env.IS_EMAIL + console.log('##############', isMAil) + if (isMAil === "true") { + await this.mailer.sendEmailVerification(user.email, user.email_code) + } return sendResponse( res, HttpStatus.CREATED, From 1e74e33eee6cae3a154f44c8b244ac2dbecd8f93 Mon Sep 17 00:00:00 2001 From: vinod Date: Tue, 6 Feb 2024 18:11:33 +0530 Subject: [PATCH 06/20] get users --- .env.development | 2 +- src/interface/common.ts | 15 ++++++++----- src/users/users.controller.ts | 41 +++++++++++++++++++++++++++++++++-- src/users/users.service.ts | 4 ++-- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/.env.development b/.env.development index 3114ae8..09d9bdf 100644 --- a/.env.development +++ b/.env.development @@ -3,5 +3,5 @@ MONGODB_URI=mongodb://0.0.0.0:27017/test SERVER_URL=http://localhost:3000/ PORT=4000 JWT_KEY='MXvTnOhWYMYgYiFnBFRfX4Fnd4ZkXLK8qYU' -IS_COOKIE_AUTH=false +IS_COOKIE_AUTH=true IS_EMAIL=false diff --git a/src/interface/common.ts b/src/interface/common.ts index 55720ce..556b2b5 100644 --- a/src/interface/common.ts +++ b/src/interface/common.ts @@ -5,9 +5,9 @@ export interface responseData { path?: String; data?: [] | null; message: String, - isSuccess : Boolean, - error: string | null |[] - + isSuccess: Boolean, + error: string | null | [] + } export interface userData { @@ -18,9 +18,12 @@ export interface userData { email?: String; email_code?: String; password?: String; - password_reset_code? :String - _id? : Types.ObjectId | String| null - hashdRt? :String | null + password_reset_code?: String + _id?: Types.ObjectId | String | null + hashdRt?: String | null +} +export interface UserRequest extends Request { + user: any } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 960be7f..d7e8fea 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -3,7 +3,10 @@ import { Controller, Get, HttpStatus, + Param, Post, + Query, + Req, Res, UseFilters, UseGuards, @@ -14,7 +17,7 @@ import { Public } from "../common/decorators"; import { LoggerService } from '../common/service/logger.service'; import { UserService } from "./users.service"; import { CreateUserDto } from "./dto/create-user.dto"; -import { Response } from "express"; +import { Request, Response } from "express"; import { sendResponse, userErrorResponse, @@ -23,7 +26,7 @@ import { } from "../utils"; import { statusMessage } from "../constant/statusMessage"; import { HttpExceptionFilter } from "../utils/http-exception.filter"; -import { responseData, userData } from "../interface/common"; +import { UserRequest, responseData, userData } from "../interface/common"; import { AuthGuard } from "../common/guards/at.guard"; import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { v4 as uuid } from 'uuid'; @@ -89,4 +92,38 @@ export class UserController { userList ); } + + + // get user + @ApiOperation({ + summary: "User List", + description: "Get User List", + }) + @ApiResponse(userListSuccessResponse) + @ApiResponse({ status: 403, description: "Forbidden." }) + @UseGuards(AuthGuard) + @Get('getuser') + @UseFilters(new HttpExceptionFilter()) + async findUser(@Query('userid') name: string, @Req() req: UserRequest, @Res() res: Response): Promise { + const id: string = uuid(); + this.logger.log('find User api called', id, 'users.controler.ts', 'GET', '/getuser', 'findUser'); + + let userid: string = null; + if (userid) { + userid = userid; + } else { + userid = req.user.sub + } + userid = req.user.sub + let projection = { _id: 1, first_name: 1, last_name: 1, email: 1 } + const userList = await this.userService.findOne(userid, projection); + return sendResponse( + res, + HttpStatus.OK, + statusMessage[HttpStatus.OK], + true, + userList + ); + } + } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index ecb01fd..78f2794 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -38,8 +38,8 @@ export class UserService { return this.userModel.find().exec(); } - async findOne(id: string): Promise { - return this.userModel.findOne({ _id: id }).exec(); + async findOne(id: string, projection = {}): Promise { + return this.userModel.findOne({ _id: id }, projection).exec(); } async findOneUser(email: string): Promise { From b4702cb91aa44541b4f883b873e7e015dd288f52 Mon Sep 17 00:00:00 2001 From: vinod Date: Tue, 6 Feb 2024 18:16:46 +0530 Subject: [PATCH 07/20] postman collection --- node-boilerplate.postman_collection.json | 133 +++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 node-boilerplate.postman_collection.json diff --git a/node-boilerplate.postman_collection.json b/node-boilerplate.postman_collection.json new file mode 100644 index 0000000..1592eff --- /dev/null +++ b/node-boilerplate.postman_collection.json @@ -0,0 +1,133 @@ +{ + "info": { + "_postman_id": "1c4f13b4-625a-43b8-b4ba-27fb10056118", + "name": "node-boilerplate", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "30399582" + }, + "item": [ + { + "name": "user login", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"password\":\"Password1@\",\r\n \"email\":\"te@test.com\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:4000/auth/login", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4000", + "path": [ + "auth", + "login" + ] + } + }, + "response": [] + }, + { + "name": "user create", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\":\"11\",\r\n \"first_name\":\"test\",\r\n \"last_name\":\"test\",\r\n \"password\":\"Password1@\",\r\n \"password_reset_code\":\"1\",\r\n \"email\":\"te@test.com\",\r\n \"email_code\":\"eee\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:4000/v1/users", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4000", + "path": [ + "v1", + "users" + ] + } + }, + "response": [] + }, + { + "name": "getUserid", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:4000/v1/users/getuser", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4000", + "path": [ + "v1", + "users", + "getuser" + ] + } + }, + "response": [] + }, + { + "name": "getUser", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:4000/v1/users", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4000", + "path": [ + "v1", + "users" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file From 7e004ac7e2f708220c5ef0bf68111a46145bfc53 Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 7 Feb 2024 10:10:57 +0530 Subject: [PATCH 08/20] roles schema added --- src/roles/schemas/roles.schema.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/roles/schemas/roles.schema.ts diff --git a/src/roles/schemas/roles.schema.ts b/src/roles/schemas/roles.schema.ts new file mode 100644 index 0000000..7e59997 --- /dev/null +++ b/src/roles/schemas/roles.schema.ts @@ -0,0 +1,22 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { HydratedDocument, now } from 'mongoose'; + +export type RolesDocument = HydratedDocument; + +@Schema({ timestamps: true }) +export class Roles { + @Prop({ type: String }) + role_name: string; + @Prop({ type: String }) + description: string; + @Prop({ type: String }) + status: string; + @Prop({ type: Boolean }) + is_admin: { type: Boolean, default: false } + @Prop({ default: now() }) + createdAt: Date; + @Prop({ default: now() }) + updatedAt: Date; +} + +export const RolesSchema = SchemaFactory.createForClass(Roles); \ No newline at end of file From 0e7c8da4037a79b84d80e799ee4bea01372566ac Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 7 Feb 2024 10:42:28 +0530 Subject: [PATCH 09/20] update access token --- src/common/guards/at.guard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/guards/at.guard.ts b/src/common/guards/at.guard.ts index ee72a4e..3e7f8d4 100644 --- a/src/common/guards/at.guard.ts +++ b/src/common/guards/at.guard.ts @@ -49,7 +49,7 @@ export class AuthGuard implements CanActivate { let isCookieAuth = `${process.env.IS_COOKIE_AUTH}`; let token = undefined; if (isCookieAuth === "true") { - token = request?.cookies?.refresh_token ?? null; + token = request?.cookies?.access_token ?? null; } else { const [type, tokenValue] = request.headers.authorization?.split(" ") ?? []; From 8d5ef58e60b815d418fe1411e39819f46ccd44ad Mon Sep 17 00:00:00 2001 From: Pankaj Gurav Date: Wed, 7 Feb 2024 11:48:58 +0530 Subject: [PATCH 10/20] To send error for wrong password --- .env.development | 2 +- src/auth/auth.controller.ts | 2 ++ src/auth/auth.service.ts | 4 ++++ src/users/users.controller.ts | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.env.development b/.env.development index 09d9bdf..3114ae8 100644 --- a/.env.development +++ b/.env.development @@ -3,5 +3,5 @@ MONGODB_URI=mongodb://0.0.0.0:27017/test SERVER_URL=http://localhost:3000/ PORT=4000 JWT_KEY='MXvTnOhWYMYgYiFnBFRfX4Fnd4ZkXLK8qYU' -IS_COOKIE_AUTH=true +IS_COOKIE_AUTH=false IS_EMAIL=false diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 762b46e..6c01f35 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -61,6 +61,8 @@ export class AuthController { signInDto.password ); console.log(token) + console.log(signInDto.email, + signInDto.password) res.cookie("access_token", token.access_token, { httpOnly: true, diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 879b122..ca4e364 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -20,17 +20,21 @@ export class AuthService { const id: string = uuid(); this.logger.log('auth service api called', id, 'auth.service.ts', '', '', 'signIn-service'); const user = await this.usersService.findOneUser(email); + console.log(user) if (!user) { throw new UnauthorizedException('Username and password wrong.'); } const match = await bcrypt.compare(pass, user?.password); + console.log(match) if (match) { const payload = { email: user.email, userId: user._id.toString(), username: user.username }; const tokens = await this.getTokens(payload); return { ...tokens }; + } else { + throw new UnauthorizedException('Username and password wrong.'); } } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index d7e8fea..4fb4bf0 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -106,6 +106,7 @@ export class UserController { @UseFilters(new HttpExceptionFilter()) async findUser(@Query('userid') name: string, @Req() req: UserRequest, @Res() res: Response): Promise { const id: string = uuid(); + console.log('=============================================================IN FUNCTION') this.logger.log('find User api called', id, 'users.controler.ts', 'GET', '/getuser', 'findUser'); let userid: string = null; From c9821634897875a6468ad926ca254c1879d54284 Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 28 Feb 2024 16:04:34 +0530 Subject: [PATCH 11/20] user roles --- src/roles/roles.controller.ts | 27 ++++++++++++++++++++++++++- src/roles/roles.module.ts | 11 ++++++++++- src/roles/roles.service.ts | 24 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/roles/roles.service.ts diff --git a/src/roles/roles.controller.ts b/src/roles/roles.controller.ts index e9bf11b..8fbec11 100644 --- a/src/roles/roles.controller.ts +++ b/src/roles/roles.controller.ts @@ -1,14 +1,19 @@ -import { Controller, Get, Injectable } from '@nestjs/common'; +import { Body, Controller, Get, HttpStatus, Injectable, Post, Res, UseFilters, UsePipes, ValidationPipe, Version } from '@nestjs/common'; import { Public } from "../common/decorators"; import { HttpCode } from '@nestjs/common'; import { LoggerService } from '../common/service/logger.service'; import { v4 as uuid } from 'uuid'; +import { HttpExceptionFilter } from 'src/utils/http-exception.filter'; +import { statusMessage } from '../constant/statusMessage'; +import { sendResponse } from '../utils/index'; +import { RolesService } from './roles.service'; @Injectable() @Controller('v1/roles') export class RolesController { constructor( + private readonly rolesService :RolesService, private readonly logger: LoggerService ) { } @@ -20,4 +25,24 @@ export class RolesController { this.logger.log('roles controller called', id, 'roles.controler.ts', 'GET', '/', 'roles'); return 'Hello World!'; } + + @Public() + @HttpCode(200) + @UseFilters(new HttpExceptionFilter()) + @UsePipes(new ValidationPipe({ transform: true })) + @Version('1') + @Post('/add') + async addProduct(@Body() productDto: any, @Res() res: Response): Promise { + console.log(productDto) + const id: string = uuid(); + this.logger.log('roles controller called', id, 'roles.controler.ts', 'POST', '/', 'roles'); + const prod = await this.rolesService.create(productDto); + return sendResponse( + res, + HttpStatus.OK, + statusMessage[HttpStatus.OK], + true, + null + ); + } } diff --git a/src/roles/roles.module.ts b/src/roles/roles.module.ts index e552860..45277e2 100644 --- a/src/roles/roles.module.ts +++ b/src/roles/roles.module.ts @@ -2,11 +2,20 @@ import { Module } from "@nestjs/common"; import { RolesController } from "./roles.controller"; import { LoggerService } from "../common/service/logger.service"; +import { RolesService } from "./roles.service"; +import { MongooseModule } from "@nestjs/mongoose"; +import { Roles, RolesSchema } from "./schemas/roles.schema"; @Module({ + imports: [ + MongooseModule.forFeature([ + { name: Roles.name, schema: RolesSchema } + ]), + ], providers: [ - LoggerService + LoggerService, + RolesService ], controllers: [RolesController] }) diff --git a/src/roles/roles.service.ts b/src/roles/roles.service.ts new file mode 100644 index 0000000..a5226e4 --- /dev/null +++ b/src/roles/roles.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from "@nestjs/common"; +import { LoggerService } from '../common/service/logger.service'; +import { InjectModel } from "@nestjs/mongoose"; +import { Model, Types } from "mongoose"; +import { Roles } from "./schemas/roles.schema"; +import { v4 as uuid } from 'uuid'; + +@Injectable() +export class RolesService { + constructor( + @InjectModel(Roles.name) private readonly roleModel: Model, + private readonly logger: LoggerService + ) { } + + async create(product: any): Promise { + const id: string = uuid(); + this.logger.log('Roles service create called', id, 'Roles.service.ts', '', '', 'create-service'); + + const createProduct = await this.roleModel.create(product); + return createProduct; + } + + +} From 6cd321d59f1eb32ed6c3bc82cfb7abcdc0763ddd Mon Sep 17 00:00:00 2001 From: vinod Date: Thu, 29 Feb 2024 10:15:57 +0530 Subject: [PATCH 12/20] user roles --- src/users/dto/create-user.dto.ts | 4 ++++ src/users/schemas/user.schema.ts | 5 ++++- src/users/users.controller.ts | 9 +++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 618ed08..5a5c3c3 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -5,6 +5,7 @@ import { IsOptional, IsStrongPassword, } from "class-validator"; +import mongoose, { ObjectId } from "mongoose"; export class CreateUserDto { @ApiProperty({ example: 'testname', description: 'username of the user' }) @@ -39,4 +40,7 @@ export class CreateUserDto { updatedAt?: Date; @ApiProperty({ description: 'Email verification status' }) isEmailVerify?: Boolean; + @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) + roleId?: string + } diff --git a/src/users/schemas/user.schema.ts b/src/users/schemas/user.schema.ts index c5427f4..c94b7d8 100644 --- a/src/users/schemas/user.schema.ts +++ b/src/users/schemas/user.schema.ts @@ -1,5 +1,6 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; -import { HydratedDocument, now } from 'mongoose'; +import mongoose, { HydratedDocument, ObjectId, now } from 'mongoose'; +import { Roles } from '../../roles/schemas/roles.schema'; export type UserDocument = HydratedDocument; @@ -27,6 +28,8 @@ export class User { updatedAt: Date; @Prop({ default: false }) isEmailVerify: Boolean; + @Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'Roles' }) + roleId : string } export const UserSchema = SchemaFactory.createForClass(User); \ No newline at end of file diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index d7e8fea..67aa73e 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -31,6 +31,7 @@ import { AuthGuard } from "../common/guards/at.guard"; import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { v4 as uuid } from 'uuid'; import { EmailService } from '../common/service/mail.service'; +import mongoose from "mongoose"; @ApiTags("users") @Controller("v1/users") @@ -50,12 +51,16 @@ export class UserController { @UseFilters(new HttpExceptionFilter()) @UsePipes(new ValidationPipe({ transform: true })) async create( - @Body() createCatDto: CreateUserDto, + @Body() createUserDto: CreateUserDto, @Res() res: Response ): Promise { const id: string = uuid(); this.logger.log('User create api called', id, 'users.controler.ts', 'POST', '/users', 'create'); - const user = await this.userService.create(createCatDto); + console.log( + createUserDto + ) + createUserDto.roleId = createUserDto.roleId; + const user = await this.userService.create(createUserDto); const isMAil = process.env.IS_EMAIL console.log('##############', isMAil) if (isMAil === "true") { From daff9df2a0bb015d3b7a6dd037d74195ab4f20a4 Mon Sep 17 00:00:00 2001 From: vinod Date: Thu, 29 Feb 2024 10:23:46 +0530 Subject: [PATCH 13/20] user roles --- src/users/dto/create-user.dto.ts | 3 ++- src/users/schemas/user.schema.ts | 4 ++-- src/users/users.controller.ts | 7 ++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 5a5c3c3..c4db816 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -6,6 +6,7 @@ import { IsStrongPassword, } from "class-validator"; import mongoose, { ObjectId } from "mongoose"; +import { Roles } from "../../roles/schemas/roles.schema"; export class CreateUserDto { @ApiProperty({ example: 'testname', description: 'username of the user' }) @@ -41,6 +42,6 @@ export class CreateUserDto { @ApiProperty({ description: 'Email verification status' }) isEmailVerify?: Boolean; @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) - roleId?: string + roles?: Roles } diff --git a/src/users/schemas/user.schema.ts b/src/users/schemas/user.schema.ts index c94b7d8..48041c6 100644 --- a/src/users/schemas/user.schema.ts +++ b/src/users/schemas/user.schema.ts @@ -28,8 +28,8 @@ export class User { updatedAt: Date; @Prop({ default: false }) isEmailVerify: Boolean; - @Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'Roles' }) - roleId : string + @Prop({ type: mongoose.Schema.Types.ObjectId, ref: Roles.name }) + roles: Roles; } export const UserSchema = SchemaFactory.createForClass(User); \ No newline at end of file diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 67aa73e..d6d6863 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -56,13 +56,10 @@ export class UserController { ): Promise { const id: string = uuid(); this.logger.log('User create api called', id, 'users.controler.ts', 'POST', '/users', 'create'); - console.log( - createUserDto - ) - createUserDto.roleId = createUserDto.roleId; + const user = await this.userService.create(createUserDto); const isMAil = process.env.IS_EMAIL - console.log('##############', isMAil) + if (isMAil === "true") { await this.mailer.sendEmailVerification(user.email, user.email_code) } From 576229df4f7e0d525e305eda9fcf0c288dd1ac52 Mon Sep 17 00:00:00 2001 From: vinod Date: Fri, 1 Mar 2024 00:00:19 +0530 Subject: [PATCH 14/20] db connection --- src/users/users.controller.ts | 1 + src/users/users.service.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index d6d6863..e10ca8f 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -77,6 +77,7 @@ export class UserController { summary: "User List", description: "Get User List", }) + @Public() @ApiResponse(userListSuccessResponse) @ApiResponse({ status: 403, description: "Forbidden." }) @UseGuards(AuthGuard) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 78f2794..741cb6b 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -35,15 +35,15 @@ export class UserService { async findAll(): Promise { const id: string = uuid(); this.logger.log('User service findall called', id, 'users.service.ts', '', '', 'findAll-service'); - return this.userModel.find().exec(); + return this.userModel.find().populate('roles').exec(); } async findOne(id: string, projection = {}): Promise { - return this.userModel.findOne({ _id: id }, projection).exec(); + return this.userModel.findOne({ _id: id }, projection).populate('roles').exec(); } async findOneUser(email: string): Promise { - return this.userModel.findOne({ email: email }).exec(); + return this.userModel.findOne({ email: email }).populate('roles').exec(); } async delete(id: string) { const deletedUser = await this.userModel From b1496830673730badb96f3afafe972402c9a050f Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 13 Mar 2024 10:15:17 +0530 Subject: [PATCH 15/20] fix user roles --- src/roles/roles.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/roles/roles.controller.ts b/src/roles/roles.controller.ts index 8fbec11..dafb4e4 100644 --- a/src/roles/roles.controller.ts +++ b/src/roles/roles.controller.ts @@ -32,7 +32,7 @@ export class RolesController { @UsePipes(new ValidationPipe({ transform: true })) @Version('1') @Post('/add') - async addProduct(@Body() productDto: any, @Res() res: Response): Promise { + async addRole(@Body() productDto: any, @Res() res: Response): Promise { console.log(productDto) const id: string = uuid(); this.logger.log('roles controller called', id, 'roles.controler.ts', 'POST', '/', 'roles'); From 742dafe2a9862a9e055900462b7e60f1e0d032f1 Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 13 Mar 2024 10:25:39 +0530 Subject: [PATCH 16/20] fix user roles query --- src/users/users.controller.ts | 1 + src/users/users.service.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index e10ca8f..806b61f 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -130,3 +130,4 @@ export class UserController { } } +// "role_name": "admin", diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 741cb6b..baa7a36 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -35,15 +35,15 @@ export class UserService { async findAll(): Promise { const id: string = uuid(); this.logger.log('User service findall called', id, 'users.service.ts', '', '', 'findAll-service'); - return this.userModel.find().populate('roles').exec(); + return this.userModel.find().populate('roles','role_name').exec(); } async findOne(id: string, projection = {}): Promise { - return this.userModel.findOne({ _id: id }, projection).populate('roles').exec(); + return this.userModel.findOne({ _id: id }, projection).populate('roles','role_name').exec(); } async findOneUser(email: string): Promise { - return this.userModel.findOne({ email: email }).populate('roles').exec(); + return this.userModel.findOne({ email: email }).populate('roles','role_name').exec(); } async delete(id: string) { const deletedUser = await this.userModel From 73f4aa3606820d31c95c613977b48b982cf681ca Mon Sep 17 00:00:00 2001 From: vinod Date: Wed, 13 Mar 2024 11:19:36 +0530 Subject: [PATCH 17/20] user roles ;ist --- src/roles/roles.controller.ts | 20 ++++++++++++++++++++ src/roles/roles.service.ts | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/src/roles/roles.controller.ts b/src/roles/roles.controller.ts index dafb4e4..d868f26 100644 --- a/src/roles/roles.controller.ts +++ b/src/roles/roles.controller.ts @@ -45,4 +45,24 @@ export class RolesController { null ); } + + + @Public() + @HttpCode(200) + @UseFilters(new HttpExceptionFilter()) + @UsePipes(new ValidationPipe({ transform: true })) + @Version('1') + @Get('/list') + async getRoles(@Res() res: Response): Promise { + const id: string = uuid(); + this.logger.log('roles controller called', id, 'roles.controler.ts', 'POST', '/', 'roles'); + const rolesList = await this.rolesService.findAll(); + return sendResponse( + res, + HttpStatus.OK, + statusMessage[HttpStatus.OK], + true, + rolesList + ); + } } diff --git a/src/roles/roles.service.ts b/src/roles/roles.service.ts index a5226e4..e9de909 100644 --- a/src/roles/roles.service.ts +++ b/src/roles/roles.service.ts @@ -20,5 +20,10 @@ export class RolesService { return createProduct; } + async findAll(): Promise { + const id: string = uuid(); + this.logger.log('Roles service findall called', id, 'roles.service.ts', '', '', 'findAll-service'); + return this.roleModel.find().exec(); + } } From dec3a9985576abb47d9672243972a0ac444ce8b7 Mon Sep 17 00:00:00 2001 From: vinod Date: Thu, 14 Mar 2024 11:43:31 +0530 Subject: [PATCH 18/20] module add --- src/app.module.ts | 4 +- src/app_module/module.controller.spec.ts | 27 ++++++++++ src/app_module/module.controller.ts | 69 ++++++++++++++++++++++++ src/app_module/module.module.ts | 22 ++++++++ src/app_module/module.service.ts | 29 ++++++++++ src/app_module/schemas/modules.schema.ts | 23 ++++++++ 6 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 src/app_module/module.controller.spec.ts create mode 100644 src/app_module/module.controller.ts create mode 100644 src/app_module/module.module.ts create mode 100644 src/app_module/module.service.ts create mode 100644 src/app_module/schemas/modules.schema.ts diff --git a/src/app.module.ts b/src/app.module.ts index 7d62d1e..71642b6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,6 +7,7 @@ import { LoggerMiddleware } from './common/service/loggermiddleware.service'; import { DatabaseModule } from './config/database.module'; import { helloModule } from './hello/hello.module'; import { roleModule } from './roles/roles.module'; +import { app_Module } from './app_module/module.module'; console.log(`${process.cwd()}/.env.${process.env.NODE_ENV}`) @@ -21,7 +22,8 @@ console.log(`${process.cwd()}/.env.${process.env.NODE_ENV}`) UserModule, AuthModule, helloModule, - roleModule + roleModule, + app_Module ], providers: [ LoggerService diff --git a/src/app_module/module.controller.spec.ts b/src/app_module/module.controller.spec.ts new file mode 100644 index 0000000..32a7da0 --- /dev/null +++ b/src/app_module/module.controller.spec.ts @@ -0,0 +1,27 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ModulesController } from './module.controller'; +import { LoggerService } from '../common/service/logger.service'; + +describe('RolesController', () => { + let controller: ModulesController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ModulesController], + providers: [ + { + provide: LoggerService, + useValue: { + log: jest.fn(), + }, + } + ], + }).compile(); + + controller = module.get(ModulesController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/app_module/module.controller.ts b/src/app_module/module.controller.ts new file mode 100644 index 0000000..10937d3 --- /dev/null +++ b/src/app_module/module.controller.ts @@ -0,0 +1,69 @@ +import { Body, Controller, Get, HttpStatus, Injectable, Post, Res, UseFilters, UsePipes, ValidationPipe, Version } from '@nestjs/common'; +import { Public } from "../common/decorators"; +import { HttpCode } from '@nestjs/common'; +import { LoggerService } from '../common/service/logger.service'; +import { v4 as uuid } from 'uuid'; +import { HttpExceptionFilter } from 'src/utils/http-exception.filter'; +import { statusMessage } from '../constant/statusMessage'; +import { sendResponse } from '../utils/index'; +import { ModulesService } from './module.service'; + + + +@Injectable() +@Controller('v1/modules') +export class ModulesController { + constructor( + private readonly modulesService :ModulesService, + private readonly logger: LoggerService + ) { } + + @Public() + @HttpCode(200) + @Get() + async helloWorld(): Promise { + const id: string = uuid(); + this.logger.log('modules controller called', id, 'modules.controler.ts', 'GET', '/', 'modules'); + return 'Hello World!'; + } + + @Public() + @HttpCode(200) + @UseFilters(new HttpExceptionFilter()) + @UsePipes(new ValidationPipe({ transform: true })) + @Version('1') + @Post('/add') + async addRole(@Body() productDto: any, @Res() res: Response): Promise { + console.log(productDto) + const id: string = uuid(); + this.logger.log('modules controller called', id, 'modules.controler.ts', 'POST', '/', 'roles'); + const prod = await this.modulesService.create(productDto); + return sendResponse( + res, + HttpStatus.OK, + statusMessage[HttpStatus.OK], + true, + null + ); + } + + + @Public() + @HttpCode(200) + @UseFilters(new HttpExceptionFilter()) + @UsePipes(new ValidationPipe({ transform: true })) + @Version('1') + @Get('/list') + async getRoles(@Res() res: Response): Promise { + const id: string = uuid(); + this.logger.log('modules controller called', id, 'modules.controler.ts', 'POST', '/', 'modules'); + const rolesList = await this.modulesService.findAll(); + return sendResponse( + res, + HttpStatus.OK, + statusMessage[HttpStatus.OK], + true, + rolesList + ); + } +} diff --git a/src/app_module/module.module.ts b/src/app_module/module.module.ts new file mode 100644 index 0000000..a043bae --- /dev/null +++ b/src/app_module/module.module.ts @@ -0,0 +1,22 @@ + +import { Module } from "@nestjs/common"; +import { LoggerService } from "../common/service/logger.service"; +import { MongooseModule } from "@nestjs/mongoose"; +import { ModulesService } from "./module.service"; +import { ModulesController } from "./module.controller"; +import { Modules, ModulesSchema } from "./schemas/modules.schema"; + + +@Module({ + imports: [ + MongooseModule.forFeature([ + { name: Modules.name, schema: ModulesSchema } + ]), + ], + providers: [ + LoggerService, + ModulesService + ], + controllers: [ModulesController] +}) +export class app_Module { } diff --git a/src/app_module/module.service.ts b/src/app_module/module.service.ts new file mode 100644 index 0000000..3ed7736 --- /dev/null +++ b/src/app_module/module.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from "@nestjs/common"; +import { LoggerService } from '../common/service/logger.service'; +import { InjectModel } from "@nestjs/mongoose"; +import { Model, Types } from "mongoose"; +import { Modules } from "./schemas/modules.schema"; +import { v4 as uuid } from 'uuid'; + +@Injectable() +export class ModulesService { + constructor( + @InjectModel(Modules.name) private readonly appModel: Model, + private readonly logger: LoggerService + ) { } + + async create(product: any): Promise { + const id: string = uuid(); + this.logger.log('modules service create called', id, 'modules.service.ts', '', '', 'create-service'); + + const createProduct = await this.appModel.create(product); + return createProduct; + } + + async findAll(): Promise { + const id: string = uuid(); + this.logger.log('modules service findall called', id, 'modules.service.ts', '', '', 'findAll-service'); + return this.appModel.find().exec(); + } + +} diff --git a/src/app_module/schemas/modules.schema.ts b/src/app_module/schemas/modules.schema.ts new file mode 100644 index 0000000..f014dd3 --- /dev/null +++ b/src/app_module/schemas/modules.schema.ts @@ -0,0 +1,23 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { HydratedDocument,now } from 'mongoose'; + +export type ModuleDocument = HydratedDocument; + +@Schema({ timestamps: true }) +export class Modules { + @Prop({ required: true, unique: true }) + moduleName: string; + @Prop({ default: null }) + description: string; + @Prop({ default: false }) + read: boolean; + @Prop({ default: false }) + write: boolean; + @Prop({ default: false }) + edit: boolean; + createdAt: Date; + @Prop({ default: now() }) + updatedAt: Date; +} + +export const ModulesSchema = SchemaFactory.createForClass(Modules); \ No newline at end of file From f562fd56b387f9cad14c1d3e8a73e23532f9e541 Mon Sep 17 00:00:00 2001 From: vinod Date: Fri, 15 Mar 2024 10:34:47 +0530 Subject: [PATCH 19/20] module add --- src/users/dto/create-user.dto.ts | 5 ++++- src/users/schemas/user.schema.ts | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index c4db816..c39141d 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -5,7 +5,7 @@ import { IsOptional, IsStrongPassword, } from "class-validator"; -import mongoose, { ObjectId } from "mongoose"; +import { Modules } from '../../app_module/schemas/modules.schema' import { Roles } from "../../roles/schemas/roles.schema"; export class CreateUserDto { @@ -43,5 +43,8 @@ export class CreateUserDto { isEmailVerify?: Boolean; @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) roles?: Roles + + @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) + modules?: Modules } diff --git a/src/users/schemas/user.schema.ts b/src/users/schemas/user.schema.ts index 48041c6..ba6e665 100644 --- a/src/users/schemas/user.schema.ts +++ b/src/users/schemas/user.schema.ts @@ -1,7 +1,7 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import mongoose, { HydratedDocument, ObjectId, now } from 'mongoose'; import { Roles } from '../../roles/schemas/roles.schema'; - +import { Modules } from '../../app_module/schemas/modules.schema' export type UserDocument = HydratedDocument; @Schema({ timestamps: true }) @@ -30,6 +30,8 @@ export class User { isEmailVerify: Boolean; @Prop({ type: mongoose.Schema.Types.ObjectId, ref: Roles.name }) roles: Roles; + @Prop({ type: mongoose.Schema.Types.ObjectId, ref: Modules.name }) + module: Modules; } export const UserSchema = SchemaFactory.createForClass(User); \ No newline at end of file From d09347fc952e03745862991798bfc3c8b387141b Mon Sep 17 00:00:00 2001 From: vinod Date: Mon, 18 Mar 2024 12:04:20 +0530 Subject: [PATCH 20/20] module add --- src/users/dto/create-user.dto.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index c39141d..4ba57ee 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -41,10 +41,11 @@ export class CreateUserDto { updatedAt?: Date; @ApiProperty({ description: 'Email verification status' }) isEmailVerify?: Boolean; + @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) roles?: Roles - @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Roleid ' }) + @ApiPropertyOptional({ example: 'iiiisskjkjakk', description: 'Moduleid ' }) modules?: Modules }