Refatorando o Modelo de Usuário do Django para uma Entidade mais Leve¶
Esta seção detalha o processo de refatoração do modelo User do Django para que ele seja uma entidade de persistência mais leve, com menos acoplamento ao framework Django e mais alinhada com a camada de Domínio da Arquitetura Limpa.
1. Contexto e Justificativa¶
Originalmente, o modelo User do Django herda de AbstractUser, o que traz consigo muitas funcionalidades e dependências específicas do framework (permissões, grupos, etc.). Embora conveniente, isso pode levar a um forte acoplamento da camada de Domínio à Infraestrutura (Django). O objetivo desta refatoração é isolar a entidade de Domínio User e fazer com que o modelo Django atue apenas como um adaptador de persistência.
2. Abordagem da Refatoração¶
a. Modelo User do Django (project/core/models/user.py)¶
O modelo User foi simplificado para herdar de AbstractBaseUser e PermissionsMixin. O campo username foi removido, e o USERNAME_FIELD foi definido como email. Isso o torna mais flexível e menos acoplado às suposições padrão do AbstractUser.
b. Entidade de Domínio User (project/core/domain/entities/user.py)¶
Esta entidade já foi criada para ser agnóstica a frameworks e não exigiu alterações. Ela contém apenas os atributos e métodos de negócio essenciais, sem qualquer dependência do Django.
c. Repositório de Usuário (project/core/repositories/user_repository_impl.py)¶
O DjangoUserRepository foi atualizado para lidar com as mudanças no modelo Django User e para garantir que o mapeamento entre a entidade de Domínio User e o modelo de persistência do Django ocorra corretamente.
Principais alterações:
- No método
create, a passagem deis_active,is_staffeis_superuserparaDjangoUser.objects.create_userfoi removida, pois esses campos agora são tratados internamente peloUserManagerao herdar deAbstractBaseUser. - No método
update, a atualização direta dos camposis_active,is_staffeis_superuserfoi removida do modelo Django, pois eles são gerenciados peloPermissionsMixin. - No método
_to_domain_user, o acesso aos camposis_active,is_staffeis_superuserfoi ajustado para refletir a nova estrutura do modelo Django (AbstractBaseUserePermissionsMixin). - No método
get_all, a filtragem deis_superuser=Falsefoi alterada paraexclude(is_superuser=True), que é a forma apropriada de filtrar superusuários com oPermissionsMixin.
d. Impacto em Casos de Uso, Serializers e Views¶
Não houve impacto direto nas camadas de Aplicação (Casos de Uso) e Apresentação (Serializers e Views), pois elas já interagem com a entidade de Domínio User e seus DTOs, e não diretamente com o modelo Django. Isso demonstra o sucesso do desacoplamento da Arquitetura Limpa.
3. Passos da Implementação (Concluídos)¶
- Modelo
Userdo Django refatorado:project/core/models/user.pyfoi modificado para herdar deAbstractBaseUserePermissionsMixin, removendo o campousernamee ajustando os campos de identificação. - Repositório de Usuário atualizado:
project/core/repositories/user_repository_impl.pyfoi ajustado para lidar com as mudanças no modelo Django, garantindo o mapeamento correto e a interação com as propriedades de permissão. - Verificação de Serializers e Views: Confirmado que
project/core/api/v1/serializers/user.pyeproject/core/api/v1/views/user.pynão precisaram de alterações diretas, pois já estavam desacoplados do modelo Django.