cacheName = 'karma'; $this->cacheTtl = DAY_IN_SECONDS; parent::__construct(); add_filter(BASE.'handle_bulk_operation', [$this, 'processOperation'], 10, 3); } /** * Registers vote routes * @return void */ public function registerRoutes():void { Route::for('vote') ->post([$this, 'handleVote']) ->args([ 'user' => 'integer|required', 'id' => 'string|required', 'item_id' => 'integer|required', 'content' => 'string|required', 'vote' => 'string|required|enum:up,down', ]) ->auth('user') ->rateLimit(10) ->get([$this, 'getVotes']) ->args([ 'user' => 'integer', ]) ->auth('user') ->rateLimit(30) ->register(); } /** * @param WP_REST_Request $request * * @return WP_REST_Response */ public function handleVote(WP_REST_Request $request):WP_REST_Response { $content = sanitize_text_field($request->get_param('content')??''); $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, [true, false, null])) { return Response::validationError(['message' => __('Invalid item or vote attempt', 'jvb')]); } $user = absint($request->get_param('user')); if (!$this->userCheck($user)) { return Response::validationError(['message' => __('User doesn\'t match. Bot?', 'jvb')]); } $type = $registrar->getType()??false; if (!$type) { return Response::validationError(['message' => __('Invalid content type', 'jvb')]); } $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 * * @return WP_REST_Response */ public function getVotes(WP_REST_Request $request): WP_REST_Response { $user = absint($request->get_param('user') ?? get_current_user_id()); $cache = $this->cache->get($user); if ($cache) { return Response::success($cache); } $votes = KarmaManager::getUserVotes($user); $this->cache->set($user, $votes); return Response::success($votes); } }