Skip to content

Commit 4af9b7a

Browse files
committed
feat: add req body validation & swagger docs to sessions routes
1 parent 0e388ed commit 4af9b7a

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsNotEmpty, IsString } from 'class-validator';
3+
4+
export class LoginSessionDTO {
5+
@ApiProperty({ type: 'string', example: 'John' })
6+
@IsNotEmpty()
7+
@IsString()
8+
readonly login = '';
9+
10+
@ApiProperty({ type: 'string', example: 'john123' })
11+
@IsNotEmpty()
12+
@IsString()
13+
readonly password = '';
14+
}

src/sessions/sessions.controller.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ import {
1010
Request,
1111
UseGuards,
1212
} from '@nestjs/common';
13-
import { ApiTags } from '@nestjs/swagger';
13+
import {
14+
ApiBadRequestResponse,
15+
ApiBearerAuth,
16+
ApiInternalServerErrorResponse,
17+
ApiOkResponse,
18+
ApiTags,
19+
ApiUnauthorizedResponse,
20+
} from '@nestjs/swagger';
1421

1522
import { UserGuard } from '@/guards/user.guard';
1623
import { ServerResponse } from '../utils';
1724
import { SessionsService } from './sessions.service';
25+
import { LoginSessionDTO } from './dtos/LoginSessionDTO';
1826

1927
@ApiTags('Sessões')
2028
@Controller('sessions')
@@ -23,14 +31,17 @@ export class SessionsController {
2331

2432
constructor(private readonly sessionService: SessionsService) {}
2533

34+
@ApiBadRequestResponse()
35+
@ApiInternalServerErrorResponse()
36+
@ApiOkResponse()
2637
@Post('')
2738
async login(
28-
@Body() body,
39+
@Body() body: LoginSessionDTO,
2940
@Headers('x-real-ip') ip: string,
3041
@Headers('user-agent') userAgent: string,
3142
) {
3243
try {
33-
const data = await this.sessionService.login({ ...body, ip, userAgent });
44+
const data = await this.sessionService.login(body, ip, userAgent);
3445
return new ServerResponse(200, 'Successfully logged in', data);
3546
} catch (err: any) {
3647
this.logger.error(`Failed to login ${err}`);
@@ -41,6 +52,10 @@ export class SessionsController {
4152
}
4253
}
4354

55+
@ApiBearerAuth()
56+
@ApiUnauthorizedResponse()
57+
@ApiInternalServerErrorResponse()
58+
@ApiOkResponse()
4459
@Get('')
4560
@UseGuards(UserGuard)
4661
async show(@Request() req) {
@@ -54,6 +69,10 @@ export class SessionsController {
5469
}
5570
}
5671

72+
@ApiBearerAuth()
73+
@ApiUnauthorizedResponse()
74+
@ApiInternalServerErrorResponse()
75+
@ApiOkResponse()
5776
@Delete('')
5877
@UseGuards(UserGuard)
5978
async delete(@Request() req) {

src/sessions/sessions.service.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as bcrypt from 'bcrypt';
44

55
import { PrismaService } from '../prisma/prisma.service';
66
import { LoginSchema, TokenPayload } from './types';
7+
import { LoginSessionDTO } from './dtos/LoginSessionDTO';
78

89
@Injectable()
910
export class SessionsService {
@@ -12,8 +13,16 @@ export class SessionsService {
1213
private readonly jwtService: JwtService,
1314
) {}
1415

15-
async login(body: any) {
16-
const { login, password, ip, userAgent } = LoginSchema.parse(body);
16+
async login(
17+
body: LoginSessionDTO,
18+
ipHeaders: string,
19+
userAgentHeaders: string,
20+
) {
21+
const { login, password, ip, userAgent } = LoginSchema.parse({
22+
...body,
23+
ipHeaders,
24+
userAgentHeaders,
25+
});
1726
const user = await this.prismaService.user.findUnique({
1827
where: { login },
1928
});

0 commit comments

Comments
 (0)