Casos de Uso CRUD Genéricos¶
Para promover a reutilização de código e manter a consistência em operações básicas de criação, leitura, atualização e exclusão (CRUD) para diferentes entidades, foram implementados casos de uso genéricos na camada de aplicação.
Esta seção detalha a estrutura e o uso desses casos de uso genéricos.
Visão Geral¶
Os casos de uso genéricos permitem realizar operações CRUD sem precisar reescrever a lógica básica para cada nova entidade. Eles operam em cima de interfaces de repositório genéricas e DTOs genéricos.
Componentes Chave¶
1. DTOs Genéricos (project/core/domain/use_cases/generic_use_cases.py
)¶
Os DTOs genéricos são classes de dados (@dataclass
) usadas para padronizar a entrada e saída dos casos de uso CRUD, garantindo que a comunicação entre as camadas seja desacoplada do framework.
GenericCreateRequest[T]
: Usado para requisições de criação, encapsulando a entidade a ser criada.GenericReadResponse[T]
: Usado para respostas de leitura, contendo a entidade lida.GenericListRequest
: Um DTO simples para requisições de listagem (pode ser estendido para incluir filtros e paginação).GenericListResponse[T]
: Usado para respostas de listagem, contendo uma lista de entidades.GenericUpdateRequest[T]
: Usado para requisições de atualização, incluindo o ID e os dados da entidade a ser atualizada.GenericDeleteRequest
: Usado para requisições de exclusão, contendo o ID da entidade.GenericSuccessResponse
: Uma resposta simples para indicar o sucesso de uma operação (ex: exclusão).
2. Interface GenericRepository[T]
(project/core/domain/data_access.py
)¶
A interface GenericRepository[T]
define o contrato para operações CRUD básicas que qualquer repositório de entidade deve implementar. T
é um TypeVar
que representa o tipo da entidade de domínio.
3. Casos de Uso Genéricos (project/core/domain/use_cases/generic_use_cases.py
)¶
Esses casos de uso implementam a lógica básica para cada operação CRUD, dependendo da GenericRepository
para a persistência.
-
CreateEntityUseCase[T]
: Recebe umaGenericCreateRequest
e usarepository.create()
. -
ListEntitiesUseCase[T]
: Recebe umaGenericListRequest
e usarepository.get_all()
. -
GetEntityByIdUseCase[T]
: Recebe umaGenericDeleteRequest
(que contém o ID) e usarepository.get_by_id()
. -
UpdateEntityUseCase[T]
: Recebe umaGenericUpdateRequest
e usarepository.update()
. -
DeleteEntityUseCase[T]
: Recebe umaGenericDeleteRequest
e usarepository.delete()
.
Adaptação de Casos de Uso Existentes (Ex: Usuário)¶
Os casos de uso específicos de User
foram refatorados para utilizar os casos de uso genéricos, promovendo a reutilização de código e mantendo a lógica de negócio específica do usuário onde é necessário.
-
UserRepository
(project/core/domain/data_access.py
): Foi modificado para estenderGenericRepository[User]
, implementando seus métodos (get_by_id
,get_all
,create
,update
,delete
) e mantendoget_user_by_email
como um método específico deUser
. -
DjangoUserRepository
(project/core/repositories/user_repository_impl.py
): A implementação concreta do repositório de usuário foi atualizada para implementar os métodos daGenericRepository
. -
CreateUserUseCase
(project/core/domain/use_cases/user_use_cases.py
): Agora utiliza uma instância deCreateEntityUseCase[DomainUser]
internamente para a lógica de criação base. -
ListUsersUseCase
(project/core/domain/use_cases/user_use_cases.py
): Agora utiliza uma instância deListEntitiesUseCase[DomainUser]
. -
GetUserByIdUseCase
(project/core/domain/use_cases/user_use_cases.py
): Agora utiliza uma instância deGetEntityByIdUseCase[DomainUser]
. -
ChangeUserPasswordUseCase
(project/core/domain/use_cases/user_use_cases.py
): Foi atualizado para usaruser_repository.get_by_id()
em vez deget_user_by_id()
.
Com essa estrutura, a criação de novas entidades e suas operações CRUD básicas se torna muito mais rápida e padronizada, exigindo apenas a definição da entidade de domínio, a implementação do repositório e a configuração dos serializadores e views.