Jake Vanderwerf
2025-11-10 e9967fa22781d922ba4eb8fb44fe72d200ac4b14
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);
   }
}