import {Controller, Req, Post, Options, Header, HttpCode} from '@nestjs/common'; import {ApiResponse, ApiTags, ApiBody} from '@nestjs/swagger'; import { ALLOW_ORIGIN_ALL, ALLOW_METHOD, ALLOW_CREDENTIALS, CONTENT_LENGTH, ALLOW_HEADERS, AUTH_CONTROLLER, } from '../consts'; import { UserService } from '../users/users.service'; import { AuthRequest, TokenResponse, RefreshAuthRequest, CheckAuthTokenRequest, } from '../users/users.schema'; import { Request } from 'express'; import { AUTH_SUCCESS, AUTH_BAD_REQUEST, REFRESH_AUTH_SUCCESS, REFRESH_AUTH_BAD_REQUEST, CHECK_AUTH_TOKEN, } from './auth.responses'; @Controller(AUTH_CONTROLLER) @ApiTags(AUTH_CONTROLLER) export class AuthController { constructor( private readonly userService: UserService ) {} @Post() @Header(...ALLOW_ORIGIN_ALL) @ApiResponse(AUTH_SUCCESS) @ApiResponse(AUTH_BAD_REQUEST) @ApiBody({ type: AuthRequest, description: 'Объект с логином и паролем пользователя для авторизации' }) async authUser(@Req() request: Request): Promise { const host = request.headers.host; const agent = request.headers['user-agent']; return await this.userService.authUser(request.body.login, request.body.password, host, agent); } @Post('refresh') @Header(...ALLOW_ORIGIN_ALL) @ApiResponse(REFRESH_AUTH_SUCCESS) @ApiResponse(REFRESH_AUTH_BAD_REQUEST) @ApiBody({ type: RefreshAuthRequest, description: 'Токен для сброса токенов' }) async refreshAuth(@Req() request: Request): Promise { const host = request.headers.host; const agent = request.headers['user-agent']; const refresh_token = request.body.refresh_token; return await this.userService.refreshAuth(refresh_token, host, agent); } @Post('check') @ApiResponse(CHECK_AUTH_TOKEN) @ApiBody({ type: CheckAuthTokenRequest, description: 'Токен для проверки', }) async checkAccessToken(@Req() request: Request): Promise { const {access_token, host, agent} = request.body; return this.userService.checkAccessToken(access_token, host, agent); } @Options([ '', 'refresh', 'check' ]) @Header(...ALLOW_ORIGIN_ALL) @Header(...ALLOW_METHOD) @Header(...ALLOW_CREDENTIALS) @Header(...CONTENT_LENGTH) @Header(...ALLOW_HEADERS) @HttpCode(204) async optionsAuth(): Promise { return ''; } }