135 lines
3.7 KiB
TypeScript
135 lines
3.7 KiB
TypeScript
/* eslint-disable @typescript-eslint/explicit-member-accessibility */
|
|
/* eslint-disable class-methods-use-this */
|
|
/* eslint-disable import/no-extraneous-dependencies */
|
|
import { AccountService } from './account.service';
|
|
import { CreateAccountDto } from './dto/create-account.dto';
|
|
import { ResetPasswordDto } from './dto/reset-password.dto';
|
|
import {
|
|
Body,
|
|
Controller,
|
|
Delete,
|
|
Get,
|
|
HttpException,
|
|
HttpStatus,
|
|
Patch,
|
|
Post,
|
|
Query,
|
|
Req,
|
|
Res,
|
|
UnauthorizedException,
|
|
} from '@nestjs/common';
|
|
import { ApiResponse, ApiTags } from '@nestjs/swagger';
|
|
import { FastifyReply, FastifyRequest } from 'fastify';
|
|
import { cookieOptions } from 'src/config/cookie';
|
|
import { env } from 'src/config/env';
|
|
import { Credentials } from 'src/dto/credentials';
|
|
import { Account } from 'src/schemas/account.schema';
|
|
|
|
@Controller('account')
|
|
@ApiTags('account')
|
|
export class AccountController {
|
|
constructor(private readonly accountService: AccountService) {}
|
|
|
|
private clearCookies(req, reply) {
|
|
if (req.cookies) {
|
|
Object.keys(req.cookies).forEach((cookieName) => {
|
|
reply.clearCookie(cookieName, {
|
|
path: '/',
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
@Post('/create')
|
|
@ApiResponse({
|
|
status: HttpStatus.CREATED,
|
|
type: Account,
|
|
})
|
|
async create(@Body() createAccountDto: CreateAccountDto, @Res() reply: FastifyReply) {
|
|
try {
|
|
const createdAccount = await this.accountService.create(createAccountDto);
|
|
|
|
return reply.status(HttpStatus.CREATED).send(createdAccount);
|
|
} catch (error) {
|
|
throw new HttpException(error, HttpStatus.BAD_REQUEST);
|
|
}
|
|
}
|
|
|
|
@Get()
|
|
async findAll() {
|
|
return this.accountService.findAll();
|
|
}
|
|
|
|
@Delete('/delete')
|
|
@ApiResponse({
|
|
status: HttpStatus.OK,
|
|
type: Account,
|
|
})
|
|
// @ApiQuery({ name: 'username', type: CreateAccountDto['username'] })
|
|
async delete(@Query('username') username: string) {
|
|
return this.accountService.delete(username);
|
|
}
|
|
|
|
@Patch('/update')
|
|
@ApiResponse({
|
|
status: HttpStatus.OK,
|
|
type: Account,
|
|
})
|
|
async update(@Body() createAccountDto: CreateAccountDto, @Res() reply: FastifyReply) {
|
|
try {
|
|
const updatedAccount = await this.accountService.update(createAccountDto);
|
|
|
|
return reply.status(HttpStatus.OK).send(updatedAccount);
|
|
} catch (error) {
|
|
throw new HttpException(error, HttpStatus.BAD_REQUEST);
|
|
}
|
|
}
|
|
|
|
@Post('/reset-password')
|
|
@ApiResponse({
|
|
status: HttpStatus.OK,
|
|
type: Account,
|
|
})
|
|
async resetPassword(@Body() resetPasswordDto: ResetPasswordDto, @Res() reply: FastifyReply) {
|
|
try {
|
|
const updatedAccount = await this.accountService.resetPassword(resetPasswordDto);
|
|
|
|
return reply.status(HttpStatus.OK).send(updatedAccount);
|
|
} catch (error) {
|
|
throw new HttpException(error, HttpStatus.BAD_REQUEST);
|
|
}
|
|
}
|
|
|
|
@Post('/login')
|
|
async login(@Body() credentials: Credentials, @Res() reply: FastifyReply) {
|
|
try {
|
|
const token = await this.accountService.login(credentials);
|
|
|
|
return reply
|
|
.setCookie(env.COOKIE_TOKEN_NAME, token, cookieOptions)
|
|
.status(200)
|
|
.send({ token });
|
|
} catch {
|
|
throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED);
|
|
}
|
|
}
|
|
|
|
@Get('/logout')
|
|
async logout(@Req() req: FastifyRequest, @Res() reply: FastifyReply) {
|
|
this.clearCookies(req, reply);
|
|
|
|
return reply.status(302).redirect('/login');
|
|
}
|
|
|
|
@Get('/get-user')
|
|
async getUser(@Req() req: FastifyRequest, @Res() reply: FastifyReply) {
|
|
const token = req.cookies[env.COOKIE_TOKEN_NAME];
|
|
if (!token) throw new UnauthorizedException();
|
|
|
|
const account = await this.accountService.getUser(token);
|
|
if (!account) throw new UnauthorizedException('Account not found');
|
|
|
|
return reply.send(account);
|
|
}
|
|
}
|