Skip to content

Commit 0f166cd

Browse files
committed
add guards role
1 parent d70916c commit 0f166cd

21 files changed

+608
-4
lines changed

package-lock.json

Lines changed: 334 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@
3434
"@nestjs/common": "^8.0.0",
3535
"@nestjs/config": "^1.2.0",
3636
"@nestjs/core": "^8.0.0",
37+
"@nestjs/jwt": "^8.0.0",
3738
"@nestjs/mapped-types": "^1.0.1",
39+
"@nestjs/passport": "^8.2.1",
3840
"@nestjs/platform-express": "^8.0.0",
3941
"@nestjs/typeorm": "^8.0.3",
4042
"bcrypt": "^5.0.1",
4143
"class-transformer": "^0.5.1",
4244
"class-validator": "^0.13.2",
4345
"joi": "^17.6.0",
46+
"passport-jwt": "^4.0.0",
47+
"passport-local": "^1.0.0",
4448
"pg": "^8.7.3",
4549
"reflect-metadata": "^0.1.13",
4650
"rimraf": "^3.0.2",

src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as Joi from 'joi';
55
import config from './config';
66
import { enviroments } from './environments';
77
import { UsersModule } from './users/users.module';
8+
import { AuthModule } from './auth/auth.module';
89

910
@Module({
1011
imports: [
@@ -36,6 +37,7 @@ import { UsersModule } from './users/users.module';
3637
},
3738
}),
3839
UsersModule,
40+
AuthModule,
3941
],
4042
controllers: [],
4143
providers: [],

src/auth/auth.controller.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { AuthController } from './auth.controller';
3+
import { AuthService } from './auth.service';
4+
5+
describe('AuthController', () => {
6+
let controller: AuthController;
7+
8+
beforeEach(async () => {
9+
const module: TestingModule = await Test.createTestingModule({
10+
controllers: [AuthController],
11+
providers: [AuthService],
12+
}).compile();
13+
14+
controller = module.get<AuthController>(AuthController);
15+
});
16+
17+
it('should be defined', () => {
18+
expect(controller).toBeDefined();
19+
});
20+
});

src/auth/auth.controller.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Controller, Post, Request, UseGuards } from '@nestjs/common';
2+
import { AuthGuard } from '@nestjs/passport';
3+
import { User } from '../users/entities/user.entity';
4+
import { AuthService } from './auth.service';
5+
6+
@Controller('auth')
7+
export class AuthController {
8+
constructor(private authService: AuthService) {}
9+
@UseGuards(AuthGuard('local'))
10+
@Post('login')
11+
login(@Request() req: { user: User }) {
12+
const user = req.user;
13+
return this.authService.generateJWT(user);
14+
}
15+
}

src/auth/auth.module.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Module } from '@nestjs/common';
2+
import { ConfigType } from '@nestjs/config';
3+
import { JwtModule } from '@nestjs/jwt';
4+
import { PassportModule } from '@nestjs/passport';
5+
import config from '../config';
6+
import { UsersModule } from '../users/users.module';
7+
import { AuthController } from './auth.controller';
8+
import { AuthService } from './auth.service';
9+
10+
@Module({
11+
imports: [
12+
UsersModule,
13+
PassportModule,
14+
JwtModule.registerAsync({
15+
inject: [config.KEY],
16+
useFactory: (configService: ConfigType<typeof config>) => {
17+
return {
18+
secret: configService.jwtSecret,
19+
signOptions: {
20+
expiresIn: '10d',
21+
},
22+
};
23+
},
24+
}),
25+
],
26+
controllers: [AuthController],
27+
providers: [AuthService],
28+
})
29+
export class AuthModule {}

src/auth/auth.service.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { AuthService } from './auth.service';
3+
4+
describe('AuthService', () => {
5+
let service: AuthService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [AuthService],
10+
}).compile();
11+
12+
service = module.get<AuthService>(AuthService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});

src/auth/auth.service.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { JwtService } from '@nestjs/jwt';
3+
import * as bcrypt from 'bcrypt';
4+
import { User } from 'src/users/entities/user.entity';
5+
import { UsersService } from 'src/users/users.service';
6+
import { PayloadToken } from './models/token.model';
7+
8+
@Injectable()
9+
export class AuthService {
10+
constructor(
11+
private usersService: UsersService,
12+
private jwtService: JwtService,
13+
) {}
14+
15+
async validateUser(email: string, password: string) {
16+
const user: {
17+
id: number;
18+
email: string;
19+
password: string;
20+
} = await this.usersService.findByEmailAndGetPassword(email);
21+
if (user) {
22+
const isMatch = await bcrypt.compare(password, user.password);
23+
if (isMatch) {
24+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
25+
const { password, ...rta } = user;
26+
return rta;
27+
}
28+
}
29+
return null;
30+
}
31+
32+
generateJWT(user: User) {
33+
const payload: PayloadToken = { role: user.role, id: user.id };
34+
return {
35+
access_token: this.jwtService.sign(payload),
36+
user,
37+
};
38+
}
39+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { SetMetadata } from '@nestjs/common';
2+
3+
export const IS_PUBLIC_KEY = 'isPublic';
4+
5+
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { SetMetadata } from '@nestjs/common';
2+
import { Role } from '../models/roles.model';
3+
4+
export const ROLES_KEY = 'roles';
5+
6+
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

0 commit comments

Comments
 (0)