Files
intaleq_v2/app/Http/Controllers/ProfileController.php

213 lines
6.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Driver;
use App\Models\Passenger;
use App\Models\CarRegistration;
use App\Models\ImageProfileCaptain;
use App\Helpers\LegacyEncryption;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
/**
* متحكم الملف الشخصي (Profile Controller)
*
* الغرض من الملف:
* إدارة البيانات الشخصية للمستخدمين (سائقين وركاب).
*
* كيفية العمل:
* 1. يعرض بيانات المستخدم الحالية بعد فك تشفير الحقول الحساسة.
* 2. يسمح للمستخدم بتحديث بياناته مثل الاسم أو البريد الإلكتروني.
*/
class ProfileController extends Controller
{
private LegacyEncryption $enc;
public function __construct(LegacyEncryption $enc)
{
$this->enc = $enc;
}
/**
* GET /v2/profile/passenger
*/
public function passenger(Request $request): JsonResponse
{
$id = $request->attributes->get('_jwt_user_id');
$passenger = Passenger::active()->find($id);
if (!$passenger) {
return response()->json(['status' => 'failure', 'message' => 'Not found'], 404);
}
$data = $passenger->toArray();
$data = $this->enc->decryptFields($data, Passenger::ENCRYPTED_FIELDS);
unset($data['password'], $data['api_secret']);
// 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', 'message' => $data]);
}
/**
* GET /v2/profile/driver
*/
public function driver(Request $request): JsonResponse
{
$id = $request->attributes->get('_jwt_user_id');
$driver = Driver::active()->byId($id)->first();
if (!$driver) {
return response()->json(['status' => 'failure', 'message' => 'Not found'], 404);
}
$data = $driver->toArray();
$data = $this->enc->decryptFields($data, Driver::ENCRYPTED_FIELDS);
unset($data['password'], $data['api_secret']);
// Car info
$car = CarRegistration::where('driverID', $id)->where('isDefault', 1)->first();
if ($car) {
$carData = $car->toArray();
$data['car'] = $this->enc->decryptFields($carData, CarRegistration::ENCRYPTED_FIELDS);
}
// Profile image
$image = ImageProfileCaptain::where('driverID', $id)->first();
$data['profile_image'] = $image->link ?? null;
// Rating
$data['rating'] = $driver->getAverageRating();
// 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', 'message' => $data]);
}
/**
* PUT /v2/profile/passenger
*/
public function updatePassenger(Request $request): JsonResponse
{
$id = $request->attributes->get('_jwt_user_id');
$passenger = Passenger::active()->find($id);
if (!$passenger) {
return response()->json(['status' => 'failure', 'message' => 'Not found'], 404);
}
$updates = [];
$encryptableFields = [
'first_name', 'last_name', 'gender', 'birthdate', 'sosPhone',
'site', 'education', 'employmentType', 'maritalStatus'
];
foreach ($encryptableFields as $field) {
if ($request->has($field)) {
$updates[$field] = $this->enc->encrypt($request->input($field));
}
}
if (!empty($updates)) {
$passenger->update($updates);
}
return response()->json(['status' => 'success', 'message' => 'Profile updated']);
}
/**
* PUT /v2/profile/driver/email
*/
public function updateDriverEmail(Request $request): JsonResponse
{
$request->validate(['email' => 'required|email']);
$id = $request->attributes->get('_jwt_user_id');
$driver = Driver::active()->byId($id)->first();
if (!$driver) {
return response()->json(['status' => 'failure', 'message' => 'Not found'], 404);
}
$driver->update([
'email' => $this->enc->encrypt($request->input('email')),
]);
return response()->json(['status' => 'success', 'message' => 'Email updated']);
}
/**
* POST /v2/profile/driver/shamcash
*/
public function updateShamCash(Request $request): JsonResponse
{
$id = $request->attributes->get('_jwt_user_id');
$driver = Driver::active()->byId($id)->first();
if (!$driver) {
return response()->json(['status' => 'failure', 'message' => 'Not found'], 404);
}
$accountBank = $request->input('accountBank') ?? $request->input('accountNumber');
$bankCode = $request->input('bankCode') ?? $request->input('paymentProvider');
if (!$accountBank || !$bankCode) {
return response()->json(['status' => 'failure', 'message' => 'Missing fields'], 400);
}
$driver->update([
'accountBank' => $this->enc->encrypt($accountBank),
'bankCode' => $bankCode,
]);
return response()->json(['status' => 'success', 'message' => 'Sham Cash details updated']);
}
/**
* POST /v2/profile/driver/car
*/
public function updateDriverCar(Request $request): JsonResponse
{
$id = $request->attributes->get('_jwt_user_id');
$car = CarRegistration::where('driverID', $id)->where('isDefault', 1)->first();
if (!$car) {
return response()->json(['status' => 'failure', 'message' => 'Car not found'], 404);
}
$fields = ['make', 'model', 'year', 'color', 'color_hex', 'expiration_date', 'vin', 'car_plate'];
$updates = [];
foreach ($fields as $f) {
if ($request->has($f)) {
$val = $request->input($f);
if (in_array($f, CarRegistration::ENCRYPTED_FIELDS)) {
$updates[$f] = $this->enc->encrypt($val);
} else {
$updates[$f] = $val;
}
}
}
if (!empty($updates)) {
$car->update($updates);
}
return response()->json(['status' => 'success', 'message' => 'Vehicle details updated']);
}
}