238 lines
7.7 KiB
PHP
238 lines
7.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\CredencialCliente;
|
|
use App\Models\CredencialProfesional;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Str;
|
|
|
|
class AuthController extends Controller
|
|
{
|
|
public function loginClienteWeb(Request $request): RedirectResponse
|
|
{
|
|
$request->validate([
|
|
'correo' => ['required', 'string'],
|
|
'contra' => ['required', 'string'],
|
|
]);
|
|
|
|
$correo = trim((string) $request->input('correo'));
|
|
$contra = (string) $request->input('contra');
|
|
|
|
$credencial = CredencialCliente::where('correo', $correo)->first();
|
|
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
|
return back()
|
|
->withInput($request->except('contra'))
|
|
->with('login_error', 'Usuario o contraseña incorrectos.');
|
|
}
|
|
|
|
$token = Str::random(64);
|
|
$credencial->token = $token;
|
|
$credencial->fecha_hora = now();
|
|
$credencial->save();
|
|
|
|
return back()->with('login_success', 'Login exitoso.');
|
|
}
|
|
|
|
public function loginPersonalWeb(Request $request): RedirectResponse
|
|
{
|
|
$request->validate([
|
|
'usuario' => ['required', 'string'],
|
|
'contra' => ['required', 'string'],
|
|
]);
|
|
|
|
$usuario = trim((string) $request->input('usuario'));
|
|
$contra = (string) $request->input('contra');
|
|
|
|
$credencial = CredencialProfesional::where('usuario', $usuario)->first();
|
|
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
|
return back()
|
|
->withInput($request->except('contra'))
|
|
->with('login_error', 'Usuario o contraseña incorrectos.');
|
|
}
|
|
|
|
$token = Str::random(64);
|
|
$credencial->token = $token;
|
|
$credencial->fecha_hora = now();
|
|
$credencial->save();
|
|
|
|
return back()->with('login_success', 'Login exitoso.');
|
|
}
|
|
|
|
public function loginCliente(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'correo' => ['required', 'string'],
|
|
'contra' => ['required', 'string'],
|
|
]);
|
|
|
|
$correo = trim((string) $request->input('correo'));
|
|
$contra = (string) $request->input('contra');
|
|
|
|
$credencial = CredencialCliente::where('correo', $correo)->first();
|
|
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Credenciales invalidas',
|
|
], 401);
|
|
}
|
|
|
|
$token = Str::random(64);
|
|
$credencial->token = $token;
|
|
$credencial->fecha_hora = now();
|
|
$credencial->save();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'data' => [
|
|
'tipo' => 'cliente',
|
|
'id_credencial' => $credencial->id,
|
|
'token' => $token,
|
|
],
|
|
'message' => 'Login de cliente exitoso',
|
|
], 200);
|
|
}
|
|
|
|
public function loginPersonal(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'usuario' => ['required', 'string'],
|
|
'contra' => ['required', 'string'],
|
|
]);
|
|
|
|
$usuario = trim((string) $request->input('usuario'));
|
|
$contra = (string) $request->input('contra');
|
|
|
|
$credencial = CredencialProfesional::where('usuario', $usuario)->first();
|
|
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Credenciales invalidas',
|
|
], 401);
|
|
}
|
|
|
|
$token = Str::random(64);
|
|
$credencial->token = $token;
|
|
$credencial->fecha_hora = now();
|
|
$credencial->save();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'data' => [
|
|
'tipo' => 'personal',
|
|
'rol' => $credencial->rol,
|
|
'id_credencial' => $credencial->id,
|
|
'token' => $token,
|
|
],
|
|
'message' => 'Login de personal exitoso',
|
|
], 200);
|
|
}
|
|
|
|
public function login(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'identificador' => ['required', 'string'],
|
|
'contra' => ['required', 'string'],
|
|
'tipo' => ['nullable', 'in:cliente,profesional'],
|
|
]);
|
|
|
|
$identificador = trim((string) $request->input('identificador'));
|
|
$contra = (string) $request->input('contra');
|
|
$tipo = $request->input('tipo');
|
|
|
|
$credencial = null;
|
|
$tipoDetectado = null;
|
|
|
|
if ($tipo === 'cliente') {
|
|
$credencial = CredencialCliente::where('correo', $identificador)->first();
|
|
$tipoDetectado = 'cliente';
|
|
} elseif ($tipo === 'profesional') {
|
|
$credencial = CredencialProfesional::where('usuario', $identificador)->first();
|
|
$tipoDetectado = 'personal';
|
|
} else {
|
|
$credencial = CredencialCliente::where('correo', $identificador)->first();
|
|
$tipoDetectado = $credencial ? 'cliente' : null;
|
|
|
|
if (!$credencial) {
|
|
$credencial = CredencialProfesional::where('usuario', $identificador)->first();
|
|
$tipoDetectado = $credencial ? 'personal' : null;
|
|
}
|
|
}
|
|
|
|
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Credenciales invalidas',
|
|
], 401);
|
|
}
|
|
|
|
$token = Str::random(64);
|
|
$credencial->token = $token;
|
|
$credencial->fecha_hora = now();
|
|
$credencial->save();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'data' => [
|
|
'tipo' => $tipoDetectado,
|
|
'rol' => $credencial instanceof CredencialProfesional ? $credencial->rol : null,
|
|
'id_credencial' => $credencial->id,
|
|
'token' => $token,
|
|
],
|
|
'message' => 'Login exitoso',
|
|
], 200);
|
|
}
|
|
|
|
public function logout(Request $request): JsonResponse
|
|
{
|
|
$token = (string) $request->input('token', '');
|
|
if ($token === '') {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Token requerido',
|
|
], 422);
|
|
}
|
|
|
|
$credencialCliente = CredencialCliente::where('token', $token)->first();
|
|
if ($credencialCliente) {
|
|
$credencialCliente->token = null;
|
|
$credencialCliente->fecha_hora = now();
|
|
$credencialCliente->save();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Logout exitoso',
|
|
], 200);
|
|
}
|
|
|
|
$credencialProfesional = CredencialProfesional::where('token', $token)->first();
|
|
if ($credencialProfesional) {
|
|
$credencialProfesional->token = null;
|
|
$credencialProfesional->fecha_hora = now();
|
|
$credencialProfesional->save();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Logout exitoso',
|
|
], 200);
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Token invalido',
|
|
], 401);
|
|
}
|
|
|
|
private function credencialValida(string $contraIngresada, string $contraGuardada): bool
|
|
{
|
|
if ($contraIngresada === $contraGuardada) {
|
|
return true;
|
|
}
|
|
|
|
return Hash::check($contraIngresada, $contraGuardada);
|
|
}
|
|
}
|