diff --git a/src/languages/infrastructure/nestjs/controllers.ts b/src/languages/infrastructure/nestjs/controllers.ts index cb791b2b..998b76bf 100644 --- a/src/languages/infrastructure/nestjs/controllers.ts +++ b/src/languages/infrastructure/nestjs/controllers.ts @@ -6,9 +6,11 @@ import ExpressionPostController from '../ui/api/v1/controllers/expressions/expre import CountriesGetController from '../ui/api/v1/controllers/countries/countriesGetController'; import CountryGetController from '../ui/api/v1/controllers/countries/countryGetController'; import CountryPostController from '../ui/api/v1/controllers/countries/countryPostController'; +import RefreshTokenPostController from '../ui/api/v1/controllers/auth/refreshTokenPostController'; export const controllers = [ LoginPostController, + RefreshTokenPostController, MeGetController, SearchTermsGetController, WordPostController, diff --git a/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostController.ts b/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostController.ts index c0bd5300..c2b42f14 100644 --- a/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostController.ts +++ b/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostController.ts @@ -25,10 +25,12 @@ export default class LoginPostController { const user = { id: id, name: payload.name, email: payload.email }; const token: string = this.jwtService.sign(user); + const refreshToken: string = this.jwtService.sign(user, { expiresIn: '30d' }); return { user, token, + refreshToken, }; } } diff --git a/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostResponseDto.ts b/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostResponseDto.ts index 8adefceb..40bbfb49 100644 --- a/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostResponseDto.ts +++ b/src/languages/infrastructure/ui/api/v1/controllers/auth/loginPostResponseDto.ts @@ -27,4 +27,9 @@ export default class LoginPostResponseDto { @IsNotEmpty() @IsString() token: string; + + @ApiProperty() + @IsNotEmpty() + @IsString() + refreshToken: string; } diff --git a/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostController.ts b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostController.ts new file mode 100644 index 00000000..67616706 --- /dev/null +++ b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostController.ts @@ -0,0 +1,33 @@ +import { Body, Controller, HttpCode, Inject, Post } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import LoginPostResponseDto from './loginPostResponseDto'; +import { ApiBadRequestResponse, ApiInternalServerErrorResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger'; +import RefreshTokenPostDto from './refreshTokenPostDto'; +import RefreshTokenPostResponseDto from './refreshTokenPostResponseDto'; +import { QUERY_BUS, QueryBus } from '@src/shared/domain/buses/queryBus/queryBus'; +import FindUserQuery from '@src/languages/application/user/query/find/findUserQuery'; + +@ApiTags('Auth') +@Controller() +export default class RefreshTokenPostController { + public constructor(@Inject(QUERY_BUS) private queryBus: QueryBus, private jwtService: JwtService) {} + + @Post('auth/refresh-token') + @HttpCode(200) + @ApiOkResponse({ type: LoginPostResponseDto }) + @ApiBadRequestResponse({ description: 'Bad Request.' }) + @ApiInternalServerErrorResponse({ description: 'Internal Server Error.' }) + async run(@Body() payload: RefreshTokenPostDto): Promise { + const decodedRefreshToken = this.jwtService.verify(payload.refreshToken); + if (decodedRefreshToken.revoked) { + throw new Error('Token revoked'); + } + + const user = await this.queryBus.ask(new FindUserQuery(decodedRefreshToken.id)); + const refreshToken = this.jwtService.sign(user.content); + + return { + refreshToken, + }; + } +} diff --git a/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostDto.ts b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostDto.ts new file mode 100644 index 00000000..9656a23c --- /dev/null +++ b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostDto.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export default class RefreshTokenPostDto { + @ApiProperty() + @IsNotEmpty() + @IsString() + refreshToken: string; +} diff --git a/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostResponseDto.ts b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostResponseDto.ts new file mode 100644 index 00000000..66498250 --- /dev/null +++ b/src/languages/infrastructure/ui/api/v1/controllers/auth/refreshTokenPostResponseDto.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export default class RefreshTokenPostResponseDto { + @ApiProperty() + @IsNotEmpty() + @IsString() + refreshToken: string; +}