route = 'referrals'; parent::__construct(); } public function registerRoutes(): void { // Get user's referrals register_rest_route($this->namespace, "/{$this->route}", [ 'methods' => 'GET', 'callback' => [$this, 'getUserReferrals'], 'permission_callback' => [$this, 'checkPermission'] ]); // Get or create referral code register_rest_route($this->namespace, "/{$this->route}/code", [ 'methods' => 'GET', 'callback' => [$this, 'getReferralCode'], 'permission_callback' => [$this, 'checkPermission'] ]); // Update referral code register_rest_route($this->namespace, "/{$this->route}/code", [ 'methods' => 'POST', 'callback' => [$this, 'updateReferralCode'], 'permission_callback' => [$this, 'checkPermission'], 'args' => [ 'code' => [ 'required' => true, 'type' => 'string', 'validate_callback' => function($param) { return preg_match('/^[A-Z0-9]+$/i', $param); } ] ] ]); // Track referral click (public endpoint) register_rest_route($this->namespace, "/{$this->route}/track", [ 'methods' => 'POST', 'callback' => [$this, 'trackReferralClick'], 'permission_callback' => '__return_true', 'args' => [ 'code' => [ 'required' => true, 'type' => 'string' ] ] ]); // Mark referral as treated register_rest_route($this->namespace, "/{$this->route}/(?P\d+)/treat", [ 'methods' => 'POST', 'callback' => [$this, 'markAsTreated'], 'permission_callback' => function() { return current_user_can('manage_options'); }, 'args' => [ 'id' => [ 'required' => true, 'validate_callback' => function($param) { return is_numeric($param); } ] ] ]); // Get user stats register_rest_route($this->namespace, "/{$this->route}/stats", [ 'methods' => 'GET', 'callback' => [$this, 'getUserStats'], 'permission_callback' => [$this, 'checkPermission'] ]); // Get top referrers (admin only) register_rest_route($this->namespace, "/{$this->route}/leaderboard", [ 'methods' => 'GET', 'callback' => [$this, 'getTopReferrers'], 'permission_callback' => function() { return current_user_can('manage_options'); }, 'args' => [ 'period' => [ 'default' => 'week', 'enum' => ['day', 'week', 'month', 'all'] ], 'limit' => [ 'default' => 10, 'type' => 'integer' ] ] ]); // Get/Update referral settings (admin only) register_rest_route($this->namespace, "/{$this->route}/settings", [ [ 'methods' => 'GET', 'callback' => [$this, 'getSettings'], 'permission_callback' => function() { return current_user_can('manage_options'); } ], [ 'methods' => 'POST', 'callback' => [$this, 'updateSettings'], 'permission_callback' => function() { return current_user_can('manage_options'); } ] ]); } public function checkPermission(WP_REST_Request $request): bool { return is_user_logged_in(); } /** * Get user's referrals */ public function getUserReferrals(WP_REST_Request $request): WP_REST_Response { $user_id = get_current_user_id(); $args = [ 'status' => $request->get_param('status') ?? 'all', 'limit' => $request->get_param('limit') ?? 50, 'offset' => $request->get_param('offset') ?? 0 ]; $referrals = JVB()->referrals()->getUserReferrals($user_id, $args); return new WP_REST_Response([ 'success' => true, 'referrals' => $referrals ]); } /** * Get user's referral code */ public function getReferralCode(WP_REST_Request $request): WP_REST_Response { $user_id = get_current_user_id(); $code = JVB()->referrals()->getUserReferralCode($user_id); if (is_wp_error($code)) { return new WP_REST_Response([ 'success' => false, 'message' => $code->get_error_message() ], 400); } return new WP_REST_Response([ 'success' => true, 'code' => $code, 'share_url' => home_url('/?ref=' . $code) ]); } /** * Update user's referral code */ public function updateReferralCode(WP_REST_Request $request): WP_REST_Response { $user_id = get_current_user_id(); $new_code = strtoupper(sanitize_text_field($request->get_param('code'))); $result = JVB()->referrals()->getUserReferralCode($user_id, $new_code); if (is_wp_error($result)) { return new WP_REST_Response([ 'success' => false, 'message' => $result->get_error_message() ], 400); } return new WP_REST_Response([ 'success' => true, 'code' => $result, 'message' => 'Referral code updated successfully' ]); } /** * Track referral click and store in session */ public function trackReferralClick(WP_REST_Request $request): WP_REST_Response { $code = strtoupper(sanitize_text_field($request->get_param('code'))); // Start session if not already started if (session_status() === PHP_SESSION_NONE) { session_start(); } // Store referral code in both session and cookie (30 day expiry) $_SESSION[BASE . 'referral_code'] = $code; setcookie(BASE . 'referral_code', $code, time() + (30 * DAY_IN_SECONDS), '/'); return new WP_REST_Response([ 'success' => true, 'message' => 'Referral tracked' ]); } /** * Mark referral as treated */ public function markAsTreated(WP_REST_Request $request): WP_REST_Response { $referral_id = intval($request->get_param('id')); $result = JVB()->referrals()->markAsTreated($referral_id, true); if (!$result) { return new WP_REST_Response([ 'success' => false, 'message' => 'Failed to update referral' ], 400); } return new WP_REST_Response([ 'success' => true, 'message' => 'Referral marked as treated and rewards created' ]); } /** * Get user stats */ public function getUserStats(WP_REST_Request $request): WP_REST_Response { $user_id = get_current_user_id(); $stats = JVB()->referrals()->getUserStats($user_id); return new WP_REST_Response([ 'success' => true, 'stats' => $stats ]); } /** * Get top referrers */ public function getTopReferrers(WP_REST_Request $request): WP_REST_Response { $period = $request->get_param('period') ?? 'week'; $limit = $request->get_param('limit') ?? 10; $top_referrers = JVB()->referrals()->getTopReferrers($limit, $period); return new WP_REST_Response([ 'success' => true, 'period' => $period, 'referrers' => $top_referrers ]); } /** * Get referral settings */ public function getSettings(WP_REST_Request $request): WP_REST_Response { $settings = get_option(BASE . 'referral_settings', []); return new WP_REST_Response([ 'success' => true, 'settings' => $settings ]); } /** * Update referral settings */ public function updateSettings(WP_REST_Request $request): WP_REST_Response { $settings = [ 'referrer_reward_type' => $request->get_param('referrer_reward_type') ?? 'per_user', 'referrer_reward_amount' => floatval($request->get_param('referrer_reward_amount') ?? 25), 'referee_reward_type' => $request->get_param('referee_reward_type') ?? 'percentage', 'referee_reward_amount' => floatval($request->get_param('referee_reward_amount') ?? 20), 'referee_reward_applies_to' => $request->get_param('referee_reward_applies_to') ?? 'first_order' ]; update_option(BASE . 'referral_settings', $settings); return new WP_REST_Response([ 'success' => true, 'message' => 'Settings updated successfully', 'settings' => $settings ]); } }