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 umaGenericCreateRequeste usarepository.create(). -
ListEntitiesUseCase[T]: Recebe umaGenericListRequeste usarepository.get_all(). -
GetEntityByIdUseCase[T]: Recebe umaGenericDeleteRequest(que contém o ID) e usarepository.get_by_id(). -
UpdateEntityUseCase[T]: Recebe umaGenericUpdateRequeste usarepository.update(). -
DeleteEntityUseCase[T]: Recebe umaGenericDeleteRequeste 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_emailcomo 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.