<?php
|
namespace JVBase\rest;
|
|
use WP_REST_Request;
|
use WP_REST_Response;
|
use WP_Error;
|
use JVBase\managers\ReferralManager;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
/**
|
* REST API routes for referral system
|
*/
|
class ReferralRoutes extends RestRouteManager
|
{
|
protected ReferralManager $manager;
|
|
public function __construct()
|
{
|
$this->route = 'referrals';
|
$this->manager = new ReferralManager();
|
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<id>\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 = $this->manager->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 = $this->manager->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 = $this->manager->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 = $this->manager->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 = $this->manager->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 = $this->manager->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
|
]);
|
}
|
}
|