Normalize quote usage in imports

Standardized the quote style to double quotes across all TypeScript files for consistency. This includes ".ts" and ".dto" files.
This commit is contained in:
Mathis H (Avnyr) 2024-11-12 13:37:29 +01:00
parent 2fdc16e003
commit 8ea217fe9f
Signed by: Mathis
GPG Key ID: DD9E0666A747D126
52 changed files with 1475 additions and 1486 deletions

View File

@ -1,8 +1,8 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from "@nestjs/testing";
import { AppController } from './app.controller'; import { AppController } from "./app.controller";
import { AppService } from './app.service'; import { AppService } from "./app.service";
describe('AppController', () => { describe("AppController", () => {
let appController: AppController; let appController: AppController;
beforeEach(async () => { beforeEach(async () => {
@ -14,9 +14,9 @@ describe('AppController', () => {
appController = app.get<AppController>(AppController); appController = app.get<AppController>(AppController);
}); });
describe('root', () => { describe("root", () => {
it('should return "Hello World!"', () => { it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!'); expect(appController.getHello()).toBe("Hello World!");
}); });
}); });
}); });

View File

@ -1,5 +1,5 @@
import { Controller, Get } from '@nestjs/common'; import { Controller, Get } from "@nestjs/common";
import { AppService } from './app.service'; import { AppService } from "./app.service";
@Controller() @Controller()
export class AppController { export class AppController {
@ -7,6 +7,6 @@ export class AppController {
@Get() @Get()
getHello(): string { getHello(): string {
return 'Hello'; return "Hello";
} }
} }

View File

@ -1,16 +1,16 @@
import { Module } from '@nestjs/common'; import { AppController } from "@/app.controller";
import { AppController } from '@/app.controller'; import { AppService } from "@/app.service";
import { AppService } from '@/app.service'; import { AuthModule } from "@/auth/auth.module";
import { ConfigModule } from '@nestjs/config'; import { CryptoModule } from "@/crypto/crypto.module";
import { AuthModule } from '@/auth/auth.module'; import { OfferModule } from "@/offer/offer.module";
import { PrismaModule } from '@/prisma/prisma.module'; import { PrismaModule } from "@/prisma/prisma.module";
import { RoleModule } from '@/role/role.module'; import { PromoCodeModule } from "@/promoCode/promoCode.module";
import { PromoCodeModule } from '@/promoCode/promoCode.module'; import { RoleModule } from "@/role/role.module";
import { CryptoModule } from '@/crypto/crypto.module'; import { TradeModule } from "@/trade/trade.module";
import { TradeModule } from '@/trade/trade.module'; import { UserModule } from "@/user/user.module";
import { OfferModule } from '@/offer/offer.module'; import { Module } from "@nestjs/common";
import { UserModule } from '@/user/user.module'; import { ConfigModule } from "@nestjs/config";
import { ThrottlerModule } from '@nestjs/throttler'; import { ThrottlerModule } from "@nestjs/throttler";
@Module({ @Module({
imports: [ imports: [

View File

@ -1,8 +1,8 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from "@nestjs/common";
@Injectable() @Injectable()
export class AppService { export class AppService {
getHello(): string { getHello(): string {
return 'Hello World!'; return "Hello World!";
} }
} }

View File

@ -1,20 +1,20 @@
import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common'; import { Body, Controller, HttpCode, HttpStatus, Post } from "@nestjs/common";
import { AuthService } from './auth.service'; import { ApiTags } from "@nestjs/swagger";
import { AuthLoginDto, AuthRegisterDto } from './dto'; import { AuthService } from "./auth.service";
import { ApiTags } from '@nestjs/swagger'; import { AuthLoginDto, AuthRegisterDto } from "./dto";
@ApiTags('auth') @ApiTags("auth")
@Controller('auth') @Controller("auth")
export class AuthController { export class AuthController {
constructor(private authService: AuthService) {} constructor(private authService: AuthService) {}
@Post('sign-up') @Post("sign-up")
signUp(@Body() dto: AuthRegisterDto) { signUp(@Body() dto: AuthRegisterDto) {
return this.authService.signup(dto); return this.authService.signup(dto);
} }
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Post('sign-in') @Post("sign-in")
signIn(@Body() dto: AuthLoginDto) { signIn(@Body() dto: AuthLoginDto) {
return this.authService.signin(dto); return this.authService.signin(dto);
} }

View File

@ -1,8 +1,8 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { JwtModule } from '@nestjs/jwt'; import { JwtModule } from "@nestjs/jwt";
import { AuthController } from './auth.controller'; import { AuthController } from "./auth.controller";
import { AuthService } from './auth.service'; import { AuthService } from "./auth.service";
import { JwtStrategy } from './strategy'; import { JwtStrategy } from "./strategy";
@Module({ @Module({
imports: [JwtModule.register({})], imports: [JwtModule.register({})],

View File

@ -1,10 +1,10 @@
import { ForbiddenException, Injectable } from '@nestjs/common'; import { ForbiddenException, Injectable } from "@nestjs/common";
import { PrismaService } from '../prisma/prisma.service'; import { ConfigService } from "@nestjs/config";
import { AuthLoginDto, AuthRegisterDto } from './dto'; import { JwtService } from "@nestjs/jwt";
import * as argon from 'argon2'; import { Prisma, User } from "@prisma/client";
import { Prisma, User } from '@prisma/client'; import * as argon from "argon2";
import { JwtService } from '@nestjs/jwt'; import { PrismaService } from "../prisma/prisma.service";
import { ConfigService } from '@nestjs/config'; import { AuthLoginDto, AuthRegisterDto } from "./dto";
@Injectable() @Injectable()
export class AuthService { export class AuthService {
@ -19,7 +19,7 @@ export class AuthService {
async signup(dto: AuthRegisterDto) { async signup(dto: AuthRegisterDto) {
const hash = await argon.hash(dto.password); const hash = await argon.hash(dto.password);
const promoCode = await this.getPromoCode(dto.promoCode); const promoCode = await this.getPromoCode(dto.promoCode);
const userRole = await this.getUserRole('user'); const userRole = await this.getUserRole("user");
const balance = this.calculateBalance(promoCode); const balance = this.calculateBalance(promoCode);
try { try {
@ -50,7 +50,12 @@ export class AuthService {
return balance; return balance;
} }
private async createUser(dto: AuthRegisterDto, hash: string, roleId: string, balance: number) { private async createUser(
dto: AuthRegisterDto,
hash: string,
roleId: string,
balance: number,
) {
return this.prisma.user.create({ return this.prisma.user.create({
data: { data: {
firstName: dto.firstName, firstName: dto.firstName,
@ -67,8 +72,8 @@ export class AuthService {
private handleSignupError(error: any) { private handleSignupError(error: any) {
if (error instanceof Prisma.PrismaClientKnownRequestError) { if (error instanceof Prisma.PrismaClientKnownRequestError) {
if (error.code === 'P2002') { if (error.code === "P2002") {
throw new ForbiddenException('Credentials taken'); throw new ForbiddenException("Credentials taken");
} }
} }
throw error; throw error;
@ -83,10 +88,10 @@ export class AuthService {
}, },
}); });
if (!userDatas) throw new ForbiddenException('Credentials incorrect'); if (!userDatas) throw new ForbiddenException("Credentials incorrect");
const pwMatches = await argon.verify(userDatas.hash, dto.password); const pwMatches = await argon.verify(userDatas.hash, dto.password);
if (!pwMatches) throw new ForbiddenException('Credentials incorrect'); if (!pwMatches) throw new ForbiddenException("Credentials incorrect");
return this.signToken(userDatas); return this.signToken(userDatas);
} }
@ -94,9 +99,9 @@ export class AuthService {
async signToken(user: any): Promise<{ access_token: string; user: User }> { async signToken(user: any): Promise<{ access_token: string; user: User }> {
const payload = { sub: user.id, email: user.email }; const payload = { sub: user.id, email: user.email };
user.hash = null; user.hash = null;
const secret = this.config.get('JWT_SECRET'); const secret = this.config.get("JWT_SECRET");
const token = await this.jwt.signAsync(payload, { const token = await this.jwt.signAsync(payload, {
expiresIn: '30d', expiresIn: "30d",
secret: secret, secret: secret,
}); });

View File

@ -1,4 +1,4 @@
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import { ExecutionContext, createParamDecorator } from "@nestjs/common";
export const GetUser = createParamDecorator( export const GetUser = createParamDecorator(
(data: string | undefined, ctx: ExecutionContext) => { (data: string | undefined, ctx: ExecutionContext) => {

View File

@ -1 +1 @@
export * from './get-user.decorator'; export * from "./get-user.decorator";

View File

@ -1,12 +1,12 @@
import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from "@nestjs/swagger";
import { ApiProperty } from '@nestjs/swagger'; import { IsEmail, IsNotEmpty, IsString } from "class-validator";
export class AuthLoginDto { export class AuthLoginDto {
@IsEmail() @IsEmail()
@IsNotEmpty() @IsNotEmpty()
@ApiProperty({ type: String, description: 'email' }) @ApiProperty({ type: String, description: "email" })
email: string; email: string;
@ApiProperty({ type: String, description: 'password' }) @ApiProperty({ type: String, description: "password" })
@IsString() @IsString()
@IsNotEmpty() @IsNotEmpty()
password: string; password: string;

View File

@ -1,4 +1,4 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { import {
IsEmail, IsEmail,
IsInt, IsInt,
@ -9,12 +9,12 @@ import {
MaxLength, MaxLength,
Min, Min,
MinLength, MinLength,
} from 'class-validator'; } from "class-validator";
export class AuthRegisterDto { export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'FirstName', description: "FirstName",
example: 'Thomas', example: "Thomas",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)
@ -24,8 +24,8 @@ export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Last Name', description: "Last Name",
example: 'Anderson', example: "Anderson",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)
@ -35,8 +35,8 @@ export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Pseudo', description: "Pseudo",
example: 'Néo', example: "Néo",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)
@ -46,8 +46,8 @@ export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'email', description: "email",
example: 'neo@matrix.fr', example: "neo@matrix.fr",
}) })
@MaxLength(255) @MaxLength(255)
@IsEmail() @IsEmail()
@ -56,8 +56,8 @@ export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'password', description: "password",
example: 'AAaa11&&&&', example: "AAaa11&&&&",
}) })
@IsString() @IsString()
@IsNotEmpty() @IsNotEmpty()
@ -65,8 +65,8 @@ export class AuthRegisterDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'promoCode', description: "promoCode",
example: 'FILOU20', example: "FILOU20",
}) })
@IsOptional() @IsOptional()
promoCode: string; promoCode: string;

View File

@ -1,2 +1,2 @@
export * from './auth.register.dto'; export * from "./auth.register.dto";
export * from './auth.login.dto'; export * from "./auth.login.dto";

View File

@ -1 +1 @@
export * from './jwt.guard'; export * from "./jwt.guard";

View File

@ -1,6 +1,6 @@
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from "@nestjs/passport";
export class JwtGuard extends AuthGuard('jwt') { export class JwtGuard extends AuthGuard("jwt") {
constructor() { constructor() {
super(); super();
} }

View File

@ -1 +1 @@
export * from './jwt.strategy'; export * from "./jwt.strategy";

View File

@ -1,18 +1,18 @@
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PrismaService } from "@/prisma/prisma.service"; import { PrismaService } from "@/prisma/prisma.service";
import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
@Injectable() @Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { export class JwtStrategy extends PassportStrategy(Strategy, "jwt") {
constructor( constructor(
config: ConfigService, config: ConfigService,
private prisma: PrismaService, private prisma: PrismaService,
) { ) {
super({ super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: config.get('JWT_SECRET'), secretOrKey: config.get("JWT_SECRET"),
}); });
} }

View File

@ -9,37 +9,37 @@ import {
Patch, Patch,
Post, Post,
UseGuards, UseGuards,
} from '@nestjs/common'; } from "@nestjs/common";
import { GetUser } from '../auth/decorator'; import { ApiTags } from "@nestjs/swagger";
import { ApiTags } from '@nestjs/swagger'; import { User } from "@prisma/client";
import { User } from '@prisma/client'; import { JwtGuard } from "src/auth/guard";
import { CryptoService } from './crypto.service'; import { GetUser } from "../auth/decorator";
import { CryptoDto } from './dto'; import { CryptoService } from "./crypto.service";
import { JwtGuard } from 'src/auth/guard'; import { CryptoDto } from "./dto";
import { BuyCryptoDto } from './dto/buy.crypto.dto'; import { BuyCryptoDto } from "./dto/buy.crypto.dto";
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@ApiTags('crypto') @ApiTags("crypto")
@Controller('crypto') @Controller("crypto")
export class CryptoController { export class CryptoController {
constructor(private cryptoService: CryptoService) {} constructor(private cryptoService: CryptoService) {}
@Get('/all') @Get("/all")
getAllPromoCodes(@GetUser() user: User) { getAllPromoCodes(@GetUser() user: User) {
return this.cryptoService.getCryptos(user.id); return this.cryptoService.getCryptos(user.id);
} }
@Get('/search/:name') @Get("/search/:name")
searchCrypto(@GetUser() user: User, @Param('name') cryptoName: string) { searchCrypto(@GetUser() user: User, @Param("name") cryptoName: string) {
return this.cryptoService.searchCryptos(user.id, cryptoName); return this.cryptoService.searchCryptos(user.id, cryptoName);
} }
@Get('/history/:id') @Get("/history/:id")
CryptoHistory(@GetUser() user: User, @Param('id') cryptoId: string) { CryptoHistory(@GetUser() user: User, @Param("id") cryptoId: string) {
return this.cryptoService.getCryptoHistory(user.id, cryptoId); return this.cryptoService.getCryptoHistory(user.id, cryptoId);
} }
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@Post('/create') @Post("/create")
createPromoCode( createPromoCode(
@Body() @Body()
dto: CryptoDto, dto: CryptoDto,
@ -47,7 +47,7 @@ export class CryptoController {
) { ) {
return this.cryptoService.createCrypto(user.id, dto); return this.cryptoService.createCrypto(user.id, dto);
} }
@Post('/buy') @Post("/buy")
buyCrypto( buyCrypto(
@Body() @Body()
dto: BuyCryptoDto, dto: BuyCryptoDto,
@ -56,9 +56,9 @@ export class CryptoController {
return this.cryptoService.buyCrypto(user.id, dto); return this.cryptoService.buyCrypto(user.id, dto);
} }
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Patch('/update/:id') @Patch("/update/:id")
editCryptoById( editCryptoById(
@Param('id') cryptoId: string, @Param("id") cryptoId: string,
@Body() dto: CryptoDto, @Body() dto: CryptoDto,
@GetUser() user: User, @GetUser() user: User,
) { ) {
@ -66,8 +66,8 @@ export class CryptoController {
} }
@HttpCode(HttpStatus.NO_CONTENT) @HttpCode(HttpStatus.NO_CONTENT)
@Delete('/delete/:id') @Delete("/delete/:id")
deleteOfferById(@Param('id') roleId: string, @GetUser() user: User) { deleteOfferById(@Param("id") roleId: string, @GetUser() user: User) {
return this.cryptoService.deleteCryptoById(user.id, roleId); return this.cryptoService.deleteCryptoById(user.id, roleId);
} }
} }

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { CryptoService } from './crypto.service'; import { CryptoController } from "./crypto.controller";
import { CryptoController } from './crypto.controller'; import { CryptoService } from "./crypto.service";
@Module({ @Module({
providers: [CryptoService], providers: [CryptoService],

View File

@ -1,8 +1,8 @@
import { ForbiddenException, Injectable } from '@nestjs/common'; import { ForbiddenException, Injectable } from "@nestjs/common";
import { PrismaService } from '../prisma/prisma.service'; import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser";
import { checkUserHasAccount, checkUserIsAdmin } from 'src/utils/checkUser'; import { PrismaService } from "../prisma/prisma.service";
import { CryptoDto } from './dto'; import { CryptoDto } from "./dto";
import { BuyCryptoDto } from './dto/buy.crypto.dto'; import { BuyCryptoDto } from "./dto/buy.crypto.dto";
@Injectable() @Injectable()
export class CryptoService { export class CryptoService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@ -12,7 +12,7 @@ export class CryptoService {
return this.prisma.crypto.findMany({ return this.prisma.crypto.findMany({
orderBy: { orderBy: {
name: 'asc', name: "asc",
}, },
}); });
} }
@ -23,11 +23,11 @@ export class CryptoService {
where: { where: {
name: { name: {
contains: cryptoName, contains: cryptoName,
mode: 'insensitive', mode: "insensitive",
}, },
}, },
orderBy: { orderBy: {
name: 'asc', name: "asc",
}, },
}); });
} }
@ -42,12 +42,12 @@ export class CryptoService {
}, },
orderBy: { orderBy: {
created_at: 'desc', created_at: "desc",
}, },
take: 50, take: 50,
}); });
} }
throw new ForbiddenException('Crypto UUID required'); throw new ForbiddenException("Crypto UUID required");
} }
async createCrypto(userId: string, dto: CryptoDto) { async createCrypto(userId: string, dto: CryptoDto) {
@ -59,7 +59,7 @@ export class CryptoService {
}, },
}); });
if (existingCryptosWithSameName.length > 0) { if (existingCryptosWithSameName.length > 0) {
throw new ForbiddenException('Name already taken'); throw new ForbiddenException("Name already taken");
} }
const crypto = await this.prisma.crypto.create({ const crypto = await this.prisma.crypto.create({
data: { data: {
@ -86,13 +86,13 @@ export class CryptoService {
}, },
}); });
if (crypto.quantity < dto.amount) { if (crypto.quantity < dto.amount) {
throw new ForbiddenException('No more tokens available'); throw new ForbiddenException("No more tokens available");
} }
const necessaryAmount = crypto.value * dto.amount; const necessaryAmount = crypto.value * dto.amount;
console.log(necessaryAmount, user.dollarAvailables); console.log(necessaryAmount, user.dollarAvailables);
if (necessaryAmount > user.dollarAvailables) { if (necessaryAmount > user.dollarAvailables) {
throw new ForbiddenException('Make money first :) '); throw new ForbiddenException("Make money first :) ");
} }
const userAsset = await this.prisma.userHasCrypto.findFirst({ const userAsset = await this.prisma.userHasCrypto.findFirst({
where: { where: {
@ -159,7 +159,7 @@ export class CryptoService {
}); });
if (!crypto || crypto.id !== cryptoId) if (!crypto || crypto.id !== cryptoId)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
return this.prisma.crypto.update({ return this.prisma.crypto.update({
where: { where: {
@ -181,7 +181,7 @@ export class CryptoService {
}); });
if (!crypto || crypto.id !== id) if (!crypto || crypto.id !== id)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
await this.prisma.crypto.delete({ await this.prisma.crypto.delete({
where: { where: {

View File

@ -1,4 +1,4 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { import {
IsNumber, IsNumber,
IsString, IsString,
@ -7,12 +7,12 @@ import {
MaxLength, MaxLength,
Min, Min,
MinLength, MinLength,
} from 'class-validator'; } from "class-validator";
export class BuyCryptoDto { export class BuyCryptoDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Cryptocurrency UUID', description: "Cryptocurrency UUID",
example: '12121-DSZD-E221212-2121221', example: "12121-DSZD-E221212-2121221",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)
@ -22,7 +22,7 @@ export class BuyCryptoDto {
@ApiProperty({ @ApiProperty({
type: Number, type: Number,
description: 'Amount of token traded', description: "Amount of token traded",
example: 2, example: 2,
}) })
@Min(1) @Min(1)

View File

@ -1,4 +1,4 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { import {
IsNumber, IsNumber,
IsPositive, IsPositive,
@ -8,12 +8,12 @@ import {
MaxLength, MaxLength,
Min, Min,
MinLength, MinLength,
} from 'class-validator'; } from "class-validator";
export class CryptoDto { export class CryptoDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Cryptocurrency name', description: "Cryptocurrency name",
example: 'BTC', example: "BTC",
}) })
@MaxLength(50) @MaxLength(50)
@MinLength(1) @MinLength(1)
@ -22,7 +22,7 @@ export class CryptoDto {
@ApiProperty({ @ApiProperty({
type: Number, type: Number,
description: 'Value for the cryptocurrency in $', description: "Value for the cryptocurrency in $",
example: 1, example: 1,
}) })
@Min(1) @Min(1)
@ -33,7 +33,7 @@ export class CryptoDto {
@ApiProperty({ @ApiProperty({
type: Number, type: Number,
description: 'Quantity of tokens available on the platform', description: "Quantity of tokens available on the platform",
example: 100, example: 100,
}) })
@Min(1) @Min(1)
@ -44,8 +44,8 @@ export class CryptoDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Image for the cryptocurrency in ', description: "Image for the cryptocurrency in ",
example: 'https://myImage/com', example: "https://myImage/com",
}) })
@MaxLength(255) @MaxLength(255)
@IsUrl() @IsUrl()

View File

@ -1 +1 @@
export * from './crypto.dto'; export * from "./crypto.dto";

View File

@ -1,19 +1,19 @@
import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from "@nestjs/common";
import { AppModule } from './app.module'; import { NestFactory } from "@nestjs/core";
import { ValidationPipe } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from "./app.module";
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.enableCors(); app.enableCors();
const config = new DocumentBuilder() const config = new DocumentBuilder()
.setTitle('Neptune API') .setTitle("Neptune API")
.setDescription('A fictive app') .setDescription("A fictive app")
.setVersion('1.0') .setVersion("1.0")
.build(); .build();
const document = SwaggerModule.createDocument(app, config); const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document); SwaggerModule.setup("api", app, document);
app.useGlobalPipes( app.useGlobalPipes(
new ValidationPipe({ new ValidationPipe({

View File

@ -1 +1 @@
export * from './offer.dto'; export * from "./offer.dto";

View File

@ -1,4 +1,4 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { import {
IsNumber, IsNumber,
IsPositive, IsPositive,
@ -7,21 +7,21 @@ import {
Max, Max,
MaxLength, MaxLength,
Min, Min,
} from 'class-validator'; } from "class-validator";
export class OfferDto { export class OfferDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Cryptocurrency UUID', description: "Cryptocurrency UUID",
example: '12121-DSZD-E221212-6227933', example: "12121-DSZD-E221212-6227933",
}) })
@IsString() @IsString()
@IsUUID() @IsUUID()
id_crypto: string; id_crypto: string;
@ApiProperty({ @ApiProperty({
type: 'number', type: "number",
description: 'Amount traded ', description: "Amount traded ",
example: 21, example: 21,
}) })
@Min(1) @Min(1)
@ -30,4 +30,3 @@ export class OfferDto {
@IsPositive() @IsPositive()
amount: number; amount: number;
} }

View File

@ -10,28 +10,28 @@ import {
Post, Post,
UseGuards, UseGuards,
// UseGuards, // UseGuards,
} from '@nestjs/common'; } from "@nestjs/common";
import { GetUser } from '../auth/decorator';
// import { JwtGuard } from '../auth/guard'; // import { JwtGuard } from '../auth/guard';
import { ApiTags } from '@nestjs/swagger'; import { ApiTags } from "@nestjs/swagger";
import { User } from '@prisma/client'; import { User } from "@prisma/client";
import { JwtGuard } from 'src/auth/guard'; import { JwtGuard } from "src/auth/guard";
import { OfferService } from './offer.service'; import { GetUser } from "../auth/decorator";
import { OfferDto } from './dto'; import { OfferDto } from "./dto";
import { OfferService } from "./offer.service";
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@ApiTags('offer') @ApiTags("offer")
@Controller('offer') @Controller("offer")
export class OfferController { export class OfferController {
constructor(private offerService: OfferService) {} constructor(private offerService: OfferService) {}
@Get('/all') @Get("/all")
getAllRoles(@GetUser() user: User) { getAllRoles(@GetUser() user: User) {
return this.offerService.getOffers(user.id); return this.offerService.getOffers(user.id);
} }
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@Post('/create') @Post("/create")
createRole( createRole(
@Body() @Body()
dto: OfferDto, dto: OfferDto,
@ -41,9 +41,9 @@ export class OfferController {
} }
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Patch('/update/:id') @Patch("/update/:id")
editOfferById( editOfferById(
@Param('id') offerId: string, @Param("id") offerId: string,
@Body() dto: OfferDto, @Body() dto: OfferDto,
@GetUser() user: User, @GetUser() user: User,
) { ) {
@ -51,8 +51,8 @@ export class OfferController {
} }
@HttpCode(HttpStatus.NO_CONTENT) @HttpCode(HttpStatus.NO_CONTENT)
@Delete('/delete/:id') @Delete("/delete/:id")
deleteOfferById(@Param('id') roleId: string, @GetUser() user: User) { deleteOfferById(@Param("id") roleId: string, @GetUser() user: User) {
return this.offerService.deleteOfferById(user.id, roleId); return this.offerService.deleteOfferById(user.id, roleId);
} }
} }

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { OfferService } from './offer.service'; import { OfferController } from "./offer.controller";
import { OfferController } from './offer.controller'; import { OfferService } from "./offer.service";
@Module({ @Module({
providers: [OfferService], providers: [OfferService],

View File

@ -1,9 +1,8 @@
import {ForbiddenException, Injectable} from "@nestjs/common";
import { PrismaService } from "@/prisma/prisma.service"; import { PrismaService } from "@/prisma/prisma.service";
import { ForbiddenException, Injectable } from "@nestjs/common";
import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser"; import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser";
import { OfferDto } from "./dto"; import { OfferDto } from "./dto";
@Injectable() @Injectable()
export class OfferService { export class OfferService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@ -12,7 +11,7 @@ export class OfferService {
await checkUserHasAccount(userId); await checkUserHasAccount(userId);
return this.prisma.offer.findMany({ return this.prisma.offer.findMany({
orderBy: { orderBy: {
created_at: 'desc', created_at: "desc",
}, },
select: { select: {
amount: true, amount: true,
@ -49,11 +48,11 @@ export class OfferService {
}, },
}); });
if (!crypto || !crypto.id) { if (!crypto || !crypto.id) {
throw new ForbiddenException('Crypto doesnt exist'); throw new ForbiddenException("Crypto doesnt exist");
} }
if (!offer || offer.id !== offerId) if (!offer || offer.id !== offerId)
throw new ForbiddenException('Offer id mandatory'); throw new ForbiddenException("Offer id mandatory");
return this.prisma.offer.update({ return this.prisma.offer.update({
where: { where: {
@ -74,7 +73,7 @@ export class OfferService {
}); });
if (!offer || offer.id !== id) if (!offer || offer.id !== id)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
await this.prisma.offer.delete({ await this.prisma.offer.delete({
where: { where: {
@ -83,6 +82,3 @@ export class OfferService {
}); });
} }
} }

View File

@ -1,5 +1,5 @@
import { Global, Module } from '@nestjs/common'; import { Global, Module } from "@nestjs/common";
import { PrismaService } from './prisma.service'; import { PrismaService } from "./prisma.service";
@Global() @Global()
@Module({ @Module({

View File

@ -1,7 +1,7 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from "@nestjs/common";
// biome-ignore lint/style/useImportType: // biome-ignore lint/style/useImportType:
import { ConfigService } from '@nestjs/config'; import { ConfigService } from "@nestjs/config";
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from "@prisma/client";
@Injectable() @Injectable()
export class PrismaService extends PrismaClient { export class PrismaService extends PrismaClient {
@ -9,10 +9,9 @@ export class PrismaService extends PrismaClient {
super({ super({
datasources: { datasources: {
db: { db: {
url: config.get('DATABASE_URL'), url: config.get("DATABASE_URL"),
}, },
}, },
}); });
} }
} }

View File

@ -1 +1 @@
export * from './promoCode.dto'; export * from "./promoCode.dto";

View File

@ -1,4 +1,4 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { import {
IsNumber, IsNumber,
IsPositive, IsPositive,
@ -7,12 +7,12 @@ import {
MaxLength, MaxLength,
Min, Min,
MinLength, MinLength,
} from 'class-validator'; } from "class-validator";
export class PromoCodeDto { export class PromoCodeDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Name of the PromoCOde', description: "Name of the PromoCOde",
example: 'FILOU10', example: "FILOU10",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)
@ -21,7 +21,7 @@ export class PromoCodeDto {
@ApiProperty({ @ApiProperty({
type: Number, type: Number,
description: 'Dollars given for account creation when promoCode applied', description: "Dollars given for account creation when promoCode applied",
example: 100, example: 100,
}) })
@IsPositive() @IsPositive()

View File

@ -9,27 +9,27 @@ import {
Patch, Patch,
Post, Post,
UseGuards, UseGuards,
} from '@nestjs/common'; } from "@nestjs/common";
import { GetUser } from '../auth/decorator'; import { ApiTags } from "@nestjs/swagger";
import { ApiTags } from '@nestjs/swagger'; import { User } from "@prisma/client";
import { User } from '@prisma/client'; import { JwtGuard } from "src/auth/guard";
import { PromoCodeDto } from './dto'; import { GetUser } from "../auth/decorator";
import { PromoCodeService } from './promoCode.service'; import { PromoCodeDto } from "./dto";
import { JwtGuard } from 'src/auth/guard'; import { PromoCodeService } from "./promoCode.service";
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@ApiTags('promoCode') @ApiTags("promoCode")
@Controller('promoCode') @Controller("promoCode")
export class PromoCodeController { export class PromoCodeController {
constructor(private promoService: PromoCodeService) {} constructor(private promoService: PromoCodeService) {}
@Get('/all') @Get("/all")
getAllPromoCodes(@GetUser() user: User) { getAllPromoCodes(@GetUser() user: User) {
return this.promoService.getPromoCodes(user.id); return this.promoService.getPromoCodes(user.id);
} }
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@Post('/create') @Post("/create")
createPromoCode( createPromoCode(
// @GetUser() user: User, // @GetUser() user: User,
@Body() @Body()
@ -40,9 +40,9 @@ export class PromoCodeController {
} }
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Patch('/update/:id') @Patch("/update/:id")
editPromoCodeById( editPromoCodeById(
@Param('id') promoCodeId: string, @Param("id") promoCodeId: string,
@Body() dto: PromoCodeDto, @Body() dto: PromoCodeDto,
@GetUser() user: User, @GetUser() user: User,
) { ) {
@ -50,8 +50,8 @@ export class PromoCodeController {
} }
@HttpCode(HttpStatus.NO_CONTENT) @HttpCode(HttpStatus.NO_CONTENT)
@Delete('/delete/:id') @Delete("/delete/:id")
deletePromoCodeById(@Param('id') promoCodeId: string, @GetUser() user: User) { deletePromoCodeById(@Param("id") promoCodeId: string, @GetUser() user: User) {
return this.promoService.deletePromoCodeById(user.id, promoCodeId); return this.promoService.deletePromoCodeById(user.id, promoCodeId);
} }
} }

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { PromoCodeController } from './promoCode.controller'; import { PromoCodeController } from "./promoCode.controller";
import { PromoCodeService } from './promoCode.service'; import { PromoCodeService } from "./promoCode.service";
@Module({ @Module({
providers: [PromoCodeService], providers: [PromoCodeService],

View File

@ -1,13 +1,13 @@
import { ForbiddenException } from '@nestjs/common';
// biome-ignore lint/style/useImportType:
import { Test, TestingModule } from '@nestjs/testing';
import { PrismaService } from "@/prisma/prisma.service"; import { PrismaService } from "@/prisma/prisma.service";
import { PromoCodeService } from './promoCode.service';
import { checkUserIsAdmin } from "@/utils/checkUser"; import { checkUserIsAdmin } from "@/utils/checkUser";
import { ForbiddenException } from "@nestjs/common";
// biome-ignore lint/style/useImportType:
import { Test, TestingModule } from "@nestjs/testing";
import { PromoCodeService } from "./promoCode.service";
jest.mock('../utils/checkUser'); jest.mock("../utils/checkUser");
describe('PromoCodeService', () => { describe("PromoCodeService", () => {
let service: PromoCodeService; let service: PromoCodeService;
let prisma: PrismaService; let prisma: PrismaService;
@ -37,35 +37,34 @@ describe('PromoCodeService', () => {
jest.clearAllMocks(); jest.clearAllMocks();
}); });
describe('getPromoCodes', () => { describe("getPromoCodes", () => {
it('should get promo codes if user is admin', async () => { it("should get promo codes if user is admin", async () => {
(checkUserIsAdmin as jest.Mock).mockResolvedValue(true); (checkUserIsAdmin as jest.Mock).mockResolvedValue(true);
const mockPromoCodes = [ const mockPromoCodes = [
{ id: '1', name: 'PROMO10', value: 10 }, { id: "1", name: "PROMO10", value: 10 },
{ id: '2', name: 'PROMO20', value: 20 }, { id: "2", name: "PROMO20", value: 20 },
]; ];
mockPrismaService.promoCode.findMany.mockResolvedValue(mockPromoCodes); mockPrismaService.promoCode.findMany.mockResolvedValue(mockPromoCodes);
const result = await service.getPromoCodes('user-id'); const result = await service.getPromoCodes("user-id");
expect(checkUserIsAdmin).toHaveBeenCalledWith('user-id'); expect(checkUserIsAdmin).toHaveBeenCalledWith("user-id");
expect(prisma.promoCode.findMany).toHaveBeenCalledWith({ expect(prisma.promoCode.findMany).toHaveBeenCalledWith({
orderBy: { name: 'asc' }, orderBy: { name: "asc" },
select: { id: true, name: true, value: true }, select: { id: true, name: true, value: true },
}); });
expect(result).toEqual(mockPromoCodes); expect(result).toEqual(mockPromoCodes);
}); });
it('should throw ForbiddenException if user is not admin', async () => { it("should throw ForbiddenException if user is not admin", async () => {
(checkUserIsAdmin as jest.Mock).mockRejectedValue(new ForbiddenException('Not an admin')); (checkUserIsAdmin as jest.Mock).mockRejectedValue(
new ForbiddenException("Not an admin"),
await expect(service.getPromoCodes('user-id')).rejects.toThrow(
ForbiddenException,
); );
expect(checkUserIsAdmin).toHaveBeenCalledWith('user-id'); await expect(service.getPromoCodes("user-id")).rejects.toThrow(ForbiddenException);
expect(checkUserIsAdmin).toHaveBeenCalledWith("user-id");
expect(prisma.promoCode.findMany).not.toHaveBeenCalled(); expect(prisma.promoCode.findMany).not.toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -1,7 +1,7 @@
import { ForbiddenException, Injectable } from '@nestjs/common'; import { ForbiddenException, Injectable } from "@nestjs/common";
import { PrismaService } from '../prisma/prisma.service'; import { PrismaService } from "../prisma/prisma.service";
import { PromoCodeDto } from './dto'; import { checkUserIsAdmin } from "../utils/checkUser";
import { checkUserIsAdmin } from '../utils/checkUser'; import { PromoCodeDto } from "./dto";
@Injectable() @Injectable()
export class PromoCodeService { export class PromoCodeService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@ -11,7 +11,7 @@ export class PromoCodeService {
return this.prisma.promoCode.findMany({ return this.prisma.promoCode.findMany({
orderBy: { orderBy: {
name: 'asc', name: "asc",
}, },
select: { select: {
id: true, id: true,
@ -33,11 +33,7 @@ export class PromoCodeService {
return promoCode; return promoCode;
} }
async editPromoCodeById( async editPromoCodeById(userId: string, promoCodeId: string, dto: PromoCodeDto) {
userId: string,
promoCodeId: string,
dto: PromoCodeDto,
) {
await checkUserIsAdmin(userId); await checkUserIsAdmin(userId);
const promoCode = await this.prisma.promoCode.findUnique({ const promoCode = await this.prisma.promoCode.findUnique({
@ -47,7 +43,7 @@ export class PromoCodeService {
}); });
if (!promoCode || promoCode.id !== promoCodeId) if (!promoCode || promoCode.id !== promoCodeId)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
return this.prisma.promoCode.update({ return this.prisma.promoCode.update({
where: { where: {
@ -68,7 +64,7 @@ export class PromoCodeService {
}); });
if (!promoCode || promoCode.id !== id) if (!promoCode || promoCode.id !== id)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
await this.prisma.promoCode.delete({ await this.prisma.promoCode.delete({
where: { where: {

View File

@ -1 +1 @@
export * from './role.dto'; export * from "./role.dto";

View File

@ -1,10 +1,10 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { IsString, MaxLength, MinLength } from 'class-validator'; import { IsString, MaxLength, MinLength } from "class-validator";
export class RoleDto { export class RoleDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Role Name', description: "Role Name",
example: 'user', example: "user",
}) })
@MinLength(1) @MinLength(1)
@MaxLength(50) @MaxLength(50)

View File

@ -10,22 +10,22 @@ import {
Post, Post,
UseGuards, UseGuards,
// UseGuards, // UseGuards,
} from '@nestjs/common'; } from "@nestjs/common";
import { GetUser } from '../auth/decorator'; import { ApiTags } from "@nestjs/swagger";
import { User } from "@prisma/client";
import { JwtGuard } from "src/auth/guard";
import { GetUser } from "../auth/decorator";
// import { JwtGuard } from '../auth/guard'; // import { JwtGuard } from '../auth/guard';
import { RoleDto } from './dto'; import { RoleDto } from "./dto";
import { RoleService } from './role.service'; import { RoleService } from "./role.service";
import { ApiTags } from '@nestjs/swagger';
import { User } from '@prisma/client';
import { JwtGuard } from 'src/auth/guard';
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@ApiTags('role') @ApiTags("role")
@Controller('role') @Controller("role")
export class RoleController { export class RoleController {
constructor(private roleService: RoleService) {} constructor(private roleService: RoleService) {}
@Get('/all') @Get("/all")
getAllRoles(@GetUser() user: User) { getAllRoles(@GetUser() user: User) {
return this.roleService.getRolesAdmin(user.id); return this.roleService.getRolesAdmin(user.id);
} }
@ -35,7 +35,7 @@ export class RoleController {
// } // }
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@Post('/create') @Post("/create")
createRole( createRole(
// @GetUser() user: User, // @GetUser() user: User,
@Body() @Body()
@ -46,18 +46,14 @@ export class RoleController {
} }
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
@Patch('/update/:id') @Patch("/update/:id")
editRoleById( editRoleById(@Param("id") roleId: string, @Body() dto: RoleDto, @GetUser() user: User) {
@Param('id') roleId: string,
@Body() dto: RoleDto,
@GetUser() user: User,
) {
return this.roleService.editRoleById(user.id, roleId, dto); return this.roleService.editRoleById(user.id, roleId, dto);
} }
@HttpCode(HttpStatus.NO_CONTENT) @HttpCode(HttpStatus.NO_CONTENT)
@Delete('/delete/:id') @Delete("/delete/:id")
deleteRoleById(@Param('id') roleId: string, @GetUser() user: User) { deleteRoleById(@Param("id") roleId: string, @GetUser() user: User) {
return this.roleService.deleteRoleById(user.id, roleId); return this.roleService.deleteRoleById(user.id, roleId);
} }
} }

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { RoleController } from './role.controller'; import { RoleController } from "./role.controller";
import { RoleService } from './role.service'; import { RoleService } from "./role.service";
@Module({ @Module({
providers: [RoleService], providers: [RoleService],
controllers: [RoleController], controllers: [RoleController],

View File

@ -1,7 +1,7 @@
import { ForbiddenException, Injectable } from '@nestjs/common'; import { ForbiddenException, Injectable } from "@nestjs/common";
import { PrismaService } from '../prisma/prisma.service'; import { checkUserIsAdmin } from "src/utils/checkUser";
import { RoleDto } from './dto'; import { PrismaService } from "../prisma/prisma.service";
import { checkUserIsAdmin } from 'src/utils/checkUser'; import { RoleDto } from "./dto";
// import { checkRoleLevel, checkUserIsStaff } from 'src/utils/checkUser'; // import { checkRoleLevel, checkUserIsStaff } from 'src/utils/checkUser';
@Injectable() @Injectable()
export class RoleService { export class RoleService {
@ -11,7 +11,7 @@ export class RoleService {
await checkUserIsAdmin(userId); await checkUserIsAdmin(userId);
return this.prisma.role.findMany({ return this.prisma.role.findMany({
orderBy: { orderBy: {
name: 'asc', name: "asc",
}, },
select: { select: {
id: true, id: true,
@ -40,7 +40,7 @@ export class RoleService {
}); });
if (!role || role.id !== roleId) if (!role || role.id !== roleId)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
return this.prisma.role.update({ return this.prisma.role.update({
where: { where: {
@ -61,7 +61,7 @@ export class RoleService {
}); });
if (!role || role.id !== id) if (!role || role.id !== id)
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
await this.prisma.role.delete({ await this.prisma.role.delete({
where: { where: {

View File

@ -1 +1 @@
export * from './trade.dto'; export * from "./trade.dto";

View File

@ -1,10 +1,10 @@
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from "@nestjs/swagger";
import { IsNotEmpty, IsString, IsUUID } from 'class-validator'; import { IsNotEmpty, IsString, IsUUID } from "class-validator";
export class TradeDto { export class TradeDto {
@ApiProperty({ @ApiProperty({
type: String, type: String,
description: 'Offer UUID ', description: "Offer UUID ",
example: '121212-DSDZ1-21212DJDZ-31313', example: "121212-DSDZ1-21212DJDZ-31313",
}) })
@IsUUID() @IsUUID()
@IsNotEmpty() @IsNotEmpty()

View File

@ -6,27 +6,27 @@ import {
HttpStatus, HttpStatus,
Post, Post,
UseGuards, UseGuards,
} from '@nestjs/common'; } from "@nestjs/common";
import { GetUser } from '../auth/decorator'; import { ApiTags } from "@nestjs/swagger";
import { ApiTags } from '@nestjs/swagger'; import { User } from "@prisma/client";
import { User } from '@prisma/client'; import { JwtGuard } from "src/auth/guard";
import { TradeService } from './trade.service'; import { GetUser } from "../auth/decorator";
import { TradeDto } from './dto'; import { TradeDto } from "./dto";
import { JwtGuard } from 'src/auth/guard'; import { TradeService } from "./trade.service";
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@ApiTags('trade') @ApiTags("trade")
@Controller('trade') @Controller("trade")
export class TradeController { export class TradeController {
constructor(private tradeService: TradeService) {} constructor(private tradeService: TradeService) {}
@Get('/all') @Get("/all")
getAllPromoCodes(@GetUser() user: User) { getAllPromoCodes(@GetUser() user: User) {
return this.tradeService.getTrades(user.id); return this.tradeService.getTrades(user.id);
} }
@HttpCode(HttpStatus.CREATED) @HttpCode(HttpStatus.CREATED)
@Post('/create') @Post("/create")
createPromoCode( createPromoCode(
// @GetUser() user: User, // @GetUser() user: User,
@Body() @Body()

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { TradeService } from './trade.service'; import { TradeController } from "./trade.controller";
import { TradeController } from './trade.controller'; import { TradeService } from "./trade.service";
@Module({ @Module({
providers: [TradeService], providers: [TradeService],

View File

@ -1,7 +1,7 @@
import { ForbiddenException, Injectable } from '@nestjs/common'; import { ForbiddenException, Injectable } from "@nestjs/common";
import { PrismaService } from '../prisma/prisma.service'; import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser";
import { checkUserHasAccount, checkUserIsAdmin } from 'src/utils/checkUser'; import { PrismaService } from "../prisma/prisma.service";
import { TradeDto } from './dto'; import { TradeDto } from "./dto";
@Injectable() @Injectable()
export class TradeService { export class TradeService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@ -11,7 +11,7 @@ export class TradeService {
return this.prisma.trade.findMany({ return this.prisma.trade.findMany({
orderBy: { orderBy: {
created_at: 'desc', created_at: "desc",
}, },
// include: { // include: {
// Giver: true, // Giver: true,
@ -43,7 +43,7 @@ export class TradeService {
async getLastTrades() { async getLastTrades() {
return this.prisma.trade.findMany({ return this.prisma.trade.findMany({
orderBy: { orderBy: {
created_at: 'desc', created_at: "desc",
}, },
select: { select: {
amount_traded: true, amount_traded: true,

View File

@ -1,17 +1,17 @@
import { Controller, Get, UseGuards } from '@nestjs/common'; import { Controller, Get, UseGuards } from "@nestjs/common";
import { GetUser } from '../auth/decorator'; import { ApiTags } from "@nestjs/swagger";
import { JwtGuard } from '../auth/guard'; import { User } from "@prisma/client";
import { ApiTags } from '@nestjs/swagger'; import { GetUser } from "../auth/decorator";
import { UserService } from './user.service'; import { JwtGuard } from "../auth/guard";
import { User } from '@prisma/client'; import { UserService } from "./user.service";
@ApiTags('user') @ApiTags("user")
@UseGuards(JwtGuard) @UseGuards(JwtGuard)
@Controller('user') @Controller("user")
export class UserController { export class UserController {
constructor(private userService: UserService) {} constructor(private userService: UserService) {}
@Get('/my-assets') @Get("/my-assets")
GetMyAssets( GetMyAssets(
@GetUser() @GetUser()
user: User, user: User,
@ -19,14 +19,14 @@ export class UserController {
return this.userService.getMyAssets(user.id); return this.userService.getMyAssets(user.id);
} }
@Get('/users-assets') @Get("/users-assets")
GetAlLAssets( GetAlLAssets(
@GetUser() @GetUser()
user: User, user: User,
) { ) {
return this.userService.getUsersAssets(user.id); return this.userService.getUsersAssets(user.id);
} }
@Get('/my-trades') @Get("/my-trades")
GetMyTrades( GetMyTrades(
@GetUser() @GetUser()
user: User, user: User,

View File

@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from "@nestjs/common";
import { UserService } from './user.service'; import { UserController } from "./user.controller";
import { UserController } from './user.controller'; import { UserService } from "./user.service";
@Module({ @Module({
providers: [UserService], providers: [UserService],
controllers: [UserController], controllers: [UserController],

View File

@ -1,8 +1,7 @@
import {Injectable} from "@nestjs/common";
import { PrismaService } from "@/prisma/prisma.service"; import { PrismaService } from "@/prisma/prisma.service";
import { Injectable } from "@nestjs/common";
import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser"; import { checkUserHasAccount, checkUserIsAdmin } from "src/utils/checkUser";
@Injectable() @Injectable()
export class UserService { export class UserService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}

View File

@ -1,12 +1,12 @@
import { ForbiddenException } from '@nestjs/common'; import { ForbiddenException } from "@nestjs/common";
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from "@prisma/client";
import { Roles } from './const/const'; import { Roles } from "./const/const";
const prisma = new PrismaClient(); const prisma = new PrismaClient();
export async function checkRoleLevel(userId: string, level: string) { export async function checkRoleLevel(userId: string, level: string) {
if (!userId || !level) { if (!userId || !level) {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
checkRoleExist(level); checkRoleExist(level);
@ -26,13 +26,13 @@ export async function checkRoleLevel(userId: string, level: string) {
if (role?.id) { if (role?.id) {
checkRoleExist(role.name); checkRoleExist(role.name);
if (level === Roles.ADMIN && role.name !== Roles.ADMIN) { if (level === Roles.ADMIN && role.name !== Roles.ADMIN) {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} else { } else {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} else { } else {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} }
@ -42,7 +42,7 @@ function checkRoleExist(role: string) {
case Roles.USER: case Roles.USER:
break; break;
default: default:
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} }
@ -55,10 +55,10 @@ export async function checkUserHasAccount(jwtId: string) {
}, },
}); });
if (!user || !user.id) { if (!user || !user.id) {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} else { } else {
throw new ForbiddenException('Access to resources denied'); throw new ForbiddenException("Access to resources denied");
} }
} }
@ -74,13 +74,13 @@ export async function checkUserIsAdmin(jwtId: string) {
}, },
}); });
if (!user || !user.id) { if (!user || !user.id) {
throw new ForbiddenException('Access to resources denied2'); throw new ForbiddenException("Access to resources denied2");
} }
if (user.Role.name !== Roles.ADMIN) { if (user.Role.name !== Roles.ADMIN) {
throw new ForbiddenException('Access to resources denied3'); throw new ForbiddenException("Access to resources denied3");
} }
} else { } else {
throw new ForbiddenException('Access to resources denied4'); throw new ForbiddenException("Access to resources denied4");
} }
} }

View File

@ -1,4 +1,4 @@
export const Roles = { export const Roles = {
ADMIN: 'admin', ADMIN: "admin",
USER: 'user', USER: "user",
}; };

View File

@ -1,16 +1,16 @@
// auth/test/mocks.ts // auth/test/mocks.ts
import { User } from '@prisma/client'; import { User } from "@prisma/client";
export const getMockUser = (): User => ({ export const getMockUser = (): User => ({
id: 'user-id', id: "user-id",
email: 'test@example.com', email: "test@example.com",
firstName: 'Test User', firstName: "Test User",
lastName: 'Test', lastName: "Test",
hash: 'test-hash', hash: "test-hash",
pseudo: 'test-pseudo', pseudo: "test-pseudo",
isActive: true, isActive: true,
created_at: new Date(), created_at: new Date(),
updated_at: new Date(), updated_at: new Date(),
roleId: 'user', roleId: "user",
dollarAvailables: 1000, dollarAvailables: 1000,
}); });