From a9b3b28d001941921aa70d37fdc87c758a163a44 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Fri, 05 Jun 2026 16:47:03 +0000
Subject: [PATCH] =Some hefty changes to FeedBlock. Transitioning to loading first page in php to save on extra requests. Got a bit to do yet, but I have to work on Northeh for a bit here.

---
 inc/rest/routes/VoteRoutes.php |  228 ++++----------------------------------------------------
 1 files changed, 19 insertions(+), 209 deletions(-)

diff --git a/inc/rest/routes/VoteRoutes.php b/inc/rest/routes/VoteRoutes.php
index b79ec08..c0298ec 100644
--- a/inc/rest/routes/VoteRoutes.php
+++ b/inc/rest/routes/VoteRoutes.php
@@ -2,10 +2,11 @@
 namespace JVBase\rest\routes;
 
 use JVBase\managers\CustomTable;
+use JVBase\managers\KarmaManager;
+use JVBase\registrar\Registrar;
 use JVBase\rest\Response;
 use JVBase\rest\Rest;
 use JVBase\rest\Route;
-use JVBase\utility\Features;
 use WP_REST_Request;
 use WP_REST_Response;
 use WP_Error;
@@ -58,13 +59,14 @@
     public function handleVote(WP_REST_Request $request):WP_REST_Response
     {
         $content = sanitize_text_field($request->get_param('content')??'');
-		if ((!Features::forContent($content)->has('karma') && !Features::forTaxonomy($content)->has('karma') && !Features::forUser($content)->has('karma'))) {
+		$registrar = Registrar::getInstance($content);
+		if (!$registrar || !$registrar->hasFeature('karma')) {
 			return Response::validationError(['message' => __('Invalid content', 'jvb')]);
 		}
 
         $vote = sanitize_text_field($request->get_param('vote')??'');
 		$itemID = absint($request->get_param('item_id')??0);
-        if ($itemID === 0 || !in_array($vote, ['up', 'down'])) {
+        if ($itemID === 0 || !in_array($vote, [true, false, null])) {
 			return Response::validationError(['message' => __('Invalid item or vote attempt', 'jvb')]);
         }
 
@@ -73,199 +75,27 @@
 			return Response::validationError(['message' => __('User doesn\'t match. Bot?', 'jvb')]);
 		}
 
-        $operation = sanitize_text_field($request->get_param('id'));
-
-		$type = match(true) {
-			array_key_exists($content, JVB_CONTENT) => 'post',
-			array_key_exists($content, JVB_TAXONOMY) => 'term',
-			array_key_exists($content, JVB_USER) => 'user',
-			default => false
-		};
+		$type = $registrar->getType()??false;
 		if (!$type) {
 			return Response::validationError(['message' => __('Invalid content type', 'jvb')]);
 		}
 
-        $data = [
-            'user'      => $user,
-            'item_id'   => $itemID,
-            'content'   => $content,
-			'type'		=> $type,
-            'vote'      => $vote,
-        ];
 
-        error_log('Final Vote Data: '.print_r($data, true));
-        error_log('Operation: '.print_r($operation, true));
-        $operationID = JVB()->queue()->add(
-            'karmic',
-            $user,
-            $data,
-            [
-                'priority'      => 'high',
-                'operation_id'  => $operation,
-            ]
-        );
-		return $this->queued($operationID['operation_id']);
-    }
-
-	/**
-	 * @param WP_Error|array $result
-	 * @param object $operation
-	 * @param array $data
-	 *
-	 * @return WP_Error|array
-	 * @throws Exception
-	 */
-    public function processOperation(WP_Error|array $result, object $operation, array $data):WP_Error|array
-    {
-        if ($operation->type !== 'karmic') {
-            return $result;
-        }
-
-        //Check if item exists
-		$item = match ($data['type']) {
-			'post' 	=> get_post($data['item_id']),
-			'term'	=> get_term($data['item_id'], jvbCheckBase($data['content'])),
-			'user'	=> get_userdata($data['item_id']),
-			default => false
-		};
-        if (!$item || is_wp_error($item)) {
-            return [
-                'success' => false,
-                'result'   => __('Invalid item', 'jvb')
-            ];
-        }
-
-		$table = CustomTable::for('karma_' . $data['content']);
-
-		return $table->transaction(function($table) use ($data) {
-			// Check existing vote
-			$existing = $table->where([
-				'item_id' => $data['item_id'],
-				'user_id' => $data['user']
-			])->first();
-
-			$existing_vote = $existing->vote ?? null;
-			$new_vote = $data['vote'];
-
-			// No previous vote - insert new
-			if ($existing_vote === null) {
-				$inserted = $table->create([
-					'item_id' => $data['item_id'],
-					'user_id' => $data['user'],
-					'vote' => $new_vote,
-				]);
-
-				if (!$inserted) {
-					throw new Exception('Failed to record vote');
-				}
-
-				$this->updateVoteCount($data['content'], $data['type'], $data['item_id'], $new_vote, 1);
-				$this->cache->invalidate($data['user']);
-
-				return [
-					'success' => true,
-					'result' => __('Vote recorded', 'jvb'),
-				];
-			}
-
-			// Changing vote
-			if ($existing_vote !== $new_vote) {
-				$updated = $table->where([
-					'item_id' => $data['item_id'],
-					'user_id' => $data['user']
-				])->updateResults(['vote' => $new_vote]);
-
-				if (!$updated) {
-					throw new Exception('Failed to update vote');
-				}
-
-				// Decrement old, increment new
-				$this->updateVoteCount($data['content'], $data['type'], $data['item_id'], $existing_vote, -1);
-				$this->updateVoteCount($data['content'], $data['type'], $data['item_id'], $new_vote, 1);
-				$this->cache->invalidate($data['user']);
-
-				return [
-					'success' => true,
-					'result' => __('Vote updated', 'jvb'),
-				];
-			}
-
-			// Toggle off - remove vote
-			$deleted = $table->where([
-				'item_id' => $data['item_id'],
-				'user_id' => $data['user']
-			])->deleteResults();
-
-			if (!$deleted) {
-				throw new Exception('Failed to remove vote');
-			}
-
-			$this->updateVoteCount($data['content'], $data['type'], $data['item_id'], $existing_vote, -1);
-			$this->cache->delete($data['user']);
-
-			return [
-				'success' => true,
-				'result' => __('Vote removed', 'jvb'),
-			];
-		});
-    }
-
-    /**
-     * @param string $content
-     * @param int $ID
-     * @param string $vote
-     * @param int $value
-     *
-     * @return void
-     */
-    protected function updateVoteCount(string $content, string $type, int $ID, string $vote, int $value):void
-    {
-		$key = ($vote === 'down') ? BASE.'downvotes' : BASE.'upvotes';
-
-		switch ($type) {
-			case 'post':
-				$old = (int) get_post_meta($ID, $key, true);
-				$new = max(0, $old + $value);
-				update_post_meta($ID, $key, $new);
-
-				$up = (int) get_post_meta($ID, BASE.'upvotes', true);
-				$down = (int) get_post_meta($ID, BASE.'downvotes', true);
-				update_post_meta($ID, BASE.'karma', $up - $down);
-				break;
-
-			case 'term':
-				$old = (int) get_term_meta($ID, $key, true);
-				$new = max(0, $old + $value);
-				update_term_meta($ID, $key, $new);
-
-				$up = (int) get_term_meta($ID, BASE.'upvotes', true);
-				$down = (int) get_term_meta($ID, BASE.'downvotes', true);
-				update_term_meta($ID, BASE.'karma', $up - $down);
-				break;
-
-			case 'user':
-				$old = (int) get_user_meta($ID, $key, true);
-				$new = max(0, $old + $value);
-				update_user_meta($ID, $key, $new);
-
-				$up = (int) get_user_meta($ID, BASE.'upvotes', true);
-				$down = (int) get_user_meta($ID, BASE.'downvotes', true);
-				update_user_meta($ID, BASE.'karma', $up - $down);
-				break;
-
-			case 'response':
-				$field = str_replace(BASE, '', $key);
-				CustomTable::for('responses')->query(
-					"UPDATE {table}
-					 SET $field = GREATEST(0, $field + %d),
-					     karma = (upvotes - downvotes)
-					 WHERE id = %d",
-					[$value, $ID]
-				);
-				break;
+		$man = KarmaManager::getInstance($type);
+		if (!$man) {
+			return Response::validationError(['message' => __('Karma not set up', 'jvb')]);
 		}
+
+		[$success, $message] = $man->vote($user, $itemID, $content, $vote);
+
+		return match ($success) {
+			true, 'partial' => Response::success(['message' => $message]),
+			default => Response::error($message),
+		};
     }
 
+
+
     /**
      * @param WP_REST_Request $request
      *
@@ -280,27 +110,7 @@
 			return Response::success($cache);
 		}
 
-		$votes = [];
-
-		foreach (jvbGlobalKarma() as $type => $content_types) {
-			foreach ($content_types as $content_type) {
-				$table = CustomTable::for('karma_' . $content_type);
-
-				// Skip if table doesn't exist
-				global $wpdb;
-				if ($wpdb->get_var("SHOW TABLES LIKE '{$table->getFullTableName()}'") != $table->getFullTableName()) {
-					continue;
-				}
-
-				$results = $table->where(['user_id' => $user])->getResults();
-
-				if (!empty($results)) {
-					foreach ($results as $vote) {
-						$votes[$content_type][$vote->item_id] = $vote->vote;
-					}
-				}
-			}
-		}
+		$votes = KarmaManager::getUserVotes($user);
 
 		$this->cache->set($user, $votes);
 

--
Gitblit v1.10.0