From e9967fa22781d922ba4eb8fb44fe72d200ac4b14 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Mon, 10 Nov 2025 21:04:10 +0000
Subject: [PATCH] =IconsManager.php update

---
 inc/rest/routes/ReferralRoutes.php |   65 ++++++++++++++++++++++++++++++--
 1 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/inc/rest/routes/ReferralRoutes.php b/inc/rest/routes/ReferralRoutes.php
index 1589135..15f293e 100644
--- a/inc/rest/routes/ReferralRoutes.php
+++ b/inc/rest/routes/ReferralRoutes.php
@@ -1,6 +1,7 @@
 <?php
 namespace JVBase\rest\routes;
 
+use JVBase\managers\ReferralManager;
 use JVBase\rest\RestRouteManager;
 use WP_REST_Request;
 use WP_REST_Response;
@@ -15,7 +16,7 @@
  */
 class ReferralRoutes extends RestRouteManager
 {
-
+	protected ReferralManager $manager;
 	public function __construct()
 	{
 		$this->route = 'referrals';
@@ -31,10 +32,10 @@
 			'permission_callback' => [$this, 'checkPermission']
 		]);
 
-		register_rest_route($this->namespace, '/referrals/register', [
+		register_rest_route($this->namespace, "/{$this->route}/register", [
 			'methods' => 'POST',
 			'callback' => [$this, 'registerWithReferral'],
-			'permission_callback' => '__return_true',
+			'permission_callback' => [$this, 'checkRateLimit'],
 			'args' => [
 				'name' => [
 					'required' => true,
@@ -62,7 +63,7 @@
 		register_rest_route($this->namespace, '/referrals/check-code', [
 			'methods' => 'POST',
 			'callback' => [$this, 'checkReferralCode'],
-			'permission_callback' => '__return_true',
+			'permission_callback' => [$this, 'checkRateLimit'],
 			'args' => [
 				'code' => [
 					'required' => true,
@@ -85,7 +86,7 @@
 		register_rest_route($this->namespace, "/{$this->route}/track", [
 			'methods' => 'POST',
 			'callback' => [$this, 'trackReferralClick'],
-			'permission_callback' => '__return_true',
+			'permission_callback' => [$this, 'checkRateLimit'],
 			'args' => [
 				'code' => [
 					'required' => true,
@@ -181,6 +182,8 @@
 			]
 		]);
 
+
+
 		// Get top referrers (admin only)
 		register_rest_route($this->namespace, "/{$this->route}/leaderboard", [
 			'methods' => 'GET',
@@ -217,6 +220,21 @@
 				}
 			]
 		]);
+
+		register_rest_route($this->namespace, "/{$this->route}/add-code", [
+			'methods' 	=> 'POST',
+			'callback'	=> [$this, 'addReferralCodeAfterRegistration'],
+			'permission_callback'	=> [$this, 'checkRateLimit'],
+			'args'	=> [
+				'code'	=> [
+					'required'	=> true,
+					'type'		=> 'string',
+					'sanitize_callback'	=> function ($code) {
+						return strtoupper(sanitize_text_field($code));
+					}
+				]
+			]
+		]);
 	}
 
 	public function checkPermission(WP_REST_Request $request): bool
@@ -588,6 +606,9 @@
 				'message' => 'Invalid referral code'
 			], 404);
 		}
+		if (is_user_logged_in() && get_current_user_id() === $referrer->ID) {
+			return $this->error('You cannot use your own referral code', 'self_referral', 400);
+		}
 
 		// Return basic referrer info (no sensitive data)
 		return new WP_REST_Response([
@@ -596,4 +617,38 @@
 			'referrer_name' => $referrer->display_name,
 		], 200);
 	}
+
+	public function addReferralCodePostRegistration(WP_REST_Request $request): WP_REST_Response
+	{
+		if (!$this->manager) {
+			$this->manager = JVB()->referrals();
+		}
+		$user_id = get_current_user_id();
+		$code = $request->get_param('code');
+
+		// Check if user already has a referral (can't change)
+		$existing = $this->manager->getReferralByReferee($user_id);
+		if ($existing) {
+			return $this->error('You already have a referral code applied', 'already_referred', 400);
+		}
+
+		// Validate the code exists
+		$referrer = $this->manager->getUserByReferralCode($code);
+		if (!$referrer) {
+			return $this->error('Invalid referral code', 'invalid_code', 400);
+		}
+
+		// Create the referral
+		$user = wp_get_current_user();
+		$result = $this->manager->createReferral($referrer->ID, $user_id, $code);
+
+		if ($result) {
+			return $this->success([
+				'message' => 'Referral code applied successfully!',
+				'referrer_name' => $referrer->display_name
+			]);
+		}
+
+		return $this->error('Failed to apply referral code', 'creation_failed', 500);
+	}
 }

--
Gitblit v1.10.0