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_staff
eis_superuser
paraDjangoUser.objects.create_user
foi removida, pois esses campos agora são tratados internamente peloUserManager
ao herdar deAbstractBaseUser
. - No método
update
, a atualização direta dos camposis_active
,is_staff
eis_superuser
foi removida do modelo Django, pois eles são gerenciados peloPermissionsMixin
. - No método
_to_domain_user
, o acesso aos camposis_active
,is_staff
eis_superuser
foi ajustado para refletir a nova estrutura do modelo Django (AbstractBaseUser
ePermissionsMixin
). - No método
get_all
, a filtragem deis_superuser=False
foi 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
User
do Django refatorado:project/core/models/user.py
foi modificado para herdar deAbstractBaseUser
ePermissionsMixin
, removendo o campousername
e ajustando os campos de identificação. - Repositório de Usuário atualizado:
project/core/repositories/user_repository_impl.py
foi 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.py
eproject/core/api/v1/views/user.py
não precisaram de alterações diretas, pois já estavam desacoplados do modelo Django.