From a6d24cee9d2976234718c6bf2affd056a7dce886 Mon Sep 17 00:00:00 2001 From: M1000fr Date: Mon, 2 Dec 2024 16:55:44 +0100 Subject: [PATCH] ref: format with prettier --- package.json | 2 +- src/config/env.ts | 34 ++--- src/main.ts | 2 +- src/modules/auth/auth.controller.ts | 23 +-- src/modules/auth/auth.service.ts | 20 +-- .../auth/decorators/roles.decorator.ts | 8 +- src/modules/auth/dto/refresh.dto.ts | 8 - src/modules/auth/guards/discord.guard.ts | 26 ++-- src/modules/auth/guards/jwt.guard.ts | 10 +- src/modules/auth/guards/refresh.guard.ts | 10 +- src/modules/auth/guards/role.guard.ts | 75 +++++----- src/modules/auth/strategy/discord.strategy.ts | 80 +++++----- src/modules/auth/strategy/jwt.strategy.ts | 60 ++++---- src/modules/auth/strategy/refresh.strategy.ts | 60 ++++---- src/modules/prisma/prisma.service.ts | 18 +-- src/modules/user/dto/bulk-delete-user.dto.ts | 18 +-- src/modules/user/dto/create-user.dto.ts | 16 +- src/modules/user/dto/update-user.dto.ts | 24 +-- src/modules/user/user.entity.ts | 44 +++--- src/modules/user/user.module.ts | 2 +- src/modules/user/user.service.ts | 138 +++++++++--------- src/validations/env.validation.ts | 34 ++--- 22 files changed, 345 insertions(+), 367 deletions(-) delete mode 100644 src/modules/auth/dto/refresh.dto.ts diff --git a/package.json b/package.json index da1d85d..b8fc166 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "Apache-2.0", "scripts": { "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write \"src/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", diff --git a/src/config/env.ts b/src/config/env.ts index f1e031f..cdac288 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -1,17 +1,17 @@ -export default () => ({ - JWT: { - secret: process.env.JWT_SECRET, - expiresIn: process.env.JWT_EXPIRES_IN, - refresh: { - secret: process.env.REFRESH_JWT_SECRET, - expiresIn: process.env.REFRESH_JWT_EXPIRES_IN, - }, - }, - oauth2: { - discord: { - clientId: process.env.DISCORD_CLIENT_ID, - clientSecret: process.env.DISCORD_CLIENT_SECRET, - callbackUrl: process.env.DISCORD_CALLBACK_URL, - }, - }, -}); +export default () => ({ + JWT: { + secret: process.env.JWT_SECRET, + expiresIn: process.env.JWT_EXPIRES_IN, + refresh: { + secret: process.env.REFRESH_JWT_SECRET, + expiresIn: process.env.REFRESH_JWT_EXPIRES_IN, + }, + }, + oauth2: { + discord: { + clientId: process.env.DISCORD_CLIENT_ID, + clientSecret: process.env.DISCORD_CLIENT_SECRET, + callbackUrl: process.env.DISCORD_CALLBACK_URL, + }, + }, +}); diff --git a/src/main.ts b/src/main.ts index fd98f36..bd54b92 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,7 +27,7 @@ async function bootstrap() { swaggerOptions: { tryItOutEnabled: true, persistAuthorization: true, - } + }, }); await app.listen(process.env.PORT ?? 3000, "0.0.0.0"); diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 93ed826..76f9b16 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,22 +1,12 @@ -import { - Body, - Controller, - Get, - Post, - Req, - Res, - UseGuards, -} from "@nestjs/common"; +import { Controller, Get, Req, Res, UseGuards } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; -import { ApiBearerAuth, ApiBody, ApiOkResponse } from "@nestjs/swagger"; +import { ApiBearerAuth, ApiOkResponse } from "@nestjs/swagger"; import { URLSearchParams } from "node:url"; -import { ResfreshDTO } from "./dto/refresh.dto"; - +import { AuthService } from "./auth.service"; import { DiscordAuthGuard } from "./guards/discord.guard"; import { RefreshJwtAuthGuard } from "./guards/refresh.guard"; -import { AuthService } from "./auth.service"; @Controller("auth") export class AuthController { @@ -70,10 +60,9 @@ export class AuthController { @Get("refresh") @UseGuards(RefreshJwtAuthGuard) @ApiBearerAuth() - @ApiBody({ - type: ResfreshDTO, - }) refresh(@Req() req) { - return this.authService.accessToken(req.user); + return { + accessToken: this.authService.accessToken(req.user), + }; } } diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index a14406a..e0ab887 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -10,24 +10,24 @@ export class AuthService { ) {} accessToken(user: { id: string }) { - const payload = { id: user.id }; - return { - accessToken: this.jwtService.sign(payload, { + return this.jwtService.sign( + { id: user.id }, + { secret: this.configService.get("JWT.secret"), expiresIn: this.configService.get("JWT.expiresIn"), - }), - }; + }, + ); } refreshToken(user: { id: string }) { - const payload = { id: user.id }; - return { - refreshToken: this.jwtService.sign(payload, { + return this.jwtService.sign( + { id: user.id }, + { secret: this.configService.get("JWT.refresh.secret"), expiresIn: this.configService.get( "JWT.refresh.expiresIn", ), - }), - }; + }, + ); } } diff --git a/src/modules/auth/decorators/roles.decorator.ts b/src/modules/auth/decorators/roles.decorator.ts index cc689b2..5f17e66 100644 --- a/src/modules/auth/decorators/roles.decorator.ts +++ b/src/modules/auth/decorators/roles.decorator.ts @@ -1,4 +1,4 @@ -import { SetMetadata } from "@nestjs/common"; -import { $Enums } from "@prisma/client"; - -export const Role = (role: $Enums.Role) => SetMetadata("role", role); +import { SetMetadata } from "@nestjs/common"; +import { $Enums } from "@prisma/client"; + +export const Role = (role: $Enums.Role) => SetMetadata("role", role); diff --git a/src/modules/auth/dto/refresh.dto.ts b/src/modules/auth/dto/refresh.dto.ts deleted file mode 100644 index ba2848e..0000000 --- a/src/modules/auth/dto/refresh.dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ApiProperty } from "@nestjs/swagger"; -import { IsJWT } from "class-validator"; - -export class ResfreshDTO { - @ApiProperty() - @IsJWT() - refreshToken: string; -} diff --git a/src/modules/auth/guards/discord.guard.ts b/src/modules/auth/guards/discord.guard.ts index 248dd73..f50ecb3 100644 --- a/src/modules/auth/guards/discord.guard.ts +++ b/src/modules/auth/guards/discord.guard.ts @@ -1,13 +1,13 @@ -import { Injectable, UnauthorizedException } from "@nestjs/common"; -import { AuthGuard } from "@nestjs/passport"; - -@Injectable() -export class DiscordAuthGuard extends AuthGuard("discord") { - handleRequest(err, user, info, context) { - if (err || !user) { - const errorMessage = info?.message || "Authentication failed"; - throw new UnauthorizedException(errorMessage); - } - return user; - } -} +import { Injectable, UnauthorizedException } from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; + +@Injectable() +export class DiscordAuthGuard extends AuthGuard("discord") { + handleRequest(err, user, info, context) { + if (err || !user) { + const errorMessage = info?.message || "Authentication failed"; + throw new UnauthorizedException(errorMessage); + } + return user; + } +} diff --git a/src/modules/auth/guards/jwt.guard.ts b/src/modules/auth/guards/jwt.guard.ts index 673da98..2e81dba 100644 --- a/src/modules/auth/guards/jwt.guard.ts +++ b/src/modules/auth/guards/jwt.guard.ts @@ -1,5 +1,5 @@ -import { Injectable } from "@nestjs/common"; -import { AuthGuard } from "@nestjs/passport"; - -@Injectable() -export class JwtAuthGuard extends AuthGuard("jwt") {} +import { Injectable } from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; + +@Injectable() +export class JwtAuthGuard extends AuthGuard("jwt") {} diff --git a/src/modules/auth/guards/refresh.guard.ts b/src/modules/auth/guards/refresh.guard.ts index babd545..d31dbc9 100644 --- a/src/modules/auth/guards/refresh.guard.ts +++ b/src/modules/auth/guards/refresh.guard.ts @@ -1,5 +1,5 @@ -import { Injectable } from "@nestjs/common"; -import { AuthGuard } from "@nestjs/passport"; - -@Injectable() -export class RefreshJwtAuthGuard extends AuthGuard("refresh") {} +import { Injectable } from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; + +@Injectable() +export class RefreshJwtAuthGuard extends AuthGuard("refresh") {} diff --git a/src/modules/auth/guards/role.guard.ts b/src/modules/auth/guards/role.guard.ts index 68c3c4b..ab25dc9 100644 --- a/src/modules/auth/guards/role.guard.ts +++ b/src/modules/auth/guards/role.guard.ts @@ -1,39 +1,36 @@ -import { - Injectable, - CanActivate, - ExecutionContext, - ForbiddenException, - UnauthorizedException, -} from "@nestjs/common"; -import { Reflector } from "@nestjs/core"; - -@Injectable() -export class RolesGuard implements CanActivate { - constructor(private readonly reflector: Reflector) {} - - canActivate(context: ExecutionContext): boolean { - const role = this.reflector.get( - "role", - context.getHandler(), - ); - if (!role) { - return true; - } - - const request = context.switchToHttp().getRequest(); - const user = request.user; - - if (!user) { - throw new ForbiddenException("User not authenticated"); - } - - const hasRole = role === user.role; - if (!hasRole) { - throw new UnauthorizedException( - `You need to have the role ${role} to access this resource`, - ); - } - - return true; - } -} +import { + Injectable, + CanActivate, + ExecutionContext, + ForbiddenException, + UnauthorizedException, +} from "@nestjs/common"; +import { Reflector } from "@nestjs/core"; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private readonly reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const role = this.reflector.get("role", context.getHandler()); + if (!role) { + return true; + } + + const request = context.switchToHttp().getRequest(); + const user = request.user; + + if (!user) { + throw new ForbiddenException("User not authenticated"); + } + + const hasRole = role === user.role; + if (!hasRole) { + throw new UnauthorizedException( + `You need to have the role ${role} to access this resource`, + ); + } + + return true; + } +} diff --git a/src/modules/auth/strategy/discord.strategy.ts b/src/modules/auth/strategy/discord.strategy.ts index d61ff8b..c3c0503 100644 --- a/src/modules/auth/strategy/discord.strategy.ts +++ b/src/modules/auth/strategy/discord.strategy.ts @@ -1,40 +1,40 @@ -import { Injectable } from "@nestjs/common"; -import { ConfigService } from "@nestjs/config"; -import { PassportStrategy } from "@nestjs/passport"; -import { Profile, Strategy } from "passport-discord"; -import { AuthService } from "../auth.service"; - -@Injectable() -export class DiscordStrategy extends PassportStrategy(Strategy, "discord") { - configService: ConfigService; - - constructor( - private readonly authService: AuthService, - configService: ConfigService, - ) { - super({ - clientID: configService.get("oauth2.discord.clientId"), - clientSecret: configService.get( - "oauth2.discord.clientSecret", - ), - callbackURL: configService.get( - "oauth2.discord.callbackUrl", - ), - scope: ["identify", "email"], - }); - - this.configService = configService; - } - - async validate( - _accessToken: string, - _refreshToken: string, - profile: Profile, - done: Function, - ) { - const accessToken = this.authService.accessToken({ id: profile.id }); - const refreshToken = this.authService.refreshToken({ id: profile.id }); - - done(null, { accessToken, refreshToken }); - } -} +import { Injectable } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; +import { PassportStrategy } from "@nestjs/passport"; +import { Profile, Strategy } from "passport-discord"; +import { AuthService } from "../auth.service"; + +@Injectable() +export class DiscordStrategy extends PassportStrategy(Strategy, "discord") { + configService: ConfigService; + + constructor( + private readonly authService: AuthService, + configService: ConfigService, + ) { + super({ + clientID: configService.get("oauth2.discord.clientId"), + clientSecret: configService.get( + "oauth2.discord.clientSecret", + ), + callbackURL: configService.get( + "oauth2.discord.callbackUrl", + ), + scope: ["identify", "email"], + }); + + this.configService = configService; + } + + async validate( + _accessToken: string, + _refreshToken: string, + profile: Profile, + done: Function, + ) { + const accessToken = this.authService.accessToken({ id: profile.id }); + const refreshToken = this.authService.refreshToken({ id: profile.id }); + + done(null, { accessToken, refreshToken }); + } +} diff --git a/src/modules/auth/strategy/jwt.strategy.ts b/src/modules/auth/strategy/jwt.strategy.ts index af5e5d1..cc43689 100644 --- a/src/modules/auth/strategy/jwt.strategy.ts +++ b/src/modules/auth/strategy/jwt.strategy.ts @@ -1,30 +1,30 @@ -import { Injectable, UnauthorizedException } from "@nestjs/common"; -import { PassportStrategy } from "@nestjs/passport"; -import { User } from "@prisma/client"; -import { Strategy, ExtractJwt } from "passport-jwt"; -import { UserService } from "@Modules/user/user.service"; -import { ConfigService } from "@nestjs/config"; - -@Injectable() -export class JWTStrategy extends PassportStrategy(Strategy) { - constructor( - private readonly userService: UserService, - configService: ConfigService, - ) { - super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - ignoreExipration: false, - secretOrKey: configService.get("JWT.secret"), - }); - } - - async validate(payload: any): Promise { - const user = await this.userService.findById(payload.id); - - if (!user) { - throw new UnauthorizedException("User not found"); - } - - return user; - } -} +import { Injectable, UnauthorizedException } from "@nestjs/common"; +import { PassportStrategy } from "@nestjs/passport"; +import { User } from "@prisma/client"; +import { Strategy, ExtractJwt } from "passport-jwt"; +import { UserService } from "@Modules/user/user.service"; +import { ConfigService } from "@nestjs/config"; + +@Injectable() +export class JWTStrategy extends PassportStrategy(Strategy) { + constructor( + private readonly userService: UserService, + configService: ConfigService, + ) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExipration: false, + secretOrKey: configService.get("JWT.secret"), + }); + } + + async validate(payload: any): Promise { + const user = await this.userService.findById(payload.id); + + if (!user) { + throw new UnauthorizedException("User not found"); + } + + return user; + } +} diff --git a/src/modules/auth/strategy/refresh.strategy.ts b/src/modules/auth/strategy/refresh.strategy.ts index 5c7258d..6ed3fbd 100644 --- a/src/modules/auth/strategy/refresh.strategy.ts +++ b/src/modules/auth/strategy/refresh.strategy.ts @@ -1,30 +1,30 @@ -import { Injectable, UnauthorizedException } from "@nestjs/common"; -import { PassportStrategy } from "@nestjs/passport"; -import { User } from "@prisma/client"; -import { Strategy, ExtractJwt } from "passport-jwt"; -import { UserService } from "@Modules/user/user.service"; -import { ConfigService } from "@nestjs/config"; - -@Injectable() -export class RefreshJWTStrategy extends PassportStrategy(Strategy, "refresh") { - constructor( - private readonly userService: UserService, - configService: ConfigService, - ) { - super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - ignoreExipration: false, - secretOrKey: configService.get("JWT.refresh.secret"), - }); - } - - async validate(payload: any): Promise { - const user = await this.userService.findById(payload.id); - - if (!user) { - throw new UnauthorizedException("User not found"); - } - - return user; - } -} +import { Injectable, UnauthorizedException } from "@nestjs/common"; +import { PassportStrategy } from "@nestjs/passport"; +import { User } from "@prisma/client"; +import { Strategy, ExtractJwt } from "passport-jwt"; +import { UserService } from "@Modules/user/user.service"; +import { ConfigService } from "@nestjs/config"; + +@Injectable() +export class RefreshJWTStrategy extends PassportStrategy(Strategy, "refresh") { + constructor( + private readonly userService: UserService, + configService: ConfigService, + ) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExipration: false, + secretOrKey: configService.get("JWT.refresh.secret"), + }); + } + + async validate(payload: any): Promise { + const user = await this.userService.findById(payload.id); + + if (!user) { + throw new UnauthorizedException("User not found"); + } + + return user; + } +} diff --git a/src/modules/prisma/prisma.service.ts b/src/modules/prisma/prisma.service.ts index a5b09b8..e15d070 100644 --- a/src/modules/prisma/prisma.service.ts +++ b/src/modules/prisma/prisma.service.ts @@ -1,9 +1,9 @@ -import { Injectable, OnModuleInit } from "@nestjs/common"; -import { PrismaClient } from "@prisma/client"; - -@Injectable() -export class PrismaService extends PrismaClient implements OnModuleInit { - async onModuleInit() { - await this.$connect(); - } -} +import { Injectable, OnModuleInit } from "@nestjs/common"; +import { PrismaClient } from "@prisma/client"; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit { + async onModuleInit() { + await this.$connect(); + } +} diff --git a/src/modules/user/dto/bulk-delete-user.dto.ts b/src/modules/user/dto/bulk-delete-user.dto.ts index c2ca738..4c57c2f 100644 --- a/src/modules/user/dto/bulk-delete-user.dto.ts +++ b/src/modules/user/dto/bulk-delete-user.dto.ts @@ -1,9 +1,9 @@ -import { ArrayMaxSize, ArrayMinSize, IsArray, IsString } from "class-validator"; - -export class BulkDeleteUserDTO { - @IsArray() - @IsString({ each: true }) - @ArrayMinSize(1) - @ArrayMaxSize(10) - ids: string[]; -} +import { ArrayMaxSize, ArrayMinSize, IsArray, IsString } from "class-validator"; + +export class BulkDeleteUserDTO { + @IsArray() + @IsString({ each: true }) + @ArrayMinSize(1) + @ArrayMaxSize(10) + ids: string[]; +} diff --git a/src/modules/user/dto/create-user.dto.ts b/src/modules/user/dto/create-user.dto.ts index e21cbd1..d667abd 100644 --- a/src/modules/user/dto/create-user.dto.ts +++ b/src/modules/user/dto/create-user.dto.ts @@ -1,8 +1,8 @@ -import { ApiProperty } from "@nestjs/swagger"; -import { IsString } from "class-validator"; - -export class CreateUserDTO { - @IsString() - @ApiProperty() - username: string; -} +import { ApiProperty } from "@nestjs/swagger"; +import { IsString } from "class-validator"; + +export class CreateUserDTO { + @IsString() + @ApiProperty() + username: string; +} diff --git a/src/modules/user/dto/update-user.dto.ts b/src/modules/user/dto/update-user.dto.ts index 91f6a9b..0829883 100644 --- a/src/modules/user/dto/update-user.dto.ts +++ b/src/modules/user/dto/update-user.dto.ts @@ -1,12 +1,12 @@ -import { PartialType } from "@nestjs/mapped-types"; -import { IsString } from "class-validator"; - -import { CreateUserDTO } from "./create-user.dto"; - -export class UpdateUserDTO extends PartialType(CreateUserDTO) { - @IsString() - id: string; - - @IsString() - username: string; -} +import { PartialType } from "@nestjs/mapped-types"; +import { IsString } from "class-validator"; + +import { CreateUserDTO } from "./create-user.dto"; + +export class UpdateUserDTO extends PartialType(CreateUserDTO) { + @IsString() + id: string; + + @IsString() + username: string; +} diff --git a/src/modules/user/user.entity.ts b/src/modules/user/user.entity.ts index 7068146..b3d2e76 100644 --- a/src/modules/user/user.entity.ts +++ b/src/modules/user/user.entity.ts @@ -1,22 +1,22 @@ -import { ApiProperty, ApiSchema } from "@nestjs/swagger"; -import { $Enums } from "@prisma/client"; -import { Expose } from "class-transformer"; - -@ApiSchema({ name: "User" }) -export class UserEntity { - @Expose() - @ApiProperty() - id: string; - - @Expose() - @ApiProperty() - username: string; - - @Expose() - @ApiProperty() - role: $Enums.Role - - constructor(partial: Partial) { - Object.assign(this, partial); - } -} +import { ApiProperty, ApiSchema } from "@nestjs/swagger"; +import { $Enums } from "@prisma/client"; +import { Expose } from "class-transformer"; + +@ApiSchema({ name: "User" }) +export class UserEntity { + @Expose() + @ApiProperty() + id: string; + + @Expose() + @ApiProperty() + username: string; + + @Expose() + @ApiProperty() + role: $Enums.Role; + + constructor(partial: Partial) { + Object.assign(this, partial); + } +} diff --git a/src/modules/user/user.module.ts b/src/modules/user/user.module.ts index 7e255d9..d2ec810 100644 --- a/src/modules/user/user.module.ts +++ b/src/modules/user/user.module.ts @@ -3,7 +3,7 @@ import { Module } from "@nestjs/common"; import { UserService } from "./user.service"; import { PrismaService } from "@Modules/prisma/prisma.service"; -import { UserController } from './user.controller'; +import { UserController } from "./user.controller"; @Module({ providers: [UserService, PrismaService], diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index f50cb95..7df171e 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,69 +1,69 @@ -import { Injectable, NotFoundException } from "@nestjs/common"; -import { PrismaService } from "@Modules/prisma/prisma.service"; - -import { CreateUserDTO } from "./dto/create-user.dto"; -import { UpdateUserDTO } from "./dto/update-user.dto"; -import { Prisma } from "@prisma/client"; - -@Injectable() -export class UserService { - constructor(private readonly prisma: PrismaService) {} - - async findAll({ - include, - cursor, - take, - }: { - include?: Prisma.UserInclude; - cursor?: string; - take?: number; - } = {}) { - return await this.prisma.user.findMany({ - include, - cursor: cursor ? { id: cursor } : undefined, - take: take || 10, - }); - } - - async findById(id: string) { - return await this.prisma.user.findUnique({ - where: { id }, - }); - } - - async create(createUserInput: CreateUserDTO) { - return await this.prisma.user.create({ - data: { - username: createUserInput.username, - }, - }); - } - - async update(updateUserInput: UpdateUserDTO) { - return await this.prisma.user.update({ - where: { id: updateUserInput.id }, - data: { - username: updateUserInput.username, - }, - }); - } - - async delete(id: string) { - const exist = await this.prisma.user.findUnique({ where: { id } }); - if (!exist) throw new NotFoundException("User not found"); - - return await this.prisma.user.delete({ - where: { id }, - }); - } - - async bulkDelete(ids: string[]) { - return await this.prisma.user.deleteMany({ - where: { - id: { - in: ids, - }, - }, - }); - } -} +import { Injectable, NotFoundException } from "@nestjs/common"; +import { PrismaService } from "@Modules/prisma/prisma.service"; + +import { CreateUserDTO } from "./dto/create-user.dto"; +import { UpdateUserDTO } from "./dto/update-user.dto"; +import { Prisma } from "@prisma/client"; + +@Injectable() +export class UserService { + constructor(private readonly prisma: PrismaService) {} + + async findAll({ + include, + cursor, + take, + }: { + include?: Prisma.UserInclude; + cursor?: string; + take?: number; + } = {}) { + return await this.prisma.user.findMany({ + include, + cursor: cursor ? { id: cursor } : undefined, + take: take || 10, + }); + } + + async findById(id: string) { + return await this.prisma.user.findUnique({ + where: { id }, + }); + } + + async create(createUserInput: CreateUserDTO) { + return await this.prisma.user.create({ + data: { + username: createUserInput.username, + }, + }); + } + + async update(updateUserInput: UpdateUserDTO) { + return await this.prisma.user.update({ + where: { id: updateUserInput.id }, + data: { + username: updateUserInput.username, + }, + }); + } + + async delete(id: string) { + const exist = await this.prisma.user.findUnique({ where: { id } }); + if (!exist) throw new NotFoundException("User not found"); + + return await this.prisma.user.delete({ + where: { id }, + }); + } + + async bulkDelete(ids: string[]) { + return await this.prisma.user.deleteMany({ + where: { + id: { + in: ids, + }, + }, + }); + } +} diff --git a/src/validations/env.validation.ts b/src/validations/env.validation.ts index 9d6c8fd..4f7594b 100644 --- a/src/validations/env.validation.ts +++ b/src/validations/env.validation.ts @@ -1,17 +1,17 @@ -import * as Joi from 'joi'; - -export const envValidation = Joi.object({ - DATABASE_URL: Joi.string().required(), - - JWT_SECRET: Joi.string().required(), - JWT_EXPIRES_IN: Joi.string().required(), - - REFRESH_JWT_SECRET: Joi.string().required(), - REFRESH_JWT_EXPIRES_IN: Joi.string().required(), - - DISCORD_CLIENT_ID: Joi.string().required(), - DISCORD_CLIENT_SECRET: Joi.string().required(), - DISCORD_CALLBACK_URL: Joi.string().required(), - - PORT: Joi.number().optional(), -}); \ No newline at end of file +import * as Joi from "joi"; + +export const envValidation = Joi.object({ + DATABASE_URL: Joi.string().required(), + + JWT_SECRET: Joi.string().required(), + JWT_EXPIRES_IN: Joi.string().required(), + + REFRESH_JWT_SECRET: Joi.string().required(), + REFRESH_JWT_EXPIRES_IN: Joi.string().required(), + + DISCORD_CLIENT_ID: Joi.string().required(), + DISCORD_CLIENT_SECRET: Joi.string().required(), + DISCORD_CALLBACK_URL: Joi.string().required(), + + PORT: Joi.number().optional(), +});