diff --git a/src/application/contracts/repositories/provider-user/index.ts b/src/application/contracts/repositories/provider-user/index.ts index 388c25e..e2f3e48 100644 --- a/src/application/contracts/repositories/provider-user/index.ts +++ b/src/application/contracts/repositories/provider-user/index.ts @@ -1,4 +1,5 @@ -export * from './insert-provider-user.repository' -export * from './save-token-provider-user.repository' export * from './find-provider-user-by-email.repository' export * from './find-provider-user-by-id.repository' +export * from './insert-provider-user.repository' +export * from './save-token-provider-user.repository' +export * from './update-provider-user.repository' diff --git a/src/application/contracts/repositories/provider-user/update-provider-user.repository.ts b/src/application/contracts/repositories/provider-user/update-provider-user.repository.ts new file mode 100644 index 0000000..6cae0b3 --- /dev/null +++ b/src/application/contracts/repositories/provider-user/update-provider-user.repository.ts @@ -0,0 +1,10 @@ +import { ProviderUserEntity } from '@/domain/entities' +import { UpdateProviderUserUseCaseParams } from '@/domain/usecases/provider-user' + +export interface UpdateProviderUserRepository { + updateProviderUser: (data: UpdateProviderUserRepositoryParams) => Promise +} + +export type UpdateProviderUserRepositoryParams = UpdateProviderUserUseCaseParams + +export type UpdateProviderUserRepositoryResult = ProviderUserEntity | Error diff --git a/src/application/services/provider-user/index.ts b/src/application/services/provider-user/index.ts index d7453fd..356ef3c 100644 --- a/src/application/services/provider-user/index.ts +++ b/src/application/services/provider-user/index.ts @@ -1,3 +1,4 @@ -export * from './register-provider-user.service' -export * from './login-provider-user.service' export * from './load-provider-user.service' +export * from './login-provider-user.service' +export * from './register-provider-user.service' +export * from './update-provider-user.service' diff --git a/src/application/services/provider-user/update-provider-user.service.ts b/src/application/services/provider-user/update-provider-user.service.ts new file mode 100644 index 0000000..8e77b21 --- /dev/null +++ b/src/application/services/provider-user/update-provider-user.service.ts @@ -0,0 +1,23 @@ +import { UpdateProviderUserRepository } from '@/application/contracts/repositories/provider-user' +import { + UpdateProviderUserUseCase, + UpdateProviderUserUseCaseParams, + UpdateProviderUserUseCaseResult +} from '@/domain/usecases/provider-user' +import { Inject, Injectable } from '@nestjs/common' + +@Injectable() +export class UpdateProviderUserService implements UpdateProviderUserUseCase { + constructor( + @Inject('UpdateProviderUserRepository') private readonly providerUserRepository: UpdateProviderUserRepository + ) {} + + public async execute(params: UpdateProviderUserUseCaseParams): Promise { + const updatedProviderUser = await this.providerUserRepository.updateProviderUser(params) + + if (updatedProviderUser instanceof Error) { + return updatedProviderUser + } + return updatedProviderUser + } +} diff --git a/src/domain/errors/index.ts b/src/domain/errors/index.ts index 9d02af5..e4787c1 100644 --- a/src/domain/errors/index.ts +++ b/src/domain/errors/index.ts @@ -1,7 +1,9 @@ export * from './already-exists.error' export * from './create-provider-user.error' +export * from './create-raffle.error' export * from './create-susbscriber-user.error' export * from './invalid-email.error' export * from './invalid-password.error' export * from './loading-login-user-provider-data.error' export * from './not-found.error' +export * from './update-provider-user.error' diff --git a/src/domain/errors/update-provider-user.error.ts b/src/domain/errors/update-provider-user.error.ts new file mode 100644 index 0000000..7ef2e53 --- /dev/null +++ b/src/domain/errors/update-provider-user.error.ts @@ -0,0 +1,6 @@ +export class UpdateProviderUserError extends Error { + constructor() { + super('Error when updating provider user') + this.name = 'UpdateProviderUserError' + } +} diff --git a/src/domain/usecases/provider-user/index.ts b/src/domain/usecases/provider-user/index.ts index ce592c2..05c15b7 100644 --- a/src/domain/usecases/provider-user/index.ts +++ b/src/domain/usecases/provider-user/index.ts @@ -1,3 +1,4 @@ -export * from './register-provider-user.usecase' -export * from './login-provider-user.usecase' export * from './load-provider-user.usecase' +export * from './login-provider-user.usecase' +export * from './register-provider-user.usecase' +export * from './update-provider-user.usecase' diff --git a/src/domain/usecases/provider-user/update-provider-user.usecase.ts b/src/domain/usecases/provider-user/update-provider-user.usecase.ts new file mode 100644 index 0000000..255dd51 --- /dev/null +++ b/src/domain/usecases/provider-user/update-provider-user.usecase.ts @@ -0,0 +1,25 @@ +import { Gender } from '@/domain/enums' +import { ProviderUserEntity } from '@/domain/entities' + +export interface UpdateProviderUserUseCase { + execute(params: UpdateProviderUserUseCaseParams): Promise +} + +export type UpdateProviderUserUseCaseParams = { + id?: string + name: string + email: string + password: string + gender?: Gender + dateOfBirth?: Date + phone?: string + address?: { + street: string + city: string + state: string + country: string + zipCode: string + } +} + +export type UpdateProviderUserUseCaseResult = ProviderUserEntity | Error diff --git a/src/infra/database/index.ts b/src/infra/database/index.ts index 38acbf6..b29bea9 100644 --- a/src/infra/database/index.ts +++ b/src/infra/database/index.ts @@ -1,3 +1,4 @@ export * from './provider-user.database' -export * from './subscriber-user.database' export * from './raffle.database' +export * from './subscriber-user.database' +export * from './update-provider-user.database' diff --git a/src/infra/database/provider-user.database.ts b/src/infra/database/provider-user.database.ts index b8de557..ad5a435 100644 --- a/src/infra/database/provider-user.database.ts +++ b/src/infra/database/provider-user.database.ts @@ -10,7 +10,10 @@ import { FindProviderUserByIdRepositoryResult, SaveTokenProviderUserRepository, SaveTokenProviderUserRepositoryParams, - SaveTokenProviderUserRepositoryResult + SaveTokenProviderUserRepositoryResult, + UpdateProviderUserRepository, + UpdateProviderUserRepositoryParams, + UpdateProviderUserRepositoryResult } from '@/application/contracts/repositories/provider-user' import { Injectable } from '@nestjs/common' import { PrismaService } from './config/prisma.config' @@ -21,7 +24,8 @@ export class ProviderUserDatabase CreateProviderUserRepository, FindProviderUserByEmailRepository, FindProviderUserByIdRepository, - SaveTokenProviderUserRepository + SaveTokenProviderUserRepository, + UpdateProviderUserRepository { constructor(private prisma: PrismaService) {} @@ -104,4 +108,33 @@ export class ProviderUserDatabase return true } + + async updateProviderUser(data: UpdateProviderUserRepositoryParams): Promise { + const { id, name, email, password, gender, dateOfBirth, phone, address } = data + + const optionalProps = { + ...(gender && { gender }), + ...(dateOfBirth && { dateOfBirth }), + ...(phone && { phone }), + ...(address && { address }) + } + + const updateData = { name, email, password, ...optionalProps } + + const updatedProviderUser = await this.prisma.providerUsers.update({ + where: { id }, + data: updateData + }) + + if (!updatedProviderUser) { + return new Error('Error when updating provider user') + } + + return { + id: updatedProviderUser.id, + name: updatedProviderUser.name, + email: updatedProviderUser.email, + password: updatedProviderUser.password + } + } } diff --git a/src/infra/database/update-provider-user.database.ts b/src/infra/database/update-provider-user.database.ts new file mode 100644 index 0000000..9120ba4 --- /dev/null +++ b/src/infra/database/update-provider-user.database.ts @@ -0,0 +1,41 @@ +import { + UpdateProviderUserRepository, + UpdateProviderUserRepositoryParams, + UpdateProviderUserRepositoryResult +} from '@/application/contracts/repositories/provider-user' +import { Injectable } from '@nestjs/common' +import { PrismaService } from './config/prisma.config' + +@Injectable() +export class UpdateProviderUserDatabase implements UpdateProviderUserRepository { + constructor(private prisma: PrismaService) {} + + async updateProviderUser(data: UpdateProviderUserRepositoryParams): Promise { + const { id, name, email, password, gender, dateOfBirth, phone, address } = data + + const optionalProps = { + ...(gender && { gender }), + ...(dateOfBirth && { dateOfBirth }), + ...(phone && { phone }), + ...(address && { address }) + } + + const updateData = { name, email, password, ...optionalProps } + + const updatedProviderUser = await this.prisma.providerUsers.update({ + where: { id }, + data: updateData + }) + + if (!updatedProviderUser) { + return new Error('Error when updating provider user') + } + + return { + id: updatedProviderUser.id, + name: updatedProviderUser.name, + email: updatedProviderUser.email, + password: updatedProviderUser.password + } + } +} diff --git a/src/main/modules/provider-user.module.ts b/src/main/modules/provider-user.module.ts index 1250711..dfd2752 100644 --- a/src/main/modules/provider-user.module.ts +++ b/src/main/modules/provider-user.module.ts @@ -27,6 +27,7 @@ import { AuthService } from '@/infra/external-services/auth' { provide: 'LoginProviderUserUseCase', useClass: LoginProviderUserService }, { provide: 'RegisterProviderUserUseCase', useClass: RegisterProviderUserService }, { provide: 'SaveTokenProviderUserRepository', useClass: ProviderUserDatabase }, + { provide: 'UpdateProviderUserRepository', useClass: ProviderUserDatabase }, PrismaService ] }) diff --git a/src/main/modules/update-provider-user.module.ts b/src/main/modules/update-provider-user.module.ts new file mode 100644 index 0000000..a84df5b --- /dev/null +++ b/src/main/modules/update-provider-user.module.ts @@ -0,0 +1,22 @@ +import { UpdateProviderUserService } from '@/application/services/provider-user/update-provider-user.service' +import { Module } from '@nestjs/common' +import { UpdateProviderUserDatabase } from '@/infra/database' +import { PrismaService } from '@/infra/database/config/prisma.config' +import { UpdateProviderUserController } from '@/presenter/controllers/provider-user' + +@Module({ + imports: [], + controllers: [UpdateProviderUserController], + providers: [ + { + provide: 'UpdateProviderUserRepository', + useClass: UpdateProviderUserDatabase + }, + { + provide: 'UpdateProviderUserUseCase', + useClass: UpdateProviderUserService + }, + PrismaService + ] +}) +export class UpdateProviderUserModule {} diff --git a/src/presenter/controllers/provider-user/index.ts b/src/presenter/controllers/provider-user/index.ts index cbb05dc..72106b6 100644 --- a/src/presenter/controllers/provider-user/index.ts +++ b/src/presenter/controllers/provider-user/index.ts @@ -1,3 +1,4 @@ -export * from './register-provider-user.controller' -export * from './login-provider-user.controller' export * from './load-provider-user.controller' +export * from './login-provider-user.controller' +export * from './register-provider-user.controller' +export * from './update-provider-user.controller' diff --git a/src/presenter/controllers/provider-user/update-provider-user.controller.ts b/src/presenter/controllers/provider-user/update-provider-user.controller.ts new file mode 100644 index 0000000..5e95291 --- /dev/null +++ b/src/presenter/controllers/provider-user/update-provider-user.controller.ts @@ -0,0 +1,31 @@ +import { UpdateProviderUserUseCase } from '@/domain/usecases/provider-user' +import { Body, Controller, Inject, Put, Res } from '@nestjs/common' + +@Controller('update/provider-user') +export class UpdateProviderUserController { + constructor( + @Inject('UpdateProviderUserUseCase') private readonly updateProviderUserService: UpdateProviderUserUseCase + ) {} + + @Put() + async handle( + @Body('name') name: string, + @Body('email') email: string, + @Body('password') password: string, + @Res() res: any + ): Promise { + const providerUser = await this.updateProviderUserService.execute({ + name, + email, + password + }) + + if (providerUser instanceof Error) { + return res.status(400).json({ + message: providerUser.message + }) + } + + return res.status(200).json({ providerUser }) + } +}