Applied manual JWT check and restored all driver fields2
This commit is contained in:
@@ -438,8 +438,8 @@ class AuthController extends Controller
|
||||
$driver['year'] = $driver['year'] ?? '';
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [$driver]
|
||||
'status' => 'Success',
|
||||
'message' => [$driver]
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -472,7 +472,7 @@ class AuthController extends Controller
|
||||
->first();
|
||||
|
||||
if (!$row) {
|
||||
return response()->json(['status' => 'Failure', 'data' => 'User does not exist.']);
|
||||
return response()->json(['status' => 'Failure', 'message' => 'User does not exist.']);
|
||||
}
|
||||
|
||||
$driver = (array) $row;
|
||||
@@ -499,7 +499,7 @@ class AuthController extends Controller
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'count' => 1,
|
||||
'data' => [$driver]
|
||||
'message' => [$driver]
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -597,7 +597,8 @@ class AuthController extends Controller
|
||||
'jwt' => $jwt,
|
||||
'expires_in' => 14400,
|
||||
'api_key' => $driver->api_key,
|
||||
'api_secret' => $driver->api_secret
|
||||
'api_secret' => $driver->api_secret,
|
||||
'message' => [$driver] // Add driver data in message for unified access
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,10 +20,11 @@ class InviteController extends Controller
|
||||
/** POST /v2/invites/driver */
|
||||
public function inviteDriver(Request $request): JsonResponse
|
||||
{
|
||||
if (!$request->has(['driverId', 'inviterDriverPhone'])) {
|
||||
if (!$request->filled('driverId') || !$request->filled('inviterDriverPhone')) {
|
||||
\Log::warning('Invite driver parameters missing: ' . json_encode($request->all()));
|
||||
return response()->json([
|
||||
'status' => 'failure',
|
||||
'message' => 'Missing required parameters'
|
||||
'message' => 'Missing required parameters: driverId or inviterDriverPhone'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ class NotificationController extends Controller
|
||||
->get();
|
||||
}
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $notifications, 'message' => $notifications]);
|
||||
return response()->json(['status' => 'success', 'message' => $notifications]);
|
||||
}
|
||||
|
||||
/** PUT /v2/notifications/{id}/read */
|
||||
@@ -109,7 +109,7 @@ class NotificationController extends Controller
|
||||
}
|
||||
|
||||
if ($userType === 'driver') {
|
||||
DB::connection('primary')->table('captainToken')
|
||||
DB::connection('primary')->table('driverToken')
|
||||
->updateOrInsert(
|
||||
['captain_id' => $userId],
|
||||
[
|
||||
@@ -144,7 +144,7 @@ class NotificationController extends Controller
|
||||
}
|
||||
|
||||
if ($userType === 'driver') {
|
||||
$data = DB::connection('primary')->table('captainToken')
|
||||
$data = DB::connection('primary')->table('driverToken')
|
||||
->where('captain_id', $userId)
|
||||
->first();
|
||||
} else {
|
||||
@@ -159,7 +159,7 @@ class NotificationController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'message' => [
|
||||
'token' => $data->token,
|
||||
'fingerPrint' => $data->fingerPrint ?? null,
|
||||
]
|
||||
|
||||
@@ -46,17 +46,15 @@ class ProfileController extends Controller
|
||||
$data = $this->enc->decryptFields($data, Passenger::ENCRYPTED_FIELDS);
|
||||
unset($data['password'], $data['api_secret']);
|
||||
|
||||
// Attach wallet balance
|
||||
$wallet = DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)->first();
|
||||
$data['wallet_balance'] = $wallet->balance ?? '0.00';
|
||||
// Note: Wallet balance is managed by the dedicated payment server.
|
||||
// Flutter fetches it directly via the wallet JWT token.
|
||||
|
||||
// Attach rating
|
||||
$rating = DB::connection('primary')->table('ratingPassenger')
|
||||
->where('passenger_id', $id)->avg('rating');
|
||||
$data['rating'] = round($rating ?? 5.0, 2);
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $data]);
|
||||
return response()->json(['status' => 'success', 'message' => $data]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,16 +87,14 @@ class ProfileController extends Controller
|
||||
// Rating
|
||||
$data['rating'] = $driver->getAverageRating();
|
||||
|
||||
// Wallet Balance
|
||||
$wallet = DB::connection('primary')->table('captain_wallet')
|
||||
->where('captain_id', $id)->first();
|
||||
$data['wallet_balance'] = $wallet->balance ?? '0.00';
|
||||
// Note: Wallet balance is managed by the dedicated payment server.
|
||||
// Flutter fetches it directly via the wallet JWT token.
|
||||
|
||||
// Ride count
|
||||
$data['ride_count'] = DB::connection('ride')->table('ride')
|
||||
->where('driver_id', $id)->where('status', 'finish')->count();
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $data]);
|
||||
return response()->json(['status' => 'success', 'message' => $data]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -34,7 +34,7 @@ class PromoController extends Controller
|
||||
})
|
||||
->get();
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $promos, 'message' => $promos]);
|
||||
return response()->json(['status' => 'success', 'message' => $promos]);
|
||||
}
|
||||
|
||||
/** GET /v2/promos/check?code=XXX */
|
||||
|
||||
@@ -123,7 +123,7 @@ class RatingController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'message' => [
|
||||
'average' => round($avg ?? 5.0, 2),
|
||||
'count' => $ratings->count(),
|
||||
'ratings' => $ratings,
|
||||
|
||||
@@ -164,7 +164,7 @@ class RideController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => $insertedId,
|
||||
'message' => $insertedId,
|
||||
], 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
@@ -181,6 +181,7 @@ class RideController extends Controller
|
||||
public function accept(Request $request, int $rideId): JsonResponse
|
||||
{
|
||||
$driverId = $request->attributes->get('_jwt_user_id');
|
||||
$userType = $request->attributes->get('_jwt_user_type');
|
||||
$status = $request->input('status', 'Apply'); // Allow dynamic status but default to Apply
|
||||
|
||||
DB::connection('ride')->beginTransaction();
|
||||
@@ -291,8 +292,7 @@ class RideController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Ride Accepted',
|
||||
'data' => $driverInfo
|
||||
'message' => $driverInfo
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
@@ -576,7 +576,7 @@ class RideController extends Controller
|
||||
if (!$ride) {
|
||||
return response()->json(['status' => 'failure', 'message' => 'Ride not found or access denied'], 404);
|
||||
}
|
||||
return response()->json(['status' => 'success', 'data' => $ride]);
|
||||
return response()->json(['status' => 'success', 'message' => $ride]);
|
||||
}
|
||||
|
||||
public function active(Request $request): JsonResponse
|
||||
@@ -595,7 +595,7 @@ class RideController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => $ride,
|
||||
'message' => $ride,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -625,6 +625,6 @@ class RideController extends Controller
|
||||
return $ride;
|
||||
});
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $rides, 'message' => $rides]);
|
||||
return response()->json(['status' => 'success', 'message' => $rides]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ class TrackingController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'message' => [
|
||||
'latitude' => $location->latitude,
|
||||
'longitude' => $location->longitude,
|
||||
'heading' => $location->heading,
|
||||
@@ -88,7 +88,7 @@ class TrackingController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'message' => [
|
||||
'latitude' => $location->latitude ?? null,
|
||||
'longitude' => $location->longitude ?? null,
|
||||
'heading' => $location->heading ?? null,
|
||||
@@ -172,7 +172,7 @@ class TrackingController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => $finalData
|
||||
'message' => $finalData
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ class TrackingController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'message' => [
|
||||
'total_rides' => $totalRides,
|
||||
'today_rides' => $todayRides,
|
||||
'today_earnings' => round($todayEarnings, 2),
|
||||
|
||||
@@ -1,193 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Wallet Controller
|
||||
* Replaces: ride/passenger/**
|
||||
* متحكم المحفظة (Wallet Controller)
|
||||
*
|
||||
* الغرض من الملف:
|
||||
* إدارة العمليات المالية للركاب، بما في ذلك عرض الرصيد، شحن المحفظة، وعرض سجل العمليات.
|
||||
*
|
||||
* كيفية العمل:
|
||||
* 1. يتواصل مع جداول (passengerWallet) و (payments) لجلب البيانات المالية.
|
||||
* 2. يسمح للركاب بإضافة أموال لمحفظتهم وتحديث رصيدهم.
|
||||
* 3. يعرض قائمة بالمعاملات المالية السابقة (Transactions).
|
||||
*/
|
||||
class WalletController extends Controller
|
||||
{
|
||||
/** GET /v2/wallet/passenger */
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
$wallet = DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)->first();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => $wallet ?? ['passenger_id' => $id, 'balance' => '0.00'],
|
||||
]);
|
||||
}
|
||||
|
||||
/** GET /v2/wallet/passenger/balance */
|
||||
public function balance(Request $request): JsonResponse
|
||||
{
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
$userType = $request->attributes->get('_jwt_user_type');
|
||||
|
||||
if ($userType === 'driver') {
|
||||
$bal = DB::connection('primary')->table('captain_wallet')
|
||||
->where('captain_id', $id)->value('balance') ?? '0.00';
|
||||
} else {
|
||||
$bal = DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)->value('balance') ?? '0.00';
|
||||
}
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => ['balance' => $bal]]);
|
||||
}
|
||||
|
||||
/** GET /v2/wallet/driver/balance (Explicit) */
|
||||
public function driverBalance(Request $request): JsonResponse
|
||||
{
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
$bal = DB::connection('primary')->table('captain_wallet')
|
||||
->where('captain_id', $id)->value('balance') ?? '0.00';
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => ['balance' => $bal]]);
|
||||
}
|
||||
|
||||
/** POST /v2/wallet/passenger */
|
||||
public function addFunds(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'amount' => 'required|numeric|min:0.01',
|
||||
'payment_method' => 'required|string',
|
||||
]);
|
||||
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
$userType = $request->attributes->get('_jwt_user_type');
|
||||
|
||||
if ($userType !== 'passenger') {
|
||||
return response()->json(['status' => 'failure', 'message' => 'Only passengers can add funds manually'], 403);
|
||||
}
|
||||
|
||||
DB::connection('primary')->beginTransaction();
|
||||
try {
|
||||
$wallet = DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)->lockForUpdate()->first();
|
||||
|
||||
if ($wallet) {
|
||||
DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)
|
||||
->increment('balance', $request->input('amount'));
|
||||
} else {
|
||||
DB::connection('primary')->table('passengerWallet')->insert([
|
||||
'passenger_id' => $id,
|
||||
'balance' => $request->input('amount'),
|
||||
]);
|
||||
}
|
||||
|
||||
// Record transaction
|
||||
DB::connection('primary')->table('passengerWalletTransactions')->insert([
|
||||
'passenger_id' => $id,
|
||||
'amount' => $request->input('amount'),
|
||||
'type' => 'credit',
|
||||
'payment_method' => $request->input('payment_method'),
|
||||
'created_at' => now(),
|
||||
]);
|
||||
|
||||
DB::connection('primary')->commit();
|
||||
|
||||
$newBalance = DB::connection('primary')->table('passengerWallet')
|
||||
->where('passenger_id', $id)->value('balance');
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => ['balance' => $newBalance],
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
DB::connection('primary')->rollBack();
|
||||
return response()->json(['status' => 'failure', 'message' => 'Transaction failed'], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/** PUT /v2/wallet/passenger — ADMIN ONLY */
|
||||
public function update(Request $request): JsonResponse
|
||||
{
|
||||
// Only admins can directly set balance
|
||||
$userType = $request->attributes->get('_jwt_user_type');
|
||||
if ($userType !== 'admin') {
|
||||
return response()->json(['status' => 'failure', 'message' => 'Unauthorized'], 403);
|
||||
}
|
||||
|
||||
$request->validate([
|
||||
'balance' => 'required|numeric|min:0',
|
||||
'user_id' => 'required|string',
|
||||
'type' => 'required|in:passenger,driver',
|
||||
]);
|
||||
|
||||
$table = $request->input('type') === 'driver' ? 'captain_wallet' : 'passengerWallet';
|
||||
$key = $request->input('type') === 'driver' ? 'captain_id' : 'passenger_id';
|
||||
|
||||
DB::connection('primary')->table($table)
|
||||
->where($key, $request->input('user_id'))
|
||||
->update(['balance' => $request->input('balance')]);
|
||||
|
||||
return response()->json(['status' => 'success']);
|
||||
}
|
||||
|
||||
|
||||
/** GET /v2/wallet/transactions */
|
||||
public function transactions(Request $request): JsonResponse
|
||||
{
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
$userType = $request->attributes->get('_jwt_user_type');
|
||||
$page = (int) $request->input('page', 1);
|
||||
$limit = min((int) $request->input('limit', 20), 50);
|
||||
|
||||
if ($userType === 'driver') {
|
||||
$transactions = DB::connection('primary')->table('payments')
|
||||
->where('driverID', $id)
|
||||
->orderBy('created_at', 'desc')
|
||||
->skip(($page - 1) * $limit)
|
||||
->take($limit)
|
||||
->get();
|
||||
} else {
|
||||
$transactions = DB::connection('primary')->table('payments')
|
||||
->where('passengerID', $id)
|
||||
->orderBy('created_at', 'desc')
|
||||
->skip(($page - 1) * $limit)
|
||||
->take($limit)
|
||||
->get();
|
||||
}
|
||||
|
||||
return response()->json(['status' => 'success', 'data' => $transactions]);
|
||||
}
|
||||
|
||||
/** POST /v2/wallet/passenger/token */
|
||||
public function addToken(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'token' => 'required|string',
|
||||
'amount' => 'required|numeric|min:0.01',
|
||||
]);
|
||||
|
||||
$id = $request->attributes->get('_jwt_user_id');
|
||||
|
||||
DB::connection('primary')->table('payment_tokens_passenger')->insert([
|
||||
'token' => $request->input('token'),
|
||||
'passengerId' => $id,
|
||||
'dateCreated' => now(),
|
||||
'amount' => $request->input('amount'),
|
||||
'isUsed' => 0,
|
||||
]);
|
||||
|
||||
return response()->json(['status' => 'success'], 201);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
namespace App\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* نموذج محفظة الراكب (PassengerWallet Model)
|
||||
*
|
||||
* الغرض من الملف:
|
||||
* إدارة الرصيد المالي للركاب داخل التطبيق.
|
||||
*
|
||||
* كيفية العمل:
|
||||
* 1. يرتبط بجدول (passengerWallet) في قاعدة البيانات الأساسية.
|
||||
* 2. يتبع الرصيد الحالي للراكب ويسمح بعمليات الشحن أو الخصم.
|
||||
*/
|
||||
class PassengerWallet extends Model {
|
||||
protected $connection = 'primary';
|
||||
protected $table = 'passengerWallet';
|
||||
public $timestamps = true;
|
||||
const CREATED_AT = 'created_at';
|
||||
const UPDATED_AT = 'updated_at';
|
||||
protected $fillable = ['passenger_id', 'balance'];
|
||||
protected $casts = ['balance' => 'decimal:2'];
|
||||
}
|
||||
@@ -19,7 +19,6 @@ use App\Http\Controllers\AuthController;
|
||||
use App\Http\Controllers\RideController;
|
||||
use App\Http\Controllers\TrackingController;
|
||||
use App\Http\Controllers\ProfileController;
|
||||
use App\Http\Controllers\WalletController;
|
||||
use App\Http\Controllers\RatingController;
|
||||
use App\Http\Controllers\PromoController;
|
||||
use App\Http\Controllers\OtpController;
|
||||
@@ -114,12 +113,9 @@ Route::prefix('v2')->middleware(['hmac.auth', 'jwt.auth'])->group(function () {
|
||||
Route::match(['post', 'put'], '/profile/driver/email', [ProfileController::class, 'updateDriverEmail']);
|
||||
|
||||
// ── Wallet ──
|
||||
Route::get('/wallet/passenger', [WalletController::class, 'index']);
|
||||
Route::get('/wallet/passenger/balance', [WalletController::class, 'balance']);
|
||||
Route::post('/wallet/passenger', [WalletController::class, 'addFunds']);
|
||||
Route::put('/wallet/passenger', [WalletController::class, 'update']);
|
||||
Route::get('/wallet/passenger/transactions', [WalletController::class, 'transactions']);
|
||||
Route::post('/wallet/passenger/token', [WalletController::class, 'addToken']);
|
||||
// All wallet operations (balance, funds, transactions) are handled by the
|
||||
// dedicated payment server. V2 only generates 60-second JWT tokens for it
|
||||
// via POST /v2/auth/passenger/wallet-login and /v2/auth/driver/wallet-login.
|
||||
|
||||
// ── Ratings ──
|
||||
Route::post('/ratings/driver', [RatingController::class, 'rateDriver']);
|
||||
@@ -156,7 +152,8 @@ Route::prefix('v2')->middleware(['hmac.auth', 'jwt.auth'])->group(function () {
|
||||
Route::post('/notifications/update', [NotificationController::class, 'updateNotification']);
|
||||
Route::get('/notifications/token', [NotificationController::class, 'getToken']);
|
||||
Route::post('/notifications/token', [NotificationController::class, 'updateToken']);
|
||||
Route::put('/notifications/{id}/read', [NotificationController::class, 'markRead']);
|
||||
Route::match(['put', 'post'], '/notifications/driver/read', [NotificationController::class, 'updateNotification']);
|
||||
Route::match(['put', 'post'], '/notifications/{id}/read', [NotificationController::class, 'markRead']);
|
||||
|
||||
// ── Misc ──
|
||||
Route::get('/misc/test', [MiscController::class, 'test']);
|
||||
|
||||
Reference in New Issue
Block a user