Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Padrão para carregar objetos de acordo com o "perfil" do usuário

Olá, na minha aplicação em algumas telas eu tenho que carregar algumas coleções de acordo com o papel que o usuário logado desempenha no sistema, por exemplo na tela inicial eu carrego os processos: se o usuário é parte devo trazer todos os processos onde ele é parte ou parte contrária, se o usuário é advogado devo trazer todos os processos onde ele é advogado, se é admin devo trazer todos os processos, e toda hora me vejo fazendo códigos do tipo:

if(usuario.getTipo().equals(TIPO_USUARIO.ADM){
//carrega coleção de um jeito
}else if(usuario.getTipo().equals(TIPO_USUARIO.ADV){

//carrega coleção de outro jeito
}else{
//carrega coleção de um jeito 2
}

e esse tipo de código está espalhado, como por exemplo para carregar as cobranças: quando o usuario for parte carrega apanas suas cobranças, quando for adm carrega cobranças de todos os usuários,etc...

existe algum padrão para este tipo de caso?

3 respostas

Fala ai Ricardo, de boa ?

Algo que pode fazer é usar por exemplo um strategy para resolver isso.

Cada tipo saber fazer sua busca parece algo bem coerente, ai você reduz o numero de ifs e cada lógica fica bem isolada.

Tipo tipo = usuario.getTipo();

// faz algo do tipo:
Collection colecao = tipo.carrega();

Percebe que dessa forma, quando você for criar um novo tipo esse seu código jamais será mexido.

Oi Mateus, eu até tinha pensado em fazer algo assim, mas o problema é que eu uso JPA, não sei se o mercado adota esta prática, mas eu não acho tão elegante fazer:

@Entity
Class Mediador(){
@Inject
CasoRepository casoRepository;

public List<Casos> buscarCasos(){
return casoRepository.buscarCasosMediador(this);
}

}

aqui o primeiro problema é injetar esse repositório na classe de entidade, quando testei isso a um tempo atrás não funcionava com anotação, tinha que fazer um lookup feioso

problema 2, é boa prática eu ter repositórios,consultas JPA dentro de classes de entidade?

solução!

Fala ai Ricardo,

Cara não é o melhor dos mundos, pois você está ferindo alguns principios do mundo O.O. como o principio da responsabilidade única.

Tem várias soluções legais para resolver isso.

Acredito que pode manter a busca no DAO mesmo, que faz sentido pela responsabilidade da classe, e na hora de pegar os dados, você executa a busca da lista que deseja passando o tipo para dentro dela.