| | |
| | | <?php |
| | | namespace JVBase\rest\routes; |
| | | |
| | | use JVBase\managers\ReferralManager; |
| | | use JVBase\rest\RestRouteManager; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | |
| | | */ |
| | | class ReferralRoutes extends RestRouteManager |
| | | { |
| | | |
| | | protected ReferralManager $manager; |
| | | public function __construct() |
| | | { |
| | | $this->route = 'referrals'; |
| | |
| | | '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, |
| | |
| | | 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, |
| | |
| | | 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, |
| | |
| | | ] |
| | | ]); |
| | | |
| | | |
| | | |
| | | // Get top referrers (admin only) |
| | | register_rest_route($this->namespace, "/{$this->route}/leaderboard", [ |
| | | 'methods' => 'GET', |
| | |
| | | } |
| | | ] |
| | | ]); |
| | | |
| | | 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 |
| | |
| | | '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([ |
| | |
| | | '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); |
| | | } |
| | | } |