From 747d741293e064a979d7bf6c143ef969ea6d7629 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 24 May 2026 20:49:44 +0000
Subject: [PATCH] =GMBReview block minor tweaks. Refactored ReferralManager.php and ReferralRoutes.php to utilize the manager for all logic, and CustomTable for table interactions.
---
inc/rest/routes/ReferralRoutes.php | 201 +++++++++-----------------------------------------
1 files changed, 37 insertions(+), 164 deletions(-)
diff --git a/inc/rest/routes/ReferralRoutes.php b/inc/rest/routes/ReferralRoutes.php
index 2ef284a..a1e3f3e 100644
--- a/inc/rest/routes/ReferralRoutes.php
+++ b/inc/rest/routes/ReferralRoutes.php
@@ -20,20 +20,12 @@
*/
class ReferralRoutes extends Rest
{
- protected CustomTable $referrals;
- protected CustomTable $rewards;
- protected CustomTable $treatments;
-
public function __construct()
{
$this->cacheName = 'referrals';
$this->cacheTtl = (int)HOUR_IN_SECONDS;
parent::__construct();
- $this->referrals = CustomTable::for('referrals');
- $this->rewards = CustomTable::for('referral_rewards');
- $this->treatments = CustomTable::for('referral_treatments');
-
add_filter(BASE.'handle_bulk_operation', [$this, 'processOperation'], 10, 3);
}
@@ -235,33 +227,17 @@
return $this->error('referral_id required', 'missing_id', 400);
}
- // Get referral using CustomTable
- $referral = $this->referrals->get(['id' => $referral_id]);
- if (!$referral) {
- return $this->notFound('Referral not found');
+ $result = JVB()->referrals()->updateStatus($referral_id, $status);
+
+ if (is_wp_error($result)) {
+ $code = $result->get_error_code();
+ return $code === 'not_found'
+ ? $this->notFound($result->get_error_message())
+ : $this->error($result->get_error_message(), $code, 500);
}
- // Update status
- $update_data = ['status' => $status];
- $update_data["{$status}_at"] = current_time('mysql');
-
- if ($status === 'treated') {
- $update_data['treatment_count'] = ($referral->treatment_count ?? 0) + 1;
- }
-
- $updated = $this->referrals->update($update_data, ['id' => $referral_id]);
-
- if ($updated !== false) {
- // Create rewards if treated
- if ($status === 'treated') {
- $this->createRewards($referral);
- }
-
- $this->cache->flush();
- return $this->success(['message' => "Referral marked as {$status}"]);
- }
-
- return $this->error('Failed to update referral', 'update_failed', 500);
+ $this->cache->flush();
+ return $this->success(['message' => "Referral marked as {$status}"]);
}
/**
@@ -274,26 +250,20 @@
return $this->error('referral_id required', 'missing_id', 400);
}
- // Get referral
- $referral = $this->referrals->get(['id' => $referral_id]);
- if (!$referral) {
- return $this->notFound('Referral not found');
+ $result = JVB()->referrals()->removeReferral($referral_id, get_current_user_id());
+
+ if (is_wp_error($result)) {
+ $code = $result->get_error_code();
+ $status = match($code) {
+ 'not_found' => 404,
+ 'unauthorized' => 403,
+ 'invalid_status' => 400,
+ default => 500
+ };
+ return $this->error($result->get_error_message(), $code, $status);
}
- // Check ownership
- $current_user_id = get_current_user_id();
- if ($referral->referrer_id != $current_user_id && !current_user_can('manage_options')) {
- return $this->forbidden('Unauthorized');
- }
-
- // Can only remove pending referrals
- if ($referral->status !== 'pending') {
- return $this->error('Can only remove pending referrals', 'invalid_status', 400);
- }
-
- $this->referrals->delete(['id' => $referral_id]);
$this->cache->flush();
-
return $this->success(['message' => 'Referral removed']);
}
@@ -307,44 +277,18 @@
return $this->error('referral_id required', 'missing_id', 400);
}
- $current_user_id = get_current_user_id();
-
- // Get referral with ownership check
- $referral = $this->referrals->where([
- 'id' => $referral_id,
- 'referrer_id' => $current_user_id
- ])->first();
-
- if (!$referral) {
- return $this->notFound('Referral not found');
- }
-
- // Check rate limit (once per week)
- $transient_key = 'referral_last_invite_' . md5($referral->referee_email);
- $last_invite = get_transient($transient_key);
-
- if ($last_invite && (time() - $last_invite) < WEEK_IN_SECONDS) {
- return $this->error(
- 'Can only resend once per week',
- 'rate_limit',
- 429
- );
- }
-
- // Resend via referral manager
- $result = JVB()->referrals()->sendReferralInvitation(
- $current_user_id,
- $referral->referee_email,
- $referral->referee_name,
- sprintf('Reminder: Join %s', get_bloginfo('name')),
- 'Just a friendly reminder about my invitation!'
- );
+ $result = JVB()->referrals()->resendInvitation($referral_id, get_current_user_id());
if (is_wp_error($result)) {
- return $this->error($result->get_error_message(), 'send_failed', 500);
+ $code = $result->get_error_code();
+ $status = match($code) {
+ 'not_found' => 404,
+ 'rate_limit' => 429,
+ default => 500
+ };
+ return $this->error($result->get_error_message(), $code, $status);
}
- set_transient($transient_key, time(), WEEK_IN_SECONDS);
return $this->success(['message' => 'Invitation resent']);
}
@@ -461,90 +405,19 @@
*/
protected function getAllReferrals(WP_REST_Request $request): WP_REST_Response
{
- global $wpdb;
-
- $where = ['1=1'];
- $where_params = [];
-
- // Build WHERE conditions
- $status = $request->get_param('status');
- if ($status && $status !== 'all') {
- $where[] = 'status = %s';
- $where_params[] = $status;
- }
-
- if ($date_start = $request->get_param('date_start')) {
- $where[] = 'referred_at >= %s';
- $where_params[] = $date_start;
- }
-
- if ($date_end = $request->get_param('date_end')) {
- $where[] = 'referred_at <= %s';
- $where_params[] = $date_end;
- }
-
- $search = $request->get_param('search');
- if (!empty($search)) {
- $search_term = '%' . $wpdb->esc_like($search) . '%';
- $where[] = '(r.referee_name LIKE %s OR r.referee_email LIKE %s OR r.referral_code LIKE %s OR u.display_name LIKE %s)';
- $where_params[] = $search_term;
- $where_params[] = $search_term;
- $where_params[] = $search_term;
- $where_params[] = $search_term;
- }
-
- $limit = $request->get_param('limit') ?? 50;
- $offset = $request->get_param('offset') ?? 0;
-
- $where_params[] = $limit;
- $where_params[] = $offset;
-
- // Use CustomTable's query method
- $query = "SELECT r.*, u.display_name as referrer_name
- FROM {table} r
- LEFT JOIN {$wpdb->users} u ON r.referrer_id = u.ID
- WHERE " . implode(' AND ', $where) . "
- ORDER BY referred_at DESC
- LIMIT %d OFFSET %d";
-
- $items = $this->referrals->queryResults($query, $where_params);
-
- return $this->success([
- 'items' => $items,
- 'total' => count($items)
- ]);
- }
-
- /**
- * Helper: Create rewards for completed referral
- */
- protected function createRewards(object $referral): void
- {
- $settings = JVB()->referrals()->getRewardSettings();
-
- // Referrer reward
- $this->rewards->insert([
- 'referral_id' => $referral->id,
- 'user_id' => $referral->referrer_id,
- 'reward_type' => 'referrer',
- 'amount' => $settings['referrer_reward_amount'],
- 'reward_calculation' => $settings['referrer_reward_type'],
- 'status' => 'available'
+ $items = JVB()->referrals()->getAllReferrals([
+ 'status' => $request->get_param('status') ?? 'all',
+ 'search' => $request->get_param('search'),
+ 'date_start' => $request->get_param('date_start'),
+ 'date_end' => $request->get_param('date_end'),
+ 'limit' => $request->get_param('limit') ?? 50,
+ 'offset' => $request->get_param('offset') ?? 0,
]);
- // Referee reward
- if ($referral->referee_id) {
- $this->rewards->insert([
- 'referral_id' => $referral->id,
- 'user_id' => $referral->referee_id,
- 'reward_type' => 'referee',
- 'amount' => $settings['referee_reward_amount'],
- 'reward_calculation' => $settings['referee_reward_type'],
- 'status' => 'available'
- ]);
- }
+ return $this->success(['items' => $items, 'total' => count($items)]);
}
+
/**
* Process queued referral operations
*/
--
Gitblit v1.10.0