package br.com.ec.domain.service.usuario.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.model.UsuarioPerfil;
import br.com.ec.domain.service.parametro.ParametroService;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.domain.shared.CriptografiaMD5;
import br.com.ec.infrastructure.repository.UsuarioRepository;
@Service
public class UsuarioServiceImpl
extends AbstractService
<Usuario
> implements UsuarioService
{
private static final String USUARIO_INFORMADO_NAO_EXISTE =
"Usuário informado não existe";
private final UsuarioRepository usuarioRepository
;
private ParametroService parametroService
;
@Autowired
public UsuarioServiceImpl
(ParametroService parametroService, UsuarioRepository usuarioRepository, Validador validador
) {
super(validador
);
this.
parametroService = parametroService
;
this.
usuarioRepository = usuarioRepository
;
}
@
Override
protected GenericRepository
<Usuario
> getRepository
() {
return this.
usuarioRepository;
}
@
Override
protected void regrasNegocioCadastrar
(Usuario usuario
) {
usuario.
setSenha(CriptografiaMD5.
criptografaSenha(usuario.
getSenha()));
usuario.
setAtivo(true);
}
@
Override
public Usuario efetuarLogin
(Usuario usuario
) {
if (VerificadorUtil.
naoEstaNuloOuVazio(usuario.
getSenha())) {
if (usuario.
getSenha().
length() < 6) {
throw new RuntimeException("Senha inválida");
}
} else {
throw new RuntimeException("Senha inválida");
}
try {
criptografarSenhaUsuarioEmMD5
(usuario
);
Usuario usuarioConsultado = usuarioRepository.
consultarPorLogin(usuario
);
if (VerificadorUtil.
naoEstaNulo(usuarioConsultado
)) {
usuarioRepository.
atualizarDataUltimoAcesso(usuarioConsultado
);
}
usuarioConsultado.
setParametros(parametroService.
listarParametrosAtivos());
return usuarioConsultado
;
} catch (Exception e
) {
throw new RuntimeException(USUARIO_INFORMADO_NAO_EXISTE
);
}
}
private void criptografarSenhaUsuarioEmMD5
(Usuario usuario
) {
usuario.
setSenha(CriptografiaMD5.
criptografaSenha(usuario.
getSenha()));
}
@
Override
public Usuario consultarUsuarioPorSenha
(String senha
) {
try {
senha = CriptografiaMD5.
criptografaSenha(senha
);
return usuarioRepository.
consultarUsuarioPorSenha(senha
);
} catch (Exception e
) {
throw new RuntimeException(USUARIO_INFORMADO_NAO_EXISTE
);
}
}
@
Override
public Usuario consultarUsuarioPorPessoa
(Pessoa pessoa
) {
return usuarioRepository.
consultarUsuarioPorPessoa(pessoa
);
}
@
Override
public Usuario detalhar
(Usuario usuario
) {
return usuarioRepository.
detalhar(usuario
);
}
@
Override
public void alterarSenhaUsuario
(Usuario usuario
) {
if (VerificadorUtil.
estaNuloOuVazio(usuario.
getSenha())) {
throw new NegocioException
("Senha inválida");
}
if (usuario.
getSenha().
length() < 6) {
throw new NegocioException
("A senha deve ter 6 dígitos, no mínimo");
}
usuario.
setSenha(CriptografiaMD5.
criptografaSenha(usuario.
getSenha()));
if (senhaJaExiste
(usuario.
getSenha())) {
throw new NegocioException
("Senha inválida, tente outra");
}
usuarioRepository.
alterarSenha(usuario
);
}
@
Override
public Boolean senhaJaExiste
(String senha
) {
return usuarioRepository.
obterQuantidadeUsuarioComSenha(senha
) > 0 ? true :
false;
}
@
Override
public void naoPermitirPerfilLoja
(Usuario usuario
) {
for (UsuarioPerfil usuarioPerfil : usuario.
getPerfis()) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_LOJA_9)) {
throw new NegocioException
("Perfil inválido para a operação! Favor informar outro usuário com permissão");
}
}
}
}