From 0a179e46a2b79dfd95d6f69910ce4ca71b4d6d91 Mon Sep 17 00:00:00 2001 From: GabrieldeSouzza Date: Wed, 24 Apr 2024 18:40:33 -0300 Subject: [PATCH] feat: add update many and delete any in freight expenses --- .../UpdateManyFreightExpenseDto.ts | 9 +++ .../FreightExpenseUseCases.ts | 26 ++++++- .../whereDtos/FreightExpenseRepository.Dto.ts | 3 + .../repositories/FreightExpenseResitory.ts | 12 ++- .../prisma/services/FreightExpense.service.ts | 73 +++++++++++++++---- .../contract-outsouced-driver.service.ts | 1 - .../Args/WhereFreightExpenseArgs.ts | 8 ++ .../FreightExpense.input.ts | 18 ++++- .../FreightExpense.resolver.ts | 27 ++++++- src/infra/graphql/generated/schema.gql | 11 +++ 10 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 src/app/dtos/FreightExpenseDto/UpdateManyFreightExpenseDto.ts diff --git a/src/app/dtos/FreightExpenseDto/UpdateManyFreightExpenseDto.ts b/src/app/dtos/FreightExpenseDto/UpdateManyFreightExpenseDto.ts new file mode 100644 index 0000000..bb7632f --- /dev/null +++ b/src/app/dtos/FreightExpenseDto/UpdateManyFreightExpenseDto.ts @@ -0,0 +1,9 @@ +import { type IFreightExpense } from 'domain/entities/OrdersEntities/FreightExpense/FreightExpense'; + +export abstract class UpdateManyFreightExpenseDTO + implements Partial +{ + id: string; + expenseName?: string; + value?: number; +} diff --git a/src/app/useCases/FreightExpenseUseCases/FreightExpenseUseCases.ts b/src/app/useCases/FreightExpenseUseCases/FreightExpenseUseCases.ts index 6d6d68f..4c4e22e 100644 --- a/src/app/useCases/FreightExpenseUseCases/FreightExpenseUseCases.ts +++ b/src/app/useCases/FreightExpenseUseCases/FreightExpenseUseCases.ts @@ -3,12 +3,16 @@ import { HttpStatus, Injectable } from '@nestjs/common'; import { GraphQLError } from 'graphql'; import { type GetFreightExpenseDTO } from 'domain/dto/repositories/getDataDtos/GetFreightExpenseDto'; -import { type FindAllFreightExpenseWhereRequestDTO } from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; +import { + type CountAllFreightExpenseWhereRequestDTO, + type FindAllFreightExpenseWhereRequestDTO, +} from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; import { FreightExpense } from 'domain/entities/OrdersEntities/FreightExpense/FreightExpense'; import { FreightExpenseRepository } from 'domain/repositories/FreightExpenseResitory'; import { type CreateFreightExpenseDTO } from 'app/dtos/FreightExpenseDto/CreateFreightExpenseDto'; import { type UpdateFreightExpenseDTO } from 'app/dtos/FreightExpenseDto/UpdateFreightExpenseDto'; +import { type UpdateManyFreightExpenseDTO } from 'app/dtos/FreightExpenseDto/UpdateManyFreightExpenseDto'; import { LegalClientOrderUseCases } from '../LegalClientOrderUseCases/LegalClientOrderUseCases'; import { PhysicalCustomerOrderUseCases } from '../PhysicalCustomerOrderCases/PhysicalCustomerOrderUseCases'; @@ -20,6 +24,9 @@ export class FreightExpenseUseCases { private legalClientOrder: LegalClientOrderUseCases, private physicalCustomeOrder: PhysicalCustomerOrderUseCases, ) {} + async countFreightExpense(request: CountAllFreightExpenseWhereRequestDTO) { + return this.freightExpenseRepository.countFreightExpenseRepositoy(request); + } async getFreightExpense(request: GetFreightExpenseDTO) { if (!request.id) { throw new GraphQLError('IS NECESSARY AN ID', { @@ -91,9 +98,26 @@ export class FreightExpenseUseCases { ); } + async updateManyFreightExpenses(data: UpdateManyFreightExpenseDTO[]) { + const expenses = data.map( + expense => + new FreightExpense({ + expenseName: expense.expenseName, + value: expense.value, + id: expense.id, + }), + ); + + return this.freightExpenseRepository.updateManyFreightExpense(expenses); + } + async deleteExpense(data: GetFreightExpenseDTO) { await this.getFreightExpense(data); return this.freightExpenseRepository.delFreightExpense(data); } + + async deleteManyFreightExpenses(ids: string[]) { + return this.freightExpenseRepository.deleteManyFreightExpenses(ids); + } } diff --git a/src/domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto.ts b/src/domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto.ts index 0419eb1..b7d1fb4 100644 --- a/src/domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto.ts +++ b/src/domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto.ts @@ -32,3 +32,6 @@ export class FindAllFreightExpenseWhereRequestDTO { sort?: SortByFreightExpenseTypeDTO; where?: WhereFreightExpenseTypeDTO; } +export abstract class CountAllFreightExpenseWhereRequestDTO { + where?: WhereFreightExpenseTypeDTO; +} diff --git a/src/domain/repositories/FreightExpenseResitory.ts b/src/domain/repositories/FreightExpenseResitory.ts index 24b8448..a98a0b7 100644 --- a/src/domain/repositories/FreightExpenseResitory.ts +++ b/src/domain/repositories/FreightExpenseResitory.ts @@ -1,8 +1,14 @@ import { type GetFreightExpenseDTO } from 'domain/dto/repositories/getDataDtos/GetFreightExpenseDto'; -import { type FindAllFreightExpenseWhereRequestDTO } from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; +import { + type CountAllFreightExpenseWhereRequestDTO, + type FindAllFreightExpenseWhereRequestDTO, +} from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; import { type FreightExpense } from 'domain/entities/OrdersEntities/FreightExpense/FreightExpense'; export abstract class FreightExpenseRepository { + abstract countFreightExpenseRepositoy( + parameters: CountAllFreightExpenseWhereRequestDTO, + ): Promise; abstract getFreightExpense( request: GetFreightExpenseDTO, ): Promise; @@ -19,7 +25,11 @@ export abstract class FreightExpenseRepository { id: string, expense: FreightExpense, ): Promise; + abstract updateManyFreightExpense( + expenses: FreightExpense[], + ): Promise; abstract delFreightExpense( data: GetFreightExpenseDTO, ): Promise; + abstract deleteManyFreightExpenses(ids: string[]): Promise; } diff --git a/src/infra/database/prisma/services/FreightExpense.service.ts b/src/infra/database/prisma/services/FreightExpense.service.ts index 34303af..249cdb2 100644 --- a/src/infra/database/prisma/services/FreightExpense.service.ts +++ b/src/infra/database/prisma/services/FreightExpense.service.ts @@ -1,7 +1,10 @@ import { Injectable } from '@nestjs/common'; import { type GetFreightExpenseDTO } from 'domain/dto/repositories/getDataDtos/GetFreightExpenseDto'; -import { type FindAllFreightExpenseWhereRequestDTO } from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; +import { + type CountAllFreightExpenseWhereRequestDTO, + type FindAllFreightExpenseWhereRequestDTO, +} from 'domain/dto/repositories/whereDtos/FreightExpenseRepository.Dto'; import { type FreightExpense } from 'domain/entities/OrdersEntities/FreightExpense/FreightExpense'; import { type FreightExpenseRepository } from 'domain/repositories/FreightExpenseResitory'; @@ -11,11 +14,12 @@ import { FreightExpensePrismaDTO } from './prismaDTO/FreightExpensePrismaDto'; @Injectable() export class FreightExpensePrismaService implements FreightExpenseRepository { constructor(private prisma: PrismaService) {} - - async delFreightExpense(data: GetFreightExpenseDTO): Promise { - return FreightExpensePrismaDTO.PrismaToEntity( - await this.prisma.freightExpenses.delete({ where: { id: data.id } }), - ); + countFreightExpenseRepositoy( + parameters: CountAllFreightExpenseWhereRequestDTO, + ): Promise { + return this.prisma.freightExpenses.count({ + where: parameters.where ?? undefined, + }); } async getFreightExpense( @@ -29,6 +33,21 @@ export class FreightExpensePrismaService implements FreightExpenseRepository { }), ); } + + async findAllFreightExpense( + parameters: FindAllFreightExpenseWhereRequestDTO, + ): Promise { + const contracts = await this.prisma.freightExpenses.findMany({ + take: parameters.limit, + skip: parameters.offset, + where: parameters.where, + orderBy: parameters.sort, + }); + + return contracts.map(contract => + FreightExpensePrismaDTO.PrismaToEntity(contract), + ); + } async createFreightExpense( contract: FreightExpense, ): Promise { @@ -66,18 +85,40 @@ export class FreightExpensePrismaService implements FreightExpenseRepository { }), ); } - async findAllFreightExpense( - parameters: FindAllFreightExpenseWhereRequestDTO, - ): Promise { - const contracts = await this.prisma.freightExpenses.findMany({ - take: parameters.limit, - skip: parameters.offset, - where: parameters.where, - orderBy: parameters.sort, + updateManyFreightExpense(data: FreightExpense[]): Promise { + const expensesUpdated = this.prisma.$transaction(async tx => { + const promises = data.map(async expense => { + const expensePrisma = await tx.freightExpenses.update({ + data: FreightExpensePrismaDTO.EntityToPrismaUpdate(expense), + where: { id: expense.id }, + }); + + return FreightExpensePrismaDTO.PrismaToEntity(expensePrisma); + }); + + return Promise.all(promises); }); - return contracts.map(contract => - FreightExpensePrismaDTO.PrismaToEntity(contract), + return expensesUpdated; + } + async delFreightExpense(data: GetFreightExpenseDTO): Promise { + return FreightExpensePrismaDTO.PrismaToEntity( + await this.prisma.freightExpenses.delete({ where: { id: data.id } }), ); } + deleteManyFreightExpenses(ids: string[]): Promise { + const expensesDeleted = this.prisma.$transaction(async tx => { + const promises = ids.map(async expenseId => { + const expensePrisma = await tx.freightExpenses.delete({ + where: { id: expenseId }, + }); + + return FreightExpensePrismaDTO.PrismaToEntity(expensePrisma); + }); + + return Promise.all(promises); + }); + + return expensesDeleted; + } } diff --git a/src/infra/database/prisma/services/contract-outsouced-driver.service.ts b/src/infra/database/prisma/services/contract-outsouced-driver.service.ts index 1a2178d..8463ad0 100644 --- a/src/infra/database/prisma/services/contract-outsouced-driver.service.ts +++ b/src/infra/database/prisma/services/contract-outsouced-driver.service.ts @@ -73,7 +73,6 @@ export class ContractOutsourcedDriverPrismaService async updateManyContractOutsourcedDriver( data: ContractOutsourcedDriver[], ): Promise { - console.log(data); const contractsUpdated = await this.prisma.$transaction(async tx => { const promises = data.map(async contract => { const contractPrisma = await tx.contractOutsourcedDriver.update({ diff --git a/src/infra/graphql/entities/FreightExpenseGraphql/Args/WhereFreightExpenseArgs.ts b/src/infra/graphql/entities/FreightExpenseGraphql/Args/WhereFreightExpenseArgs.ts index 3eee5ec..103eca3 100644 --- a/src/infra/graphql/entities/FreightExpenseGraphql/Args/WhereFreightExpenseArgs.ts +++ b/src/infra/graphql/entities/FreightExpenseGraphql/Args/WhereFreightExpenseArgs.ts @@ -31,3 +31,11 @@ export class FreightExpenseWhereArgs { @IsOptional() sort?: FreightExpensesOrderByWithRelationInput; } + +@ArgsType() +export class FreightExpenseCountArgs { + @Field(() => FreightExpensesWhereInput, { nullable: true }) + @Type(() => FreightExpenseWhereArgs) + @IsOptional() + where?: FreightExpensesWhereInput; +} diff --git a/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.input.ts b/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.input.ts index 91d4cad..a68054a 100644 --- a/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.input.ts +++ b/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.input.ts @@ -1,6 +1,12 @@ import { Field, Float, InputType, PartialType } from '@nestjs/graphql'; -import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { + IsNotEmpty, + IsNumber, + IsOptional, + IsString, + IsUUID, +} from 'class-validator'; import { type IFreightExpense } from 'domain/entities/OrdersEntities/FreightExpense/FreightExpense'; @@ -30,3 +36,13 @@ export class FreightExpenseInput export class FreightExpenseUpdateInput extends PartialType( FreightExpenseInput, ) {} + +@InputType() +export class FreightExpenseUpdateManyInput extends PartialType( + FreightExpenseInput, +) { + @Field() + @IsUUID() + @IsNotEmpty() + id: string; +} diff --git a/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.resolver.ts b/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.resolver.ts index 946ed65..6d7dd7e 100644 --- a/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.resolver.ts +++ b/src/infra/graphql/entities/FreightExpenseGraphql/FreightExpense.resolver.ts @@ -11,8 +11,12 @@ import { GraphQLAuthGuard } from 'infra/guard/GraphQlAuthGuard'; import { DeletFreightExpenseInput } from './Args/DeleteFreightExpenseInput'; import { GetFreightExpenseArgs } from './Args/GetFreightExpenseArgs'; -import { FreightExpenseWhereArgs } from './Args/WhereFreightExpenseArgs'; import { + FreightExpenseCountArgs, + FreightExpenseWhereArgs, +} from './Args/WhereFreightExpenseArgs'; +import { + FreightExpenseUpdateManyInput, // eslint-disable-next-line @typescript-eslint/no-unused-vars FreightExpenseInput, FreightExpenseUpdateInput, @@ -25,10 +29,13 @@ import { FreightExpenseModel } from './FreightExpense.model'; @Resolver(() => FreightExpenseModel) export class FreightExpenseResolver { constructor(private freightExpenseUseCase: FreightExpenseUseCases) {} + + @Query(() => Number) + async countFreightExpenses(@Args() args: FreightExpenseCountArgs) { + return this.freightExpenseUseCase.countFreightExpense(args); + } @Query(() => FreightExpenseModel) async getFreightExpense(@Args() request: GetFreightExpenseArgs) { - console.log(request); - return this.freightExpenseUseCase.getFreightExpense({ id: request.id, }); @@ -58,11 +65,23 @@ export class FreightExpenseResolver { freightExpenseUpInput, ); } - + @Mutation(() => [FreightExpenseModel]) + async updateManyFreightExpenses( + @Args({ name: 'Data', type: () => [FreightExpenseUpdateManyInput] }) + data: FreightExpenseUpdateManyInput[], + ) { + return this.freightExpenseUseCase.updateManyFreightExpenses(data); + } @Mutation(() => FreightExpenseModel) async deleteFreightExpense( @Args('delData') request: DeletFreightExpenseInput, ) { return this.freightExpenseUseCase.deleteExpense(request); } + @Mutation(() => [FreightExpenseModel]) + async deleteManyFreightExpenses( + @Args({ name: 'ids', type: () => [String] }) ids: string[], + ) { + return this.freightExpenseUseCase.deleteManyFreightExpenses(ids); + } } diff --git a/src/infra/graphql/generated/schema.gql b/src/infra/graphql/generated/schema.gql index 2b12f8d..3a90ef4 100644 --- a/src/infra/graphql/generated/schema.gql +++ b/src/infra/graphql/generated/schema.gql @@ -495,6 +495,14 @@ input FreightExpenseUpdateInput { value: Float } +input FreightExpenseUpdateManyInput { + expenseName: String + id: String! + legalClientOrderId: String + physicalCustomerOrderId: String + value: Float +} + input FreightExpensesListRelationFilter { every: FreightExpensesWhereInput none: FreightExpensesWhereInput @@ -1393,6 +1401,7 @@ type Mutation { deleteFreightExpense(delData: DeletFreightExpenseInput!): FreightExpenseModel! deleteManyCarrierCompanies(deleteManyCarrierCompanies: [String!]!): [CarrierCompanyModel!]! deleteManyContractOutsourcedDriver(ids: [String!]!): [ContractOutsourcedDriverModel!]! + deleteManyFreightExpenses(ids: [String!]!): [FreightExpenseModel!]! deleteManyUsers(deleteManyUsers: [String!]!): [UserModel!]! deleteUser(id: String!): UserModel! login(loginData: AuthInput!): AuthModel! @@ -1406,6 +1415,7 @@ type Mutation { updateMaintenance(data: MaintenanceUpdateInput!, id: String!): MaintenanceModel! updateMaintenanceCompany(id: String!, maintenancecompanyInput: MaintenanceCompanyUpdateInput!): MaintenanceCompanyModel! updateManyCarrierCompanies(updateManyCarrierCompanies: [CarrierCompanyUpdateManyInput!]!): [CarrierCompanyModel!]! + updateManyFreightExpenses(Data: [FreightExpenseUpdateManyInput!]!): [FreightExpenseModel!]! updateManyUsers(updateManyUsers: [UserUpdateManyInput!]!): [UserModel!]! updateOrderProcessing(data: OrderProcessingUpdateInput!, id: String!): OrderProcessingModel! updateOutsourcedDriver(id: String!, outsourcedDriver: OutsourcedDriverUpdateInput!): OutsourcedDriverModel! @@ -2579,6 +2589,7 @@ input PhysicalCustomerWhereInput { } type Query { + countFreightExpenses(where: FreightExpensesWhereInput): Float! generateLegalClientCte(request: CtePdfLegalClientInput!): CtePDfModel! generatePhysicalCustomerCte(request: CtePdfPhysicalCustomerInput!): CtePDfModel! getAllCarrierCompany(limit: Int! = 25, offset: Int! = 0, sort: CarrierCompanyOrderByWithRelationInput, where: CarrierCompanyWhereInput): [CarrierCompanyModel!]