This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Mobile\ConectaSusAb\Administracao;
|
||||
|
||||
use App\Enums\Intranet\Sistema;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Usuario;
|
||||
use App\Models\Cadastro\SujeitoAtencao\UsuarioHistoricoAcesso;
|
||||
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
|
||||
use App\Models\Geral\Configuracao;
|
||||
use App\Models\Intranet\Cliente;
|
||||
use App\Utils\Email;
|
||||
use App\Utils\Senha;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class AutenticacaoController extends Controller
|
||||
{
|
||||
public function login()
|
||||
{
|
||||
|
||||
$cliente = Cliente::where('sistema_id', Sistema::CONECTASUS)
|
||||
->where('link', request()->header('customer'))
|
||||
->first();
|
||||
|
||||
if ($cliente->ativo === false) {
|
||||
return response()->json(['message' => 'O cliente está com o status inativo.'], Response::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
$credentials = request(['usuario', 'senha']);
|
||||
|
||||
$usuario = Usuario::where('usuario', $credentials['usuario'])
|
||||
->first();
|
||||
|
||||
if (is_null($usuario)) {
|
||||
|
||||
return response()->json(['message' => 'Usuário e/ou senha incorreto(s).'], Response::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
if ($usuario->bloqueado) {
|
||||
return response()->json(['message' => 'Usuário bloqueado e sem acesso ao sistema.'], Response::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
if (!Hash::check($credentials['senha'], $usuario->senha)) {
|
||||
$configuracao = Configuracao::first();
|
||||
|
||||
$usuarioHistoricoAcesso = UsuarioHistoricoAcesso::where('usuario_id', $usuario->id)
|
||||
->where('ativo', true)
|
||||
->orderBy('created_at', 'desc')
|
||||
->take($configuracao->maximo_tentativa_login - 1)
|
||||
->get();
|
||||
|
||||
if (
|
||||
$usuarioHistoricoAcesso->count() === ($configuracao->maximo_tentativa_login - 1)
|
||||
&& $usuarioHistoricoAcesso->contains('sucesso', true) === false
|
||||
) {
|
||||
$usuario->update(['bloqueado' => true]);
|
||||
}
|
||||
|
||||
UsuarioHistoricoAcesso::create(
|
||||
[
|
||||
'usuario_id' => $usuario->id,
|
||||
'sucesso' => false
|
||||
]
|
||||
);
|
||||
|
||||
return response()->json(['message' => 'Usuário e/ou senha incorreto(s).'], Response::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
UsuarioHistoricoAcesso::create(
|
||||
[
|
||||
'usuario_id' => $usuario->id,
|
||||
'sucesso' => true,
|
||||
'ativo' => false,
|
||||
]
|
||||
);
|
||||
|
||||
UsuarioHistoricoAcesso::where('usuario_id', $usuario->id)->update(['ativo' => false]);
|
||||
|
||||
$token = auth()->login($usuario);
|
||||
|
||||
$usuario = auth()->user()->load([
|
||||
'lotacoes' => fn($q) => $q->where('ativo', true),
|
||||
'lotacoes.infraestrutura.centrosCusto.setor',
|
||||
'lotacoes.infraestrutura.unidade',
|
||||
'lotacoes.ocupacao',
|
||||
]);
|
||||
|
||||
$lotacoes = $usuario->lotacoes->sortBy('infraestrutura.unidade.nome_fantasia')->values()
|
||||
->map(function ($lotacao) {
|
||||
|
||||
$centrosCusto = $lotacao->infraestrutura->centrosCusto->sortBy('setor.nome')->values();
|
||||
|
||||
return [
|
||||
'lotacao_id' => $lotacao->id,
|
||||
'ocupacao_id' => $lotacao->ocupacao_id,
|
||||
'ocupacao' => $lotacao->ocupacao->toArray(),
|
||||
'infraestrutura' => $centrosCusto->toArray(),
|
||||
'unidade_id' => $lotacao->infraestrutura->unidade->id,
|
||||
'unidade_nome_fantasia' => $lotacao->infraestrutura->unidade->nome_fantasia,
|
||||
'unidade_cnes' => $lotacao->infraestrutura->unidade->cnes,
|
||||
];
|
||||
})
|
||||
->toArray();
|
||||
|
||||
$usuario = $usuario->toArray();
|
||||
|
||||
$response = [
|
||||
'expiration' => time() + 60 * auth()->factory()->getTTL(),
|
||||
'token' => $token,
|
||||
'usuario' => [
|
||||
'id' => $usuario['id'],
|
||||
'usuario' => $usuario['usuario'],
|
||||
'bloqueado' => $usuario['bloqueado'],
|
||||
'lotacoes' => $lotacoes
|
||||
]
|
||||
];
|
||||
|
||||
return response()->json($response, Response::HTTP_OK);
|
||||
}
|
||||
|
||||
public function refresh()
|
||||
{
|
||||
|
||||
$usuario = auth()->user();
|
||||
|
||||
if ($usuario->troca_senha) {
|
||||
return response()->json(['error' => 'Você deve alterar sua senha antes de prosseguir.'], Response::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
$lotacao = Lotacao::with(['usuario', 'ocupacao', 'papeis.permissoes.funcionalidade.modulo', 'permissoes.funcionalidade.modulo'])
|
||||
->where('id', request()->lotacao_id)
|
||||
->where('ativo', true)
|
||||
->firstOrFail();
|
||||
|
||||
$centroCusto = CentroCusto::with(['setor', 'salas'])
|
||||
->where('infraestrutura_id', request()->centro_custo_id)
|
||||
->firstOrFail();
|
||||
|
||||
$token = auth()->claims([
|
||||
'lotacao_id' => $lotacao->id,
|
||||
'centro_custo_id' => $centroCusto->id,
|
||||
'unidade_id' => $centroCusto->infraestrutura->unidade_id,
|
||||
'infraestrutura_id' => $centroCusto->infraestrutura_id,
|
||||
]);
|
||||
|
||||
$permissoes = collect();
|
||||
|
||||
foreach ($lotacao->papeis as $papel) {
|
||||
|
||||
foreach ($papel->permissoes as $permissao) {
|
||||
|
||||
$permissoes->push($permissao);
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'expiration' => time() + 60 * auth()->factory()->getTTL(),
|
||||
'token' => $token->refresh(),
|
||||
'permissoes' => $permissoes->merge($lotacao->permissoes),
|
||||
]);
|
||||
}
|
||||
|
||||
public function recuperarSenha(RecuperacaoSenhaRequest $request)
|
||||
{
|
||||
$usuario = Usuario::where('email', $request->email)
|
||||
->whereHas('cidadao', function ($query) use ($request) {
|
||||
$query->where('cpf', $request->cpf);
|
||||
})
|
||||
->first();
|
||||
|
||||
if (is_null($usuario)) {
|
||||
|
||||
return response()->json([
|
||||
'message' => 'A informação inserida não está correta, tente novamente.'
|
||||
], Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
if ($usuario) {
|
||||
$senha = Senha::gerar();
|
||||
|
||||
$params = [
|
||||
'senha' => $senha,
|
||||
'troca_senha' => true,
|
||||
];
|
||||
|
||||
$usuario->update($params);
|
||||
|
||||
$object = new \stdClass();
|
||||
$object->user = $usuario->usuario;
|
||||
$object->password = $senha;
|
||||
$object->cliente = $request->header('customer');
|
||||
|
||||
Email::enviar(strtolower($usuario->email), new UsuarioLogin($object));
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Usuário e senha enviados para o e-mail ' . $usuario->email
|
||||
], Response::HTTP_OK);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user