Add login-google, admin/errors routes and Google login methods
This commit is contained in:
@@ -592,6 +592,138 @@ class AuthController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
// ══════════════════════════════════════════════
|
||||
// GOOGLE LOGIN (Credential-based lookup)
|
||||
// ══════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* GET /v2/auth/passenger/login-google
|
||||
* Replaces: auth/loginFromGooglePassenger.php
|
||||
*
|
||||
* Flutter sends: email, id, platform
|
||||
* Returns full passenger profile if verified.
|
||||
*/
|
||||
public function passengerLoginGoogle(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|string',
|
||||
'id' => 'required|string',
|
||||
'platform' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$email = $request->input('email');
|
||||
$id = $request->input('id');
|
||||
$platform = $request->input('platform', 'unknown');
|
||||
$appName = $request->input('appName', 'unknown');
|
||||
|
||||
// Encrypt email for DB lookup (V1 stores emails encrypted)
|
||||
$encryptedEmail = $this->encryption->encrypt($email);
|
||||
|
||||
// Complex query matching V1 exactly
|
||||
$row = DB::connection('primary')
|
||||
->table('passengers as p')
|
||||
->leftJoin('phone_verification_passenger', 'phone_verification_passenger.phone_number', '=', 'p.phone')
|
||||
->leftJoin('invitesToPassengers', 'invitesToPassengers.inviterPassengerPhone', '=', 'p.phone')
|
||||
->leftJoin('promos', 'promos.passengerID', '=', 'p.id')
|
||||
->select([
|
||||
'p.id', 'p.phone', 'p.email', 'p.gender', 'p.status',
|
||||
'p.birthdate', 'p.site', 'p.first_name', 'p.last_name',
|
||||
'p.sosPhone', 'p.education', 'p.employmentType', 'p.maritalStatus',
|
||||
'p.created_at', 'p.updated_at',
|
||||
'phone_verification_passenger.verified',
|
||||
'invitesToPassengers.isInstall',
|
||||
'invitesToPassengers.inviteCode',
|
||||
'invitesToPassengers.isGiftToken',
|
||||
'promos.promo_code as promo',
|
||||
'promos.amount as discount',
|
||||
'promos.validity_end_date as validity',
|
||||
])
|
||||
->selectSub(function ($query) use ($platform, $appName) {
|
||||
$query->from('packageInfo')
|
||||
->select('version')
|
||||
->where('platform', $platform)
|
||||
->where('appName', $appName)
|
||||
->limit(1);
|
||||
}, 'package')
|
||||
->where('p.email', $encryptedEmail)
|
||||
->where('p.id', $id)
|
||||
->where('phone_verification_passenger.verified', '1')
|
||||
->first();
|
||||
|
||||
if (!$row) {
|
||||
return response()->json([
|
||||
'status' => 'Failure',
|
||||
'data' => 'User does not exist.',
|
||||
]);
|
||||
}
|
||||
|
||||
// Decrypt sensitive fields (matching V1 behavior)
|
||||
$decryptedFields = [
|
||||
'phone', 'email', 'gender', 'birthdate', 'site',
|
||||
'first_name', 'last_name', 'sosPhone', 'education',
|
||||
'employmentType', 'maritalStatus',
|
||||
];
|
||||
|
||||
$data = (array) $row;
|
||||
foreach ($decryptedFields as $field) {
|
||||
if (!empty($data[$field])) {
|
||||
$data[$field] = $this->encryption->decrypt($data[$field]);
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'count' => 1,
|
||||
'data' => [$data],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /v2/auth/driver/login-google
|
||||
* Replaces: auth/captin/loginFromGoogle.php
|
||||
*/
|
||||
public function driverLoginGoogle(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|string',
|
||||
'id' => 'required|string',
|
||||
]);
|
||||
|
||||
$encryptedEmail = $this->encryption->encrypt($request->input('email'));
|
||||
|
||||
$driver = DB::connection('primary')
|
||||
->table('captain')
|
||||
->where('email', $encryptedEmail)
|
||||
->where('id', $request->input('id'))
|
||||
->first();
|
||||
|
||||
if (!$driver) {
|
||||
return response()->json([
|
||||
'status' => 'Failure',
|
||||
'data' => 'User does not exist.',
|
||||
]);
|
||||
}
|
||||
|
||||
$data = (array) $driver;
|
||||
$decryptedFields = [
|
||||
'phone', 'email', 'gender', 'birthdate',
|
||||
'first_name', 'last_name', 'national_number',
|
||||
'name_arabic', 'address',
|
||||
];
|
||||
|
||||
foreach ($decryptedFields as $field) {
|
||||
if (!empty($data[$field])) {
|
||||
$data[$field] = $this->encryption->decrypt($data[$field]);
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'count' => 1,
|
||||
'data' => [$data],
|
||||
]);
|
||||
}
|
||||
|
||||
// ══════════════════════════════════════════════
|
||||
// HELPERS
|
||||
// ══════════════════════════════════════════════
|
||||
|
||||
@@ -268,4 +268,24 @@ class MiscController extends Controller
|
||||
]);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* POST /v2/admin/errors
|
||||
* Accepts client-side error reports from Flutter apps.
|
||||
* Public endpoint (no auth required) — just logs the error.
|
||||
*/
|
||||
public function logClientError(Request $request): JsonResponse
|
||||
{
|
||||
$body = $request->getContent();
|
||||
|
||||
\Illuminate\Support\Facades\Log::channel('single')->warning('Client Error Report', [
|
||||
'ip' => $request->ip(),
|
||||
'body' => substr($body, 0, 2000), // Limit to 2KB
|
||||
'user_agent' => $request->userAgent(),
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Error logged',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user