From 59286952120480b744e3d2c1f42c64ea6687f938 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 8 May 2026 06:06:33 +0300 Subject: [PATCH] feat: add gamification endpoints for driver behavior --- ride/gamification/claimChallengeReward.php | 34 ++++++++++++++ ride/gamification/getDriverBehavior.php | 31 +++++++++++++ ride/gamification/getLeaderboard.php | 54 ++++++++++++++++++++++ ride/gamification/getReferralStats.php | 30 ++++++++++++ ride/gamification/getWeeklyAggregate.php | 32 +++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 ride/gamification/claimChallengeReward.php create mode 100644 ride/gamification/getDriverBehavior.php create mode 100644 ride/gamification/getLeaderboard.php create mode 100644 ride/gamification/getReferralStats.php create mode 100644 ride/gamification/getWeeklyAggregate.php diff --git a/ride/gamification/claimChallengeReward.php b/ride/gamification/claimChallengeReward.php new file mode 100644 index 0000000..4bd319c --- /dev/null +++ b/ride/gamification/claimChallengeReward.php @@ -0,0 +1,34 @@ +prepare($checkSql); +$stmtCheck->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtCheck->bindParam(':challenge_id', $challenge_id, PDO::PARAM_STR); +$stmtCheck->execute(); + +if ($stmtCheck->rowCount() > 0) { + jsonError("Reward already claimed today"); + exit(); +} + +// Insert into driver wallet +$paymentID = "CHL_" . time(); +$sql = "INSERT INTO driverWallet (driverID, paymentID, amount, paymentMethod) VALUES (:driver_id, :paymentID, :amount, :method)"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->bindParam(':paymentID', $paymentID, PDO::PARAM_STR); +$stmt->bindParam(':amount', $points, PDO::PARAM_STR); +$stmt->bindParam(':method', $challenge_id, PDO::PARAM_STR); + +if ($stmt->execute()) { + jsonSuccess("Reward claimed successfully"); +} else { + jsonError("Failed to claim reward"); +} +?> diff --git a/ride/gamification/getDriverBehavior.php b/ride/gamification/getDriverBehavior.php new file mode 100644 index 0000000..6628574 --- /dev/null +++ b/ride/gamification/getDriverBehavior.php @@ -0,0 +1,31 @@ += DATE(NOW()) - INTERVAL 30 DAY +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row && $row['max_speed'] !== null) { + jsonSuccess([$row]); +} else { + jsonSuccess([[ + "avg_score" => 100, + "total_hard_brakes" => 0, + "max_speed" => 0 + ]]); +} +?> diff --git a/ride/gamification/getLeaderboard.php b/ride/gamification/getLeaderboard.php new file mode 100644 index 0000000..4432941 --- /dev/null +++ b/ride/gamification/getLeaderboard.php @@ -0,0 +1,54 @@ += DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY) + GROUP BY d.id + ORDER BY value DESC + LIMIT 10 + "; +} else { + // Default to trips + $sql = " + SELECT + d.id as driver_id, + COALESCE(d.name, d.nameArabic, d.firstName, 'Driver') as name, + d.personal_photo as photoUrl, + COUNT(r.id) as value + FROM `driver` d + JOIN `ride` r ON d.id = r.driver_id + WHERE r.status = 'Finished' + AND r.created_at >= DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY) + GROUP BY d.id + ORDER BY value DESC + LIMIT 10 + "; +} + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Add Rank manually to support older MySQL versions + $rank = 1; + foreach ($rows as &$row) { + $row['rank'] = $rank++; + } + + jsonSuccess($rows); +} else { + jsonSuccess([]); +} +?> diff --git a/ride/gamification/getReferralStats.php b/ride/gamification/getReferralStats.php new file mode 100644 index 0000000..b50bbac --- /dev/null +++ b/ride/gamification/getReferralStats.php @@ -0,0 +1,30 @@ +prepare($sqlDriver); +$stmtD->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtD->execute(); +$driverCount = $stmtD->fetchColumn(); + +// Passenger invites count +$sqlPass = "SELECT COUNT(*) as total FROM invitesToPassengers WHERE driverId = :driver_id AND isInstall = 1"; +$stmtP = $con->prepare($sqlPass); +$stmtP->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtP->execute(); +$passengerCount = $stmtP->fetchColumn(); + +// Rewards calculation (100 pts per driver, 50 pts per passenger) +$totalRewards = ($driverCount * 100) + ($passengerCount * 50); + +jsonSuccess([ + [ + "driverInvites" => (int)$driverCount, + "passengerInvites" => (int)$passengerCount, + "totalRewards" => $totalRewards + ] +]); +?> diff --git a/ride/gamification/getWeeklyAggregate.php b/ride/gamification/getWeeklyAggregate.php new file mode 100644 index 0000000..4c68962 --- /dev/null +++ b/ride/gamification/getWeeklyAggregate.php @@ -0,0 +1,32 @@ += DATE(NOW()) - INTERVAL 6 DAY + GROUP BY DATE(r.created_at) + ORDER BY DATE(r.created_at) ASC +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); +} else { + // Return empty array instead of error so the app doesn't crash + jsonSuccess([]); +} +?>