PK     M.]
I  I    ReviewController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Exception;
use Throwable;
use Rvx\Services\ReviewService;
use Rvx\Utilities\Helper;
use Rvx\Services\CacheServices;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class ReviewController implements InvokableContract
{
    protected ReviewService $reviewService;
    protected CacheServices $cacheServices;
    public function __construct()
    {
        $this->reviewService = new ReviewService();
        $this->cacheServices = new CacheServices();
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function index($request)
    {
        $aggregation = \get_transient('rvx_admin_aggregation');
        if (empty($request->get_params()) && $aggregation) {
            $response = ['aggregations' => $aggregation['aggregations'], 'count' => $aggregation['count'], 'reviews' => $aggregation['reviews'], 'meta' => $aggregation['meta']];
            return Helper::rest($response)->success("Success");
        } else {
            $resp = $this->reviewService->getReviews($request->get_params());
            if ($resp->getStatusCode() === Response::HTTP_OK) {
                $this->aggregationDataStore($resp->getApiData());
            }
            return Helper::getApiResponse($resp);
        }
    }
    public function aggregationDataStore($data)
    {
        \delete_transient('rvx_admin_aggregation');
        \set_transient('rvx_admin_aggregation', $data, 3600);
    }
    public function adminAllReviewSaasCall($data)
    {
        $resp = $this->reviewService->reviewList($data);
        $isVisible = $data['isVisible'] ?? '';
        if ($resp->getStatusCode() === Response::HTTP_OK) {
            $this->storeVisibilityReview($resp->getApiData(), $isVisible);
        }
        return $this->enrichReviewList($resp);
    }
    private function enrichReviewList($resp)
    {
        if ($resp->getStatusCode() === Response::HTTP_OK) {
            $data = $resp->getApiData();
            if (isset($data['reviews']) && \is_array($data['reviews'])) {
                foreach ($data['reviews'] as &$review) {
                    if (isset($review['wp_post_id'])) {
                        $review['post_type'] = get_post_type($review['wp_post_id']);
                    }
                }
                return Helper::rest($data)->success($resp()->message, $resp->getStatusCode());
            }
        }
        return Helper::getApiResponse($resp);
    }
    public function reviewList($request)
    {
        try {
            $differentReview = $this->cacheServices->makeSaaSCallDecision();
            $this->visibilityPaginationSaasCall($request, $differentReview);
            $isVisible = $request->get_params()['isVisible'] ?? '';
            $transientKeys = ['published' => 'rvx_review_approve_data', 'pending' => 'rvx_review_pending_data', 'spam' => 'rvx_review_spam_data', 'trash' => 'rvx_review_trash_data'];
            if (\array_key_exists($isVisible, $transientKeys)) {
                $approve = \get_transient($transientKeys[$isVisible]);
                $params = $request->get_params();
                $filterParams = ['page', 'rating', 'date', 'reviewer', 'search', 'product', 'category', 'oldest_first', 'newest_first'];
                if (\array_intersect_key(\array_flip($filterParams), $params)) {
                    $resp = $this->reviewService->reviewList($params);
                    return $this->enrichReviewList($resp);
                } elseif ($approve) {
                    $response = ['count' => $approve['count'], 'reviews' => $approve['reviews'], 'meta' => $approve['meta']];
                    return Helper::rest($response)->success("Success");
                } else {
                    $this->adminAllReviewSaasCall($params);
                }
            }
            if (empty($request->get_params())) {
                $data = \get_transient('rvx_reviews_data_list');
                if ($data) {
                    $response = ['count' => $data['count'], 'reviews' => $data['reviews'], 'meta' => $data['meta']];
                    return Helper::rest($response)->success("Success");
                } else {
                    $resp = $this->reviewService->reviewList($request->get_params());
                    if ($resp->getStatusCode() === Response::HTTP_OK && empty($request->get_params())) {
                        $this->reviewListStoreInDB($resp->getApiData());
                    }
                    return $this->enrichReviewList($resp);
                }
            } else {
                $resp = $this->reviewService->reviewList($request->get_params());
                return $this->enrichReviewList($resp);
            }
        } catch (Exception $e) {
            \error_log("Error fetching review list: " . $e->getMessage());
        }
    }
    public function visibilityPaginationSaasCall($request, $differentReview)
    {
        if ($differentReview === \true) {
            $this->adminAllReviewSaasCall($request->get_params());
        }
    }
    public function reviewListStoreInDB($reviewData)
    {
        \delete_transient('rvx_reviews_data_list');
        \set_transient('rvx_reviews_data_list', $reviewData, 3600);
    }
    public function storeVisibilityReview($data, $visibility)
    {
        if ($visibility === 'published') {
            \delete_transient('rvx_review_approve_data');
            \set_transient('rvx_review_approve_data', $data, 3600);
        }
        if ($visibility === 'pending') {
            \delete_transient('rvx_review_pending_data');
            \set_transient('rvx_review_pending_data', $data, 3600);
        }
        if ($visibility === 'spam') {
            \delete_transient('rvx_review_spam_data');
            \set_transient('rvx_review_spam_data', $data, 3600);
        }
        if ($visibility === 'trash') {
            \delete_transient('rvx_review_trash_data');
            \set_transient('rvx_review_trash_data', $data, 3600);
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function show($request)
    {
        $resp = $this->reviewService->getReview($request);
        return Helper::getApiResponse($resp);
    }
    /**
     * @param $request
     * @return Response
     */
    public function store($request)
    {
        try {
            // Temporarily disable comment notification emails
            remove_action('comment_post', 'wp_notify_postauthor');
            add_filter('comments_notify', '__return_false');
            $resp = $this->reviewService->createReview($request);
            // Re-enable the comment notification emails
            add_action('comment_post', 'wp_notify_postauthor');
            remove_filter('comments_notify', '__return_false');
            // Clear caches
            $this->cacheServices->removeCache();
            $postId = $request->get_param('wp_post_id');
            if ($postId) {
                $this->cacheServices->removeProductCache($postId);
            }
            return Helper::getApiResponse($resp);
        } catch (Exception $e) {
            // Re-enable the comment notification emails in case of error
            add_action('comment_post', 'wp_notify_postauthor');
            remove_filter('comments_notify', '__return_false');
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Not Create', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function update($request)
    {
        try {
            $resp = $this->reviewService->updateReview($request);
            if ($resp->getStatusCode() >= 200 && $resp->getStatusCode() < 300) {
                // 1. Clear site-wide generic caches
                $this->cacheServices->removeCache();
                // 2. Clear product-specific caches (Insight & Latest Reviews)
                $postId = $request->get_param('wp_post_id');
                if ($postId) {
                    \delete_transient("rvx_{$postId}_latest_reviews_insight");
                    \delete_transient("rvx_{$postId}_latest_reviews");
                }
            }
            return Helper::getApiResponse($resp);
        } catch (Exception $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Update Failed', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function delete($request)
    {
        try {
            $resp = $this->reviewService->deleteReview($request);
            $this->cacheServices->removeCache();
            return $resp;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function restoreReview($request)
    {
        try {
            $response = $this->reviewService->restoreReview($request);
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function verify($request)
    {
        try {
            $resp = $this->reviewService->isVerify($request);
            $this->cacheServices->removeCache();
            return $resp;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Not Change', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function visibility($request)
    {
        try {
            $response = $this->reviewService->isvisibility($request);
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Not Change', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function updateReqEmail($request)
    {
        try {
            $resp = $this->reviewService->updateReqEmail($request);
            $this->cacheServices->removeCache();
            return $resp;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function replies($request)
    {
        try {
            $resp = $this->reviewService->reviewReplies($request);
            return $resp;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Reply Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function repliesUpdate($request)
    {
        try {
            $resp = $this->reviewService->reviewRepliesUpdate($request);
            return Helper::rvxApi($resp)->success('Review Reply Updated');
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Reply Updated Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function replyDelete($request)
    {
        try {
            $resp = $this->reviewService->reviewRepliesDelete($request);
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function aiReview($request)
    {
        try {
            // Temporarily disable comment notification emails
            remove_action('comment_post', 'wp_notify_postauthor');
            add_filter('comments_notify', '__return_false');
            $resp = $this->reviewService->aiReview($request);
            // Re-enable the comment notification emails
            add_action('comment_post', 'wp_notify_postauthor');
            remove_filter('comments_notify', '__return_false');
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            // Re-enable the comment notification emails in case of error
            add_action('comment_post', 'wp_notify_postauthor');
            remove_filter('comments_notify', '__return_false');
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function aiReviewCount()
    {
        try {
            $resp = $this->reviewService->aiReviewCount();
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Ai Review Count', $e->getCode());
        }
    }
    public function aggregationMeta($request)
    {
        try {
            $response = $this->reviewService->aggregationMeta($request);
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function reviewBulkUpdate($request)
    {
        try {
            $response = $this->reviewService->reviewBulkUpdate($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function reviewBulkTrash($request)
    {
        try {
            $response = $this->reviewService->reviewBulkTrash($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function reviewEmptyTrash($request)
    {
        try {
            $response = $this->reviewService->reviewEmptyTrash($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Empty Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function restoreTrashItem($request)
    {
        //Bulk trash
        try {
            $response = $this->reviewService->restoreTrashItem($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     *
     * @return Response
     */
    public function reviewAggregation()
    {
        try {
            $resp = $this->reviewService->reviewAggregation();
            // dd($resp->getApiData());
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Aggregation Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function reviewMoveToTrash($request)
    {
        try {
            $response = $this->reviewService->reviewMoveToTrash($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Move to trash Fails', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function highlight($request)
    {
        try {
            $response = $this->reviewService->highlight($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails(__('Review Highlight', 'reviewx'), $e->getCode());
        }
    }
    public function bulkTenReviews($request)
    {
        try {
            $response = $this->reviewService->bulkTenReviews($request->get_params());
            $this->cacheServices->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails(__('Latest ten reviews fails', 'reviewx'), $e->getCode());
        }
    }
    public function bulkActionProductMeta($request)
    {
        try {
            foreach ($request->get_params() as $item) {
                if (!Helper::arrayGet($item, 'product_wp_id')) {
                    return "No product found";
                }
                $reviewAndMeta = ['reviews' => Helper::arrayGet($item, 'reviews'), 'meta' => Helper::arrayGet($item, 'meta')];
                $latest_ten_review = \json_encode($reviewAndMeta, \true);
                \set_transient("rvx_{$item['product_wp_id']}_latest_reviews", $latest_ten_review, 604800);
                // Expires in 7 days
                return Helper::rest()->success("Success");
            }
        } catch (Exception $e) {
            \error_log($e->getMessage());
            return Helper::rest($e->getMessage())->fails("Fail");
        }
    }
    /**
     *
     * @return Response
     */
    public function reviewListMultiCriteria()
    {
        $resp = $this->reviewService->reviewListMultiCriteria();
        return Helper::getApiResponse($resp);
    }
    /**
     * @param $request
     * @return Response
     */
    public function getSingleProductAllReviews($request)
    {
        try {
            $resp = $this->reviewService->getSingleProductAllReviews($request);
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('failed', $e->getCode());
        }
    }
}
PK     M.]c&  &    CategoryController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\CategoryService;
use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class CategoryController implements InvokableContract
{
    protected $categoryService;
    /**
     * @param CategoryService $categoryService
     */
    public function __construct(CategoryService $categoryService)
    {
        $this->categoryService = $categoryService;
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function selectable()
    {
        $resp = $this->categoryService->selectable();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function getCategory()
    {
        $resp = $this->categoryService->getCategory();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function getCategoryAll()
    {
        $resp = $this->categoryService->getCategoryAll();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function storeCategory($request)
    {
        $resp = $this->categoryService->storeCategory($request->get_params());
        return Helper::getApiResponse($resp);
    }
}
PK     M.]gQw_  _    PingController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Exception;
use WP_REST_Response;
use Rvx\Services\PingService;
use Rvx\Utilities\Helper;
class PingController
{
    protected PingService $pingService;
    public function __construct()
    {
        $this->pingService = new PingService();
    }
    /**
     * Ping from sass and (cached for 2 hours) return site info.
     *
     * @return WP_REST_Response
     */
    public function ping() : WP_REST_Response
    {
        // Cache time-to-live: 2 hours
        $cache_duration = 3600 * 2;
        try {
            // Try to get cache
            $data = \get_transient('rvx_ping_cache');
            if (\false === $data) {
                // Cache miss: fetch fresh data, store and return
                $data = $this->pingService->ping();
                \set_transient('rvx_ping_cache', $data, $cache_duration);
            }
            return Helper::rvxApi($data)->success(__('Plugin Active', 'reviewx'), 200);
        } catch (Exception $e) {
            return Helper::rvxApi()->fails(__('Plugin deactivated or uninstalled', 'reviewx'), 404);
        }
    }
}
PK     M.]7H      DashboardController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\DashboardServices;
use Rvx\Utilities\Helper;
use Throwable;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class DashboardController implements InvokableContract
{
    protected $dashboardServices;
    /**
     *
     */
    public function __construct(DashboardServices $dashboardServices)
    {
        $this->dashboardServices = $dashboardServices;
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function insight()
    {
        $resp = $this->dashboardServices->insight();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function requestEmail()
    {
        $resp = $this->dashboardServices->requestEmail();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return \WPDrill\Response
     */
    public function requestUserData()
    {
        try {
            $response = $this->dashboardServices->requestUserData();
            return Helper::rvxApi($response)->success('Site data Retrieved Successfully');
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Site data Retrieval Failed', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function chart($request)
    {
        $resp = $this->dashboardServices->chart($request->get_params());
        return Helper::getApiResponse($resp);
    }
}
PK     M.]CZ;s  s    DataSyncController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use WP_REST_Request;
use Rvx\CPT\CptHelper;
use Rvx\Models\Site;
use Rvx\Services\DataSyncService;
use Rvx\Services\SettingService;
use Rvx\Utilities\Helper;
use Throwable;
class DataSyncController
{
    protected SettingService $settingService;
    protected DataSyncService $dataSyncService;
    public function __construct()
    {
        $this->dataSyncService = new DataSyncService();
        $this->settingService = new SettingService();
    }
    public function dataSync()
    {
        $resp = $this->dataSyncService->dataSync('default');
        if ($resp) {
            return Helper::rvxApi()->success('Data Sync Success');
        } else {
            return Helper::rvxApi()->fails('Data Sync Failed');
        }
    }
    public function dataSynComplete()
    {
        // Update all DB settings from API to WP DB
        $this->updateSettingsOnSync();
        return Site::where("is_saas_sync", 0)->update(['is_saas_sync' => 1]);
    }
    public function syncStatus()
    {
        \header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
        \header("Pragma: no-cache");
        \header("Pragma: no-cache");
        $response = $this->dataSyncService->syncStatus();
        if (!empty($response->getApiData()['sync_stats']) && $response->getApiData()['sync_stats'] === 1) {
            // Update all DB settings from API to WP DB
            $this->updateSettingsOnSync();
            Site::where("is_saas_sync", 0)->update(['is_saas_sync' => 1]);
        }
        return Helper::saasResponse($response);
    }
    public function updateSettingsOnSync()
    {
        // Save '_rvx_cpt_settings' data after sync is completed from Sass API to WP DB
        $response = (new \Rvx\Rest\Controllers\CptController())->cptGetOnSync();
        if ($response[0] === \true) {
            // Get the enabled post types array
            $used_post_types = (new CptHelper())->usedCPTOnSync('used');
            // Loop through each post type and call getApiReviewSettings
            foreach ($used_post_types as $post_type) {
                $review_response = (new \Rvx\Rest\Controllers\SettingController())->getApiReviewSettingsOnSync($post_type);
                // Update Review settings
                $review_settings = $review_response['data']['review_settings'];
                $this->settingService->updateReviewSettingsOnSync($review_settings, \strtolower($post_type));
            }
        }
        // Get widget settings
        $widget_response = (new \Rvx\Rest\Controllers\SettingController())->getApiWidgetSettingsOnSync();
        $widget_settings = $widget_response['data']['widget_settings'];
        // Update widget settings
        $this->settingService->updateWidgetSettings($widget_settings);
    }
    public function dataManualSync($request)
    {
        try {
            $response = $this->dataSyncService->dataManualSync($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('General settings saved failed', $e->getCode());
        }
    }
    public function syncedData(WP_REST_Request $request)
    {
        $post_type = $request->get_param('post_type') ?? 'product';
        // Sanitize just in case:
        $post_type = sanitize_key($post_type);
        if ($post_type === 'product') {
            $file_name = "shop-bulk-data.jsonl";
        } else {
            $file_name = "{$post_type}-cpt-bulk-data.jsonl";
        }
        $file_path = WP_CONTENT_DIR . '/uploads/reviewx/' . $file_name;
        if (!\file_exists($file_path)) {
            return Helper::rvxApi()->fails('File not found for post_type: ' . $post_type, 404);
        }
        \header('Content-Description: File Transfer');
        \header('Content-Type: application/jsonl');
        \header('Content-Disposition: attachment; filename="' . \basename($file_path) . '"');
        \header('Expires: 0');
        \header('Cache-Control: must-revalidate');
        \header('Pragma: public');
        \header('Content-Length: ' . \filesize($file_path));
        \readfile($file_path);
        exit;
    }
}
PK     M.]..%      LogController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Exception;
use Rvx\Services\CategorySyncService;
use Rvx\Services\DataSyncService;
use Rvx\Services\OrderItemSyncService;
use Rvx\Services\ProductSyncService;
use Rvx\Services\ReviewSyncService;
use Rvx\Services\UserSyncService;
use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\Services\CacheServices;
class LogController implements InvokableContract
{
    protected CacheServices $cacheServices;
    public function __construct()
    {
        $this->cacheServices = new CacheServices();
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    public function rvxRecentLog($request)
    {
        $data = $request->get_params();
        $this->directoryCreate($data);
        $this->logDownload($data);
        $this->deleteLog($data);
    }
    public function directoryCreate($data)
    {
        if ($data['action'] === 'dir') {
            $log_folder = RVX_DIR_PATH . 'log/';
            if (!\file_exists($log_folder) && !\mkdir($log_folder, 0755, \true) && !\is_dir($log_folder)) {
                throw new \RuntimeException(\sprintf('Directory "%s" was not created', $log_folder));
            }
        }
    }
    public function logDownload($data)
    {
        if ($data['action'] === 'log') {
            $logPath = RVX_DIR_PATH . 'log/';
            $files = \glob($logPath . '*');
            if (empty($files)) {
                echo 'No log files found';
            }
            $recentFile = null;
            foreach ($files as $file) {
                if (\is_null($recentFile) || \filemtime($file) > \filemtime($recentFile)) {
                    $recentFile = $file;
                }
            }
            if (!\file_exists($recentFile)) {
                echo 'File not found';
            }
            \header('Content-Type: text/plain');
            \header('Content-Disposition: attachment; filename="' . \basename($recentFile) . '"');
            \header('Content-Length: ' . \filesize($recentFile));
            \ob_clean();
            \flush();
            \readfile($recentFile);
            exit;
        }
    }
    public function deleteLog($data)
    {
        if ($data['action'] === 'remove') {
            $log_folder = RVX_DIR_PATH . 'log/';
            if (!\is_dir($log_folder)) {
                echo 'Log folder does not exist';
            }
            $files = \glob($log_folder . '/*');
            foreach ($files as $file) {
                if (\is_file($file)) {
                    \unlink($file);
                }
            }
            if (\rmdir($log_folder)) {
                echo 'Log folder and files deleted successfully';
            } else {
                echo 'Failed to delete the log folder';
            }
        }
    }
    public function appendJsonSync($request)
    {
        $action = $request->get_param('action');
        $from = $request->get_param('from');
        if ($action === 'create_jsonl') {
            $this->createJsonl();
        }
        if ($action === 'download') {
            $this->downloadJsonl();
        }
        if ($action === 'manual_sync') {
            $dataResponse = (new DataSyncService())->dataSync($from);
            $this->cacheServices->removeCache();
            if (!$dataResponse) {
                return Helper::rvxApi(['error' => "Data Sync Failed"])->fails('Data Sync Failed', $dataResponse->getStatusCode());
            }
        }
        return Helper::rvxApi()->success('Data Synced Successfully');
    }
    public function createJsonl()
    {
        try {
            $file_path = RVX_DIR_PATH . 'sync.jsonl';
            $file = \fopen($file_path, 'w');
            $syncedCaterories = new CategorySyncService();
            $syncedCaterories->syncCategory($file);
            (new UserSyncService())->syncUser($file);
            $processProduct = new ProductSyncService($syncedCaterories);
            $processProduct->processProductForSync($file);
            (new ReviewSyncService($processProduct))->processReviewForSync($file);
            if (\class_exists('WooCommerce')) {
                $order = new OrderItemSyncService();
                $order->syncOrder($file);
                $order->syncOrderItem($file);
            }
            echo 'jsonl create done';
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }
    public function downloadJsonl()
    {
        $syncJsonlDownload = RVX_DIR_PATH . 'sync.jsonl';
        if (\file_exists($syncJsonlDownload)) {
            \header('Content-Type: text/plain');
            \header('Content-Disposition: attachment; filename="' . \basename($syncJsonlDownload) . '"');
            \header('Content-Length: ' . \filesize($syncJsonlDownload));
            \header('Content-Length: ' . \filesize($syncJsonlDownload));
            \ob_clean();
            \flush();
            \readfile($syncJsonlDownload);
            \unlink($syncJsonlDownload);
            exit;
        }
    }
}
PK     M.]7r5  5    UserController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\UserServices;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class UserController implements InvokableContract
{
    protected UserServices $userServices;
    /**
     *
     */
    public function __construct()
    {
        $this->userServices = new UserServices();
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function getUser()
    {
        return $this->userServices->getUser();
    }
}
PK     M.]UO  O    WPDrillController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\DB\QueryBuilder\QueryBuilderHandler;
use Rvx\WPDrill\Response;
class WPDrillController implements InvokableContract
{
    protected QueryBuilderHandler $db;
    /**
     * @param QueryBuilderHandler $db
     */
    public function __construct(QueryBuilderHandler $db)
    {
        $this->db = $db;
    }
    /**
     * @return Response
     */
    public function __invoke()
    {
        //        $user = User::where('id', 1)->first();
        //        //$user = $this->db->table('users')->where('id', 1)->first();
        //        return rvx_rest($site)
        //            ->setHeader('Content-Type', 'application/json')
        //            ->details('User fetched successfully')
        //            ->success("User found");
    }
}
PK     M.]Q/  Q/    AuthController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Exception;
use Rvx\Api\AuthApi;
use Rvx\CPT\CptHelper;
use Rvx\Handlers\MigrationRollback\MigrationPrompt;
use Rvx\Handlers\MigrationRollback\ReviewXChecker;
use Rvx\Models\Site;
use Rvx\Services\Api\LoginService;
use Rvx\Services\DataSyncService;
use Rvx\Services\SettingService;
use Rvx\Utilities\Auth\Client;
use Rvx\Utilities\Helper;
use Throwable;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
use Rvx\Services\CacheServices;
class AuthController implements InvokableContract
{
    protected LoginService $loginService;
    protected DataSyncService $dataSyncService;
    protected CacheServices $cacheServices;
    public function __construct()
    {
        $this->loginService = new LoginService();
        $this->dataSyncService = new DataSyncService();
        $this->cacheServices = new CacheServices();
    }
    public function __invoke()
    {
    }
    /**
     * @param $request
     * @return Response
     */
    public function login($request)
    {
        $data = $request->get_params();
        $data['multicriteria'] = $this->multicriteriaOptions();
        $payload = \array_merge($data, Helper::getWpClientInfo());
        //return Helper::rvxApi(['error' => 'Invalid request', 'data' => $payload])->fails('Invalid request', Response::HTTP_BAD_REQUEST);
        try {
            $response = (new AuthApi())->login($payload);
            if ($response->getStatusCode() !== Response::HTTP_OK) {
                return Helper::saasResponse($response);
            }
            $apiData = $response->getApiData();
            $validation = $this->validateSite($apiData);
            if ($validation !== \true) {
                return $validation;
                // return error response
            }
            $site_info = $this->prepareData($apiData);
            $site = Site::where('uid', $site_info['uid'])->first();
            if (!$site) {
                $site = Site::insert($site_info);
            } else {
                Site::where("id", $site->id)->update($site_info);
            }
            Client::set(Site::where('uid', $site_info['uid'])->first());
            $dataResponse = $this->dataSyncService->dataSync('login', 'product');
            if (!$dataResponse) {
                return Helper::rvxApi(['error' => 'Data sync fails'])->fails('Data sync fails', $dataResponse->getStatusCode());
            }
            // Sleep for 1 seconds
            \sleep(1);
            // Upload CPT data to Saas
            $enabled_post_types = (new CptHelper())->usedCPTOnSync('used');
            unset($enabled_post_types['product']);
            // Exclude 'product' post type
            // Loop through each post type and hook into the actions/filters dynamically
            foreach ($enabled_post_types as $post_type) {
                $this->dataSyncService->dataSync('default', $post_type);
            }
            $this->cacheServices->removeCache();
            $this->loginService->resetPostMeta();
            // Set the localStorage isAlreadySyncSuccess
            \set_transient('rvx_reset_sync_flag', \true);
            return Helper::saasResponse($response);
        } catch (Exception $e) {
            $errorCode = $e->getCode() === 0 ? Response::HTTP_INTERNAL_SERVER_ERROR : $e->getCode();
            $message = $e->getCode() === 0 ? 'Internal Server Error' : $e->getMessage();
            return Helper::rvxApi(['error' => $message])->fails($message, $errorCode);
        }
    }
    public function license_key($request)
    {
        $data = $request->get_params();
        $data['multicriteria'] = $this->multicriteriaOptions();
        $payload = \array_merge($data, Helper::getWpClientInfo());
        try {
            $response = (new AuthApi())->licenseLogin($payload);
            if ($response->getStatusCode() !== Response::HTTP_OK) {
                return Helper::saasResponse($response);
            }
            $apiData = $response->getApiData();
            $validation = $this->validateSite($apiData);
            if ($validation !== \true) {
                return $validation;
                // return error response
            }
            $site_info = $this->prepareData($apiData);
            $site = Site::where('uid', $site_info['uid'])->first();
            if (!$site) {
                $site = Site::insert($site_info);
            } else {
                Site::where("id", $site->id)->update($site_info);
            }
            Client::set(Site::where('uid', $site_info['uid'])->first());
            $dataResponse = $this->dataSyncService->dataSync('login', 'product');
            if (!$dataResponse) {
                return Helper::rvxApi(['error' => 'Data sync fails'])->fails('Data sync fails', $dataResponse->getStatusCode());
            }
            // Sleep for 1 seconds
            \sleep(1);
            // Upload CPT data to Saas
            $enabled_post_types = (new CptHelper())->usedCPTOnSync('used');
            unset($enabled_post_types['product']);
            // Exclude 'product' post type
            // Loop through each post type and hook into the actions/filters dynamically
            foreach ($enabled_post_types as $post_type) {
                $this->dataSyncService->dataSync('default', $post_type);
            }
            $this->cacheServices->removeCache();
            $this->loginService->resetPostMeta();
            // Set the localStorage isAlreadySyncSuccess
            \set_transient('rvx_reset_sync_flag', \true);
            return Helper::saasResponse($response);
        } catch (Exception $e) {
            $errorCode = $e->getCode() === 0 ? Response::HTTP_INTERNAL_SERVER_ERROR : $e->getCode();
            $message = $e->getCode() === 0 ? 'Internal Server Error' : $e->getMessage();
            return Helper::rvxApi(['error' => $message])->fails($message, $errorCode);
        }
    }
    protected function prepareData(array $site) : array
    {
        return ['site_id' => $site['id'], 'uid' => $site['uid'], 'name' => $site['name'], 'domain' => $site['domain'], 'url' => $site['url'], 'locale' => $site['locale'], 'email' => $site['email'], 'secret' => $site['key'], 'is_saas_sync' => 0, 'created_at' => \wp_date('Y-m-d H:i:s'), 'updated_at' => \wp_date('Y-m-d H:i:s')];
    }
    public function multicriteriaOptions()
    {
        $data = [];
        $isOldReviewXExists = ReviewXChecker::isReviewXExists();
        $isReviewXSaaSExists = ReviewXChecker::isReviewXSaasExists();
        if ($isOldReviewXExists && !$isReviewXSaaSExists) {
            $options = \get_option('_rx_option_review_criteria');
            $keys = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
            $criterias = [];
            $i = 0;
            foreach ($options as $key => $name) {
                if (isset($keys[$i])) {
                    $criterias[] = ["key" => $keys[$i], "name" => $name];
                }
                $i++;
            }
            $multicrtriaEnableorDisable = \get_option('_rx_option_allow_multi_criteria');
            $data = ["enable" => $multicrtriaEnableorDisable == 1 ? \true : \false, "criterias" => $criterias];
        } elseif ($isReviewXSaaSExists) {
            $data = (array) (new SettingService())->getReviewSettings('product') ?? [];
            $data = $data['reviews']['multicriteria'];
        }
        return $data;
    }
    public function forgetPassword($request)
    {
        try {
            $response = $this->loginService->forgetPassword($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Forget password fail', $e->getCode());
        }
    }
    public function resetPassword($request)
    {
        try {
            $response = $this->loginService->resetPassword($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Reset password fail', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function register($request)
    {
        $data = $request->get_params();
        $payload = \array_merge($data, Helper::getWpClientInfo());
        try {
            $response = (new AuthApi())->register($payload);
            if ($response->getStatusCode() !== Response::HTTP_OK) {
                return Helper::saasResponse($response);
            }
            $apiData = $response->getApiData();
            $validation = $this->validateSite($apiData);
            if ($validation !== \true) {
                return $validation;
                // return error response
            }
            $site_info = $this->prepareRegisterData($apiData['site']);
            $site = Site::where('uid', $site_info['uid'])->first();
            if (!$site) {
                $site = Site::insert($site_info);
            } else {
                Site::where("id", $site->id)->update($site_info);
            }
            Client::set(Site::where('uid', $site_info['uid'])->first());
            $dataResponse = $this->dataSyncService->dataSync('register', 'product');
            if (!$dataResponse) {
                return Helper::rvxApi(['error' => "Registration Fail"])->fails('Registration Fail', $dataResponse->getStatusCode());
            }
            $this->cacheServices->removeCache();
            $this->loginService->resetPostMeta();
            $this->removeUserSettingsFormLocal();
            // Set the localStorage isAlreadySyncSuccess
            \set_transient('rvx_reset_sync_flag', \true);
            return Helper::saasResponse($response);
        } catch (Exception $e) {
            $errorCode = $e->getCode() === 0 ? Response::HTTP_INTERNAL_SERVER_ERROR : $e->getCode();
            $message = $e->getCode() === 0 ? 'Internal Server Error' : $e->getMessage();
            return Helper::rvxApi(['error' => $message])->fails($message, $errorCode);
        }
    }
    public function migrationPrompt()
    {
        $migrationData = new MigrationPrompt();
        $result = \false;
        if (ReviewXChecker::isReviewXExists() && !ReviewXChecker::isReviewXSaasExists()) {
            $result = $migrationData->rvx_retrieve_old_plugin_options_data();
        } elseif (ReviewXChecker::isReviewXSaasExists()) {
            $result = $migrationData->rvx_retrieve_saas_plugin_options_data();
        }
        if ($result !== \false) {
            $successMessage = "Old Data found";
            return Helper::rvxApi($result)->success($successMessage, 200);
        } else {
            $failsMessage = "No Data found";
            return Helper::rvxApi(null)->success($failsMessage, 200);
        }
    }
    public function removeUserSettingsFormLocal()
    {
        global $wpdb;
        $option_name = '__user_setting_access';
        $exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->options} WHERE option_name = %s", $option_name));
        if ($exists > 0) {
            $result = $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name = %s", $option_name));
            if ($result !== \false) {
                return ["Success" => "Options Table Delete"];
            }
        }
    }
    /**
     * Validate API response for required site data.
     *
     * @param array $apiData
     * @return bool
     */
    private function validateSite(array $apiData) : bool
    {
        if (!\is_array($apiData) && !isset($apiData['id']) && !isset($apiData['uid'])) {
            return \false;
        }
        return \true;
    }
    protected function prepareRegisterData(array $site) : array
    {
        return ['site_id' => $site['id'], 'uid' => $site['uid'], 'name' => $site['name'], 'domain' => $site['domain'], 'url' => $site['url'], 'locale' => $site['locale'], 'email' => $site['email'], 'secret' => $site['key'], 'is_saas_sync' => 0, 'created_at' => \wp_date('Y-m-d H:i:s'), 'updated_at' => \wp_date('Y-m-d H:i:s')];
    }
}
PK     M.]ʨ      FileController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
class FileController implements InvokableContract
{
    public function __invoke()
    {
    }
    public function upload($request)
    {
        $file = $request->get_file('file');
        $response = $this->categoryService->processCategoryForSync($file);
        return Helper::saasResponse($response);
    }
}
PK     M.]QK      ImportExportController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Throwable;
use Rvx\WPDrill\Response;
use Rvx\Utilities\Helper;
use Rvx\Services\CacheServices;
use Rvx\Services\ImportExportServices;
use Rvx\WPDrill\Contracts\InvokableContract;
class ImportExportController implements InvokableContract
{
    protected ImportExportServices $importExportServices;
    protected CacheServices $cacheServices;
    /**
     *
     */
    public function __construct(ImportExportServices $importExportServices, CacheServices $cacheServices)
    {
        $this->importExportServices = $importExportServices;
        $this->cacheServices = $cacheServices;
    }
    public function __invoke()
    {
        // This method is required by the InvokableContract but not used in this controller.
    }
    /**
     * @param $request
     * @return Response
     */
    public function importSupportedAppStore($request)
    {
        try {
            $response = $this->importExportServices->importSupportedAppStore($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     * @throws Throwable
     */
    public function importStore($request)
    {
        try {
            $response = $this->importExportServices->importStore($request);
            $this->cacheServices->removeCache();
            return Helper::rest($response['data'] ?? [])->success($response['message'] ?? 'Review Import started');
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Import Failed', $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function exportCsv($request)
    {
        try {
            $response = $this->importExportServices->exportCsv($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function exportHistory()
    {
        $resp = $this->importExportServices->exportHistory();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function importHistory()
    {
        $resp = $this->importExportServices->importHistory();
        return Helper::getApiResponse($resp);
    }
    public function importRollback($request)
    {
        try {
            $response = $this->importExportServices->importRollback($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    public function importRestore($request)
    {
        try {
            $response = $this->importExportServices->importRestore($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Visibility Change', $e->getCode());
        }
    }
    public function rollbackReviews($request)
    {
        try {
            $response = $this->importExportServices->rollbackImportByIds($request->get_params());
            return Helper::rest($response)->success($response['message'] ?? 'Review Rollback Success');
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Rollback Failed', $e->getCode());
        }
    }
}
PK     M.]]      DiscountController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\DiscountService;
use Rvx\Utilities\Auth\Client;
use Rvx\Utilities\Helper;
use Throwable;
use Rvx\WPDrill\Response;
class DiscountController
{
    protected $couponService;
    /**
     * @param DiscountService $couponService
     */
    public function __construct(DiscountService $couponService)
    {
        $this->couponService = $couponService;
    }
    /**
     * @param $request
     * @return Response
     */
    public function wpDiscountCreate($request) : Response
    {
        try {
            $coupon = $this->couponService->wpDiscountCreate($request->get_params());
            if (!$coupon) {
                return Helper::rvxApi()->success('Failed to create discount');
            }
            $couponData = $coupon->get_data();
            $couponId = Helper::arrayGet($couponData, 'id');
            $payload = ['wp_id' => $couponId, 'wp_unique_id' => Client::getUid() . '-' . $couponId, 'code_type' => $request->get_param('code_type'), 'status' => 1, 'site_id' => Client::getSiteId(), 'request_type' => $request->get_param('request_type'), 'type' => $request->get_param('discount_type') === 'percent' ? 'percentage' : 'fixed_amount', 'value' => Helper::arrayGet($couponData, 'amount'), 'usage_limit_per_user' => $request->get_param('usage_limit_per_user') ?? 0, 'usage_limit_per_coupon' => $request->get_param('usage_limit') ?? 0, 'minimum_amount' => (int) Helper::arrayGet($couponData, 'minimum_amount'), 'maximum_amount' => (int) Helper::arrayGet($couponData, 'maximum_amount'), 'exclude_sale_items_from_discount' => $request->get_param('exclude_sale_items_from_discount'), 'free_shipping' => $request->get_param('free_shipping'), 'can_be_used_with_other_coupon' => $request->get_param('individual_use'), 'single_code' => Helper::arrayGet($couponData, 'code'), 'start_date' => $request->get_param('start_date') ?? \date('Y-m-d'), 'start_time' => $request->get_param('start_time'), 'expires_in' => $request->get_param('expires_in'), 'end_date' => $request->get_param('expiry_date'), 'end_time' => $request->get_param('end_time')];
            $resp = $this->couponService->saveDiscount($payload);
            if ($resp->getStatusCode() !== Response::HTTP_OK) {
                // Delete the created coupon if API request failed
                $this->couponService->deleteDiscount($couponId);
                return Helper::rvxApi()->fails('Failed to save discount to API');
            }
            return Helper::getApiResponse($resp);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Coupon Create Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function getDiscount()
    {
        $resp = $this->couponService->getDiscount();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function discountSetting()
    {
        $resp = $this->couponService->discountSetting();
        return Helper::getApiResponse($resp);
    }
    public function discountSettingsSave($request)
    {
        try {
            $response = $this->couponService->discountSettingsSave($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Coupon Create Fails', $e->getCode());
        }
    }
    public function saveDiscount($request)
    {
        try {
            $response = $this->couponService->saveDiscount($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Coupon Create Fails', $e->getCode());
        }
    }
    public function discountTemplateGet()
    {
        try {
            $response = $this->couponService->discountTemplateGet();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Coupon Template Get Fails', $e->getCode());
        }
    }
    public function discountTemplatePost($request)
    {
        try {
            $response = $this->couponService->discountTemplatePost($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Coupon Template Fails', $e->getCode());
        }
    }
    public function discountMessage($request)
    {
        try {
            $response = $this->couponService->discountMessage($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Discount Message', $e->getCode());
        }
    }
}
PK     M.]3}          SettingController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\SettingService;
use Rvx\Utilities\Auth\Client;
use Rvx\Utilities\Helper;
use Throwable;
use Rvx\WPDrill\Response;
class SettingController
{
    protected SettingService $settingService;
    public function __construct()
    {
        $this->settingService = new SettingService();
    }
    public function getApiReviewSettingsOnSync($cpt_type = 'product') : array
    {
        $data = ["cpt_type" => $cpt_type];
        $response = $this->settingService->getApiReviewSettings($data);
        return \json_decode($response, \true);
    }
    public function getApiReviewSettings($request) : Response
    {
        $cpt_type = \strtolower($request->get_param('cpt_type')) ? \strtolower($request->get_param('cpt_type')) : \false;
        $data = ["cpt_type" => $cpt_type];
        $response = $this->settingService->getApiReviewSettings($data);
        return Helper::getApiResponse($response);
    }
    public function wooCommerceVerificationRating()
    {
        $response = $this->settingService->wooCommerceVerificationRating();
        return $response;
    }
    public function wooVerificationRatingRequired()
    {
        $response = $this->settingService->wooVerificationRatingRequired();
        return $response;
    }
    public function userSettingsAccess($request)
    {
        $data = $request->get_params()['user_access'];
        \update_option('__user_setting_access', \json_encode($data));
    }
    public function saveApiReviewSettings($request)
    {
        try {
            $response = $this->settingService->saveApiReviewSettings($request->get_params());
            if ($response->getStatusCode() === Response::HTTP_OK) {
                // Update Review Settings
                $review_settings = $response->getApiData()['review_settings'];
                if (!empty($review_settings['reviews']['show_verified_badge']) && $review_settings['reviews']['show_verified_badge'] === \true) {
                    \update_option('woocommerce_review_rating_verification_label', 'yes');
                }
                if (!empty($review_settings['reviews']['show_verified_badge']) && $review_settings['reviews']['show_verified_badge'] === \false) {
                    \update_option('woocommerce_review_rating_verification_label', 'no');
                }
                if (!empty($review_settings['reviews']['review_submission_policy']['options']['verified_customer']) && $review_settings['reviews']['review_submission_policy']['options']['verified_customer'] === \true) {
                    \update_option('woocommerce_review_rating_verification_required', 'yes');
                }
                if (!empty($review_settings['reviews']['review_submission_policy']['options']['verified_customer']) && $review_settings['reviews']['review_submission_policy']['options']['verified_customer'] === \false) {
                    \update_option('woocommerce_review_rating_verification_required', 'no');
                }
                $this->settingService->updateReviewSettings($review_settings, $request['post_type']);
            }
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review settings saved failed', $e->getCode());
        }
    }
    public function wooCommerceVerificationRatingUpdate($request)
    {
        try {
            $response = $this->settingService->wooCommerceVerificationRatingUpdate($request->get_params());
            return $response;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review settings saved failed', $e->getCode());
        }
    }
    public function wooVerificationRating($request)
    {
        try {
            $response = $this->settingService->wooVerificationRating($request->get_params());
            return $response;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review settings saved failed', $e->getCode());
        }
    }
    public function getApiWidgetSettingsOnSync() : array
    {
        $response = $this->settingService->getApiWidgetSettings();
        return \json_decode($response, \true);
    }
    public function getApiWidgetSettings() : Response
    {
        $response = $this->settingService->getApiWidgetSettings();
        return Helper::getApiResponse($response);
    }
    public function userCurrentPlan()
    {
        $response = $this->settingService->userCurrentPlan();
        return Helper::getApiResponse($response);
    }
    public function saveApiWidgetSettings($request)
    {
        try {
            $response = $this->settingService->saveWidgetSettings($request->get_params());
            if ($response->getStatusCode() === Response::HTTP_OK) {
                // Update Widget Settings
                $widget_settings = $response->getApiData()['widget_settings'];
                $this->settingService->updateWidgetSettings($widget_settings);
            }
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Widget settings saved failed', $e->getCode());
        }
    }
    public function getApiGeneralSettings()
    {
        $response = $this->settingService->getApiGeneralSettings();
        return Helper::getApiResponse($response);
    }
    public function saveApiGeneralSettings($request)
    {
        try {
            $response = $this->settingService->saveApiGeneralSettings($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('General settings saved failed', $e->getCode());
        }
    }
    public function getSettingsData()
    {
        $data = ["review_settings" => ["reviews" => ["review_submission_policy" => ["options" => ["anyone" => \true, "verified_customer" => \false]], "show_verified_badge" => \false, "review_eligibility" => ["pending_payment" => \false, "processing" => \false, "on_hold" => \false, "completed_payment" => \true, "cancelled" => \false, "refunded" => \false, "failed" => \false, "draft" => \false], "auto_approve_reviews" => \true, "show_reviewer_name" => \true, "show_reviewer_country" => \true, "enable_likes_dislikes" => ["enabled" => \true, "options" => ["allow_likes" => \true, "allow_dislikes" => \false]], "allow_review_sharing" => \true, "allow_review_titles" => \true, "photo_reviews_allowed" => \true, "video_reviews_allowed" => \true, "allow_recommendations" => \true, "anonymous_reviews_allowed" => \true, "show_consent_checkbox" => \true, "allow_multiple_reviews" => \true, "multi_criteria_reviews" => ["enabled" => \true, "criteria" => ["Quality", "Price", "Size"]]]]];
        $json_data = \json_encode($data);
        \update_option('your_option_name', $json_data);
    }
    public function dataSyncStatus()
    {
        return ['sync' => Client::getSync() ? \true : \false];
    }
    public function allSettingsSave($request)
    {
        try {
            $response = $this->settingService->allSettingsSave($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('General settings saved failed', $e->getCode());
        }
    }
    public function removeCredentials($request)
    {
        try {
            $response = $this->settingService->removeCredentials($request->get_headers());
            return $response;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Sites Table Data deletion failed', $e->getCode());
        }
    }
    public function updateSiteData($request)
    {
        try {
            $response = $this->settingService->updateSiteData($request->get_headers());
            return $response;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Sites Table Data update failed', $e->getCode());
        }
    }
}
PK     M.]2$h  h    AccessController.phpnu         <?php

namespace Rvx\Rest\Controllers;

class AccessController
{
    public function adminAccess($request)
    {
        // do something
        //dd('Access Controller');
        $command = $request->get_params()['command'];
        //dd($command);
        if ($command === 'site_block') {
            $this->siteBlock();
        } elseif ($command === 'site_hit') {
            $this->siteHit();
        }
    }
    private function siteBlock()
    {
        // do something
        dd('Site Block Method');
    }
    private function siteHit()
    {
        // do something
        dd('Site Hit Method');
    }
}
PK     M.]}1  }1    CptController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\CPT\CptHelper;
use Rvx\Services\CptService;
use Rvx\Services\DataSyncService;
use Rvx\Services\SettingService;
use Rvx\Utilities\Helper;
use Rvx\Services\CacheServices;
use Throwable;
use Rvx\WPDrill\Response;
class CptController
{
    protected CptService $cptService;
    protected DataSyncService $dataSyncService;
    protected CacheServices $cacheServices;
    protected CptHelper $cptHelper;
    public function __construct()
    {
        $this->cptService = new CptService();
        $this->dataSyncService = new DataSyncService();
        $this->cacheServices = new CacheServices();
        $this->cptHelper = new CptHelper();
    }
    /**
     * @return array
     */
    public function cptGetOnSync()
    {
        $response = $this->cptService->cptGet();
        $status = $this->cptSettings($response);
        return [$status, \json_decode($response, \true)];
    }
    /**
     * @return Response
     */
    public function cptGet()
    {
        $response = $this->cptService->cptGet();
        $this->cptSettings($response);
        return Helper::getApiResponse($response);
    }
    /**
     * @return Response
     */
    public function cptStore($request)
    {
        try {
            $response = $this->cptService->cptStore($request->get_params());
            $resData = Helper::saasResponse($response);
            if ($response->getStatusCode() === 200) {
                // Update (_rvx_cpt_settings) CPT Settings
                $response = $this->cptService->cptGet();
                $this->cptSettings($response);
                // Update (_rvx_ettings_{post_type}) CPT Settings
                $post_type = $resData->data['data']['post_type'] ? \strtolower($resData->data['data']['post_type']) : '';
                if (!empty($post_type)) {
                    $review_response = (new \Rvx\Rest\Controllers\SettingController())->getApiReviewSettingsOnSync($post_type);
                    // Update Review settings
                    $review_settings = $review_response['data']['review_settings'];
                    (new SettingService())->updateReviewSettingsOnSync($review_settings, \strtolower($post_type));
                }
                // Upload CPT data to Saas
                $this->dataSyncService->dataSync('default', $post_type);
                $this->cacheServices->removeCache();
            }
            return Helper::rvxApi($resData)->success('Create Success', 200);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Create Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function cptUpdate($request)
    {
        try {
            $response = $this->cptService->cptUpdate($request->get_params());
            $resData = Helper::saasResponse($response);
            if ($response->getStatusCode() === 200) {
                // Update (_rvx_cpt_settings) CPT Settings
                $response = $this->cptService->cptGet();
                $this->cptSettings($response);
            }
            return Helper::rvxApi($resData)->success('Update Success', 200);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Update Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function cptDelete($request)
    {
        try {
            $response = $this->cptService->cptDelete($request->get_params());
            $resData = Helper::saasResponse($response);
            if ($response->getStatusCode() === 200) {
                // Update (_rvx_cpt_settings) CPT Settings
                $response = $this->cptService->cptGet();
                $this->cptSettings($response);
            }
            return Helper::rvxApi($resData)->success('Delete Success', 200);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Delete Fails', $e->getCode());
        }
    }
    public function customPostTypes($request)
    {
        try {
            // Available post types
            $cptList = \array_map(function ($cpt) {
                return ['name' => \strtolower($cpt['name']), 'slug' => \strtolower($cpt['slug'])];
            }, $this->cptHelper->getPublicCptList());
            // Post type settings from WPDB
            $cptSettings = $this->cptHelper->cptSettings();
            $enabled = [];
            $disabled = [];
            $used = [];
            $unused = [];
            // Extract post types from settings
            $reviewPostTypes = [];
            if (!empty($cptSettings['reviews'])) {
                foreach ($cptSettings['reviews'] as $review) {
                    $postType = \strtolower($review['post_type']);
                    $reviewPostTypes[$postType] = ['name' => $review['post_type'] ? \strtolower($review['post_type']) : $postType, 'slug' => $postType, 'status' => $review['status']];
                }
            }
            // Categorize post types
            foreach ($cptList as $cpt) {
                $slug = \strtolower($cpt['slug']);
                $name = \strtolower($cpt['name']);
                if (isset($reviewPostTypes[$slug])) {
                    $used[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    if ($reviewPostTypes[$slug]['status'] === 'Enabled') {
                        $enabled[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    } else {
                        $disabled[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    }
                } else {
                    $unused[] = ['name' => $name, 'slug' => $slug];
                }
            }
            // Ensure 'product' post type is included in all except 'unused'
            $productPostType = ['name' => 'product', 'slug' => 'product'];
            if (!\in_array('product', \array_column($enabled, 'slug'))) {
                $enabled[] = $productPostType;
            }
            if (!\in_array('product', \array_column($cptList, 'slug'))) {
                $cptList[] = $productPostType;
            }
            if (!\in_array('product', \array_column($used, 'slug'))) {
                $used[] = $productPostType;
            }
            // Get API param
            $apiParam = 'all';
            if (\is_string($request)) {
                // $apiParam is a string
                $apiParam = $request;
            } elseif (\is_object($request)) {
                // $apiParam is an array
                $apiParam = \strtolower($request->get_param('cpt'));
            }
            $responseData = [];
            switch ($apiParam) {
                case 'enabled':
                    $responseData = $enabled;
                    break;
                case 'disabled':
                    $responseData = $disabled;
                    break;
                case 'used':
                    $responseData = $used;
                    break;
                case 'unused':
                    $responseData = $unused;
                    break;
                case 'all':
                    $responseData = $cptList;
                    break;
                default:
                    $responseData = $cptList;
            }
            if (\is_string($request)) {
                return $responseData;
            } elseif (\is_object($request)) {
                return Helper::rvxApi($responseData)->success();
            }
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Custom Post Types List Fails', $e->getCode());
        }
    }
    public function customPostTypesOnSync($param)
    {
        try {
            // Available post types
            $cptList = \array_map(function ($cpt) {
                return ['name' => \strtolower($cpt['name']), 'slug' => \strtolower($cpt['slug'])];
            }, $this->cptHelper->getPublicCptList());
            // Post type settings from WPDB
            $cptSettings = $this->cptHelper->cptSettingsOnSync();
            $enabled = [];
            $disabled = [];
            $used = [];
            $unused = [];
            // Extract post types from settings
            $reviewPostTypes = [];
            if (!empty($cptSettings['reviews'])) {
                foreach ($cptSettings['reviews'] as $review) {
                    $postType = \strtolower($review['post_type']);
                    $reviewPostTypes[$postType] = ['name' => $review['post_type'] ? \strtolower($review['post_type']) : $postType, 'slug' => $postType, 'status' => $review['status']];
                }
            }
            // Categorize post types
            foreach ($cptList as $cpt) {
                $slug = \strtolower($cpt['slug']);
                $name = \strtolower($cpt['name']);
                if (isset($reviewPostTypes[$slug])) {
                    $used[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    if ($reviewPostTypes[$slug]['status'] === 'Enabled') {
                        $enabled[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    } else {
                        $disabled[] = ['name' => $reviewPostTypes[$slug]['name'], 'slug' => $slug];
                    }
                } else {
                    $unused[] = ['name' => $name, 'slug' => $slug];
                }
            }
            // Ensure 'product' post type is included in all except 'unused'
            $productPostType = ['name' => 'product', 'slug' => 'product'];
            if (!\in_array('product', \array_column($enabled, 'slug'))) {
                $enabled[] = $productPostType;
            }
            if (!\in_array('product', \array_column($cptList, 'slug'))) {
                $cptList[] = $productPostType;
            }
            if (!\in_array('product', \array_column($used, 'slug'))) {
                $used[] = $productPostType;
            }
            // Get param
            if (empty($param)) {
                // $param is a string
                $apiParam = 'all';
            } elseif (\is_string($param)) {
                // $apiParam is an array
                $apiParam = \strtolower($param);
            }
            $responseData = [];
            switch ($apiParam) {
                case 'enabled':
                    $responseData = $enabled;
                    break;
                case 'disabled':
                    $responseData = $disabled;
                    break;
                case 'used':
                    $responseData = $used;
                    break;
                case 'unused':
                    $responseData = $unused;
                    break;
                case 'all':
                    $responseData = $cptList;
                    break;
                default:
                    $responseData = $cptList;
            }
            return $responseData;
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Custom Post Types List Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function cptStatusChange($request)
    {
        try {
            $response = $this->cptService->cptStatusChange($request->get_params());
            $resData = Helper::saasResponse($response);
            if ($response->getStatusCode() === 200) {
                // Update (_rvx_cpt_settings) CPT Settings
                $response = $this->cptService->cptGet();
                $this->cptSettings($response);
                // Update (_rvx_ettings_{post_type}) CPT Settings
                $post_type = $resData->data['data']['post_type'] ? \strtolower($resData->data['data']['post_type']) : '';
                // Upload CPT data to Saas
                if ($resData->data['data']['status'] === 'Enabled') {
                    $this->dataSyncService->dataSync('default', $post_type);
                    $this->cacheServices->removeCache();
                }
            }
            return Helper::rvxApi($resData)->success('Status Change Success', 200);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Status Change Fails', $e->getCode());
        }
    }
    public function cptSettings($response)
    {
        $status = \false;
        $dataArray = \json_decode($response, \true);
        if ($dataArray !== null) {
            $status = \update_option('_rvx_cpt_settings', $dataArray['data']);
        }
        return $status;
    }
}
PK     M.]&3.B  .B    StoreFrontReviewController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Exception;
use Rvx\Services\Api\LoginService;
use Rvx\Services\ReviewService;
use Rvx\Services\CacheServices;
use Rvx\Services\SettingService;
use Rvx\Utilities\Auth\Client;
use Rvx\Utilities\Helper;
use Throwable;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class StoreFrontReviewController implements InvokableContract
{
    protected ReviewService $reviewService;
    protected SettingService $settingService;
    protected LoginService $loginService;
    protected CacheServices $cacheService;
    public function __construct()
    {
        $this->reviewService = new ReviewService();
        $this->settingService = new SettingService();
        $this->loginService = new LoginService();
        $this->cacheService = new CacheServices();
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    public function settingMeta($request) : Response
    {
        try {
            $this->reviewService->settingMeta($request);
            return Helper::rest()->success("Success");
        } catch (Exception $e) {
            return Helper::rest()->fails("Fails");
        }
    }
    public function dataGetFromSaas($request)
    {
        $response = $this->reviewService->getWidgetReviewsForProduct($request);
        if ($response->getStatusCode() !== Response::HTTP_OK) {
            return \false;
        }
        return $response->getApiData();
    }
    public function getWidgetReviewsForProduct($request)
    {
        $diffReviewCount = $this->reviewCountDifferent($request["product_id"]);
        if ($diffReviewCount === \true) {
            \delete_transient("rvx_{$request["product_id"]}_latest_reviews");
            return $this->dataGetFormSaas($request);
        }
        $productId = $request["product_id"];
        $postMata = \get_transient("rvx_{$productId}_latest_reviews");
        if ($postMata) {
            if (\count($postMata["reviews"]) != $this->insightReviewCount($request["product_id"])) {
                \delete_transient("rvx_{$request["product_id"]}_latest_reviews");
                return $this->dataGetFormSaas($request);
            }
            if ($request->get_param("cursor") || $request->get_param("rating") || $request->get_param("sortBy") || $request->get_param("attachment")) {
                $response = $this->reviewService->getWidgetReviewsForProduct($request);
                return Helper::saasResponse($response);
            } else {
                if ($this->is_valid_data($postMata)) {
                    //valid
                    $response = ["reviews" => $postMata["reviews"], "meta" => $postMata["meta"]];
                    if ($response) {
                        return Helper::rest($response)->success("Success");
                    } else {
                        return Helper::rest()->fails("Fails");
                    }
                } else {
                    //invalid
                    $this->loginService->resetProductWisePostMeta($request["product_id"]);
                    return $this->dataGetFormSaas($request);
                }
            }
        } else {
            return $this->dataGetFormSaas($request);
        }
    }
    public function getAllReviewsDataFromSaas($request, $site_id)
    {
        $response = $this->reviewService->getWidgetAllReviewsForSite($request, $site_id);
        if ($response->getStatusCode() !== Response::HTTP_OK) {
            return \false;
        }
        return $response->getApiData();
    }
    public function getWidgetAllReviewsListForSite($request)
    {
        $site_id = Client::getUid();
        $post_type = $request['post_type'] ?? 'all';
        $postMata = \get_transient("rvx_{$site_id}_{$post_type}_reviews");
        if ($post_type === 'all') {
            $post_type = null;
        }
        if (!$postMata) {
            return $this->getAllReviewsFromSaas($request, $site_id, $post_type);
        }
        if ($request->get_param("cursor") || $request->get_param("rating") || $request->get_param("sort_by") || $request->get_param("attachment")) {
            $response = $this->reviewService->getWidgetAllReviewsForSite($request, $site_id);
            return Helper::saasResponse($response);
        }
        if ($this->is_valid_data($postMata)) {
            $response = ["reviews" => $postMata["reviews"], "meta" => $postMata["meta"]];
            if ($response) {
                return Helper::rest($response)->success("Success");
            }
            return Helper::rest()->fails("Fails");
        }
        // invalid cached data → reset and fetch fresh
        $this->resetSiteWiseTransientMeta($site_id, $post_type);
        return $this->getAllReviewsFromSaas($request, $site_id, $post_type);
    }
    public function resetSiteWiseTransientMeta($site_id, $post_type)
    {
        global $wpdb;
        $post_type = $post_type != null ? $post_type : 'all';
        $review_key = "rvx_{$site_id}_{$post_type}_reviews";
        // Prepare and execute the deletion query
        $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s", $review_key));
    }
    public function getWidgetReviewsListShortcode($request)
    {
        $productId = $request['product_id'];
        // mismatch in review count → reset + fetch
        if ($this->reviewCountDifferent($productId)) {
            \delete_transient("rvx_{$productId}_latest_reviews");
            return $this->dataGetFormSaas($request);
        }
        $postMeta = \get_transient("rvx_{$productId}_latest_reviews");
        // no cache → fetch
        if (!$postMeta) {
            return $this->dataGetFormSaas($request);
        }
        // cache count mismatch → reset + fetch
        if (\count($postMeta['reviews']) !== $this->insightReviewCount($productId)) {
            \delete_transient("rvx_{$productId}_latest_reviews");
            return $this->dataGetFormSaas($request);
        }
        // request has filters → always fetch fresh
        if ($request->get_param('cursor') || $request->get_param('rating') || $request->get_param('sortBy') || $request->get_param('attachment')) {
            $response = $this->reviewService->getWidgetReviewsListShortcode($request);
            return Helper::saasResponse($response);
        }
        // cached data valid → return
        if ($this->is_valid_data($postMeta)) {
            return Helper::rest(['reviews' => $postMeta['reviews'], 'meta' => $postMeta['meta']])->success('Success');
        }
        // invalid cached data → reset + fetch
        $this->loginService->resetProductWisePostMeta($productId);
        return $this->dataGetFormSaas($request);
    }
    public function getAllReviewsFromSaas($request, $site_id, $post_type)
    {
        $latestReviews = $this->getAllReviewsDataFromSaas($request, $site_id);
        if (!$latestReviews) {
            return Helper::rvxApi(["error" => "Fails"])->fails("failed");
        }
        $reviews = Helper::arrayGet($latestReviews, "reviews");
        if (\count($reviews) > 0) {
            $this->reviewService->setAllReviewsMetaTransient($site_id, $post_type, $latestReviews);
        }
        return ["data" => $latestReviews];
    }
    public function dataGetFormSaas($request)
    {
        $latestReview = $this->dataGetFromSaas($request);
        if (!$latestReview) {
            return Helper::rvxApi(["error" => "Fails"])->fails("failed");
        }
        $reviews = Helper::arrayGet($latestReview, "reviews");
        if (\count($reviews) > 0) {
            $this->reviewService->postMetaReviewInsert($request->get_param("product_id"), $latestReview);
        }
        return ["data" => $latestReview];
    }
    public function is_valid_data($postMata)
    {
        if (\is_array($postMata)) {
            return \true;
        }
        return \false;
    }
    public function insightDataGetInSaas($request)
    {
        $response = $this->reviewService->getWidgetInsight($request);
        if ($response->getStatusCode() !== Response::HTTP_OK) {
            return \false;
        }
        return $response->getApiData();
    }
    public function getWidgetInsight($request)
    {
        try {
            $diffReviewCount = $this->reviewCountDifferent($request["product_id"]);
            if ($diffReviewCount === \true) {
                return ["data" => $this->insightDataelsePart($request)];
            }
            $data = \get_transient("rvx_{$request["product_id"]}_latest_reviews_insight");
            if ($data) {
                $aggregation = \json_decode($data, \true);
                if (\is_array($aggregation)) {
                    $aggregation['product']['title'] = \htmlspecialchars_decode($aggregation['product']['title'], \ENT_QUOTES);
                }
                if (!\is_array($aggregation)) {
                    $modData = $this->productTitleAndDescriptionBackSlashRemove($data);
                    $aggregation = \json_decode($modData, \true);
                }
                if ($aggregation) {
                    return Helper::rest($aggregation)->success("Success");
                } else {
                    return Helper::rest()->fails("Fails");
                }
            } else {
                // Fetch the latest aggregation data
                return ["data" => $this->insightDataelsePart($request)];
            }
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    public function insightDataelsePart($request)
    {
        $latestAggregation = $this->insightDataGetInSaas($request);
        // Check if the data retrieval fails
        if (!$latestAggregation) {
            return Helper::rvxApi(["error" => "Fails"])->fails("failed");
        }
        // Extract 'criteria_stats' from the latest aggregation data (always an array)
        $criteriaStat = Helper::arrayGet($latestAggregation, "criteria_stats");
        // No need to decode since it's always an array, just assign back
        $latestAggregation["criteria_stats"] = $criteriaStat;
        \delete_transient("rvx_{$request->get_param("product_id")}_latest_reviews_insight");
        // Store the data in post meta as a JSON string
        $latestAggregationJson = \json_encode($latestAggregation, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
        \set_transient("rvx_{$request->get_param("product_id")}_latest_reviews_insight", $latestAggregationJson, 604800);
        // Expires in 7 days
        return $latestAggregation;
    }
    public function productTitleAndDescriptionBackSlashRemove($data)
    {
        return \preg_replace('/("title":")([^"\\\\]+)\\\\\'/', '$1$2\'', $data);
    }
    public function reviewCountDifferent($id) : bool
    {
        $wpReview = $this->getOnlyApproveReviewCount($id);
        $saasReview = $this->insightReviewCount($id);
        if ($wpReview > $saasReview) {
            return \true;
        }
        if ($wpReview < $saasReview) {
            return \true;
        }
        return \false;
    }
    public function getOnlyApproveReviewCount($id) : int
    {
        global $wpdb;
        $query = $wpdb->prepare("SELECT COUNT(*) \n             FROM {$wpdb->comments} \n             WHERE comment_post_ID = %d \n             AND comment_approved = '1' \n             AND comment_parent = 0\n             AND comment_type IN ('comment', 'review')", $id);
        return (int) $wpdb->get_var($query);
    }
    public function insightReviewCount($id) : int
    {
        $data = \get_transient("rvx_{$id}_latest_reviews_insight");
        if ($data) {
            $reviewAggregation = \json_decode($data, \true);
            return $reviewAggregation['aggregation']['total_reviews'] ?? 0;
        }
        return 0;
    }
    /**
     * @param $request
     * @return Response
     */
    public function saveWidgetReviewsForProduct($request)
    {
        try {
            $response = $this->reviewService->saveWidgetReviewsForProduct($request);
            $this->cacheService->removeCache();
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function requestReviewEmailAttachment($request) : Response
    {
        try {
            $data = $this->reviewService->requestReviewEmailAttachment($request);
            return Helper::rvxApi(["reviews" => $data])->success("Review Successfully sent", 200);
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    /**
     * @param $request
     * @return Response
     */
    public function likeDislikePreference($request)
    {
        try {
            $response = $this->reviewService->likeDIslikePreference($request->get_params());
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    public function singleActionProductMata($request)
    {
        $reviewData = Helper::arrayGet($request->get_params(), "review");
        $aggregationData = Helper::arrayGet($request->get_params(), "aggregation");
        $productId = Helper::arrayGet($aggregationData, "product_wp_id");
        if (!$productId) {
            return;
        }
        $this->storeReviewMeta($productId, $reviewData);
        $this->storeAggregationMeta($productId, $aggregationData);
    }
    public function storeReviewMeta($productId, $payload)
    {
        $reviewAndMeta = ["reviews" => Helper::arrayGet($payload, "reviews"), "meta" => Helper::arrayGet($payload, "meta")];
        $this->reviewService->postMetaReviewInsert($productId, $reviewAndMeta);
    }
    public function storeAggregationMeta($productId, $payload)
    {
        $aggregation_data = \json_encode(wp_slash(Helper::arrayGet($payload, "meta")), \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
        \set_transient("rvx_{$productId}_latest_reviews_insight", $aggregation_data, 604800);
        // Expires in 7 days
    }
    public function reviewRequestStoreItem($request)
    {
        try {
            $review = $this->reviewService->reviewRequestStoreItem($request->get_params());
            return $review;
            //            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    public function thanksMessage($request)
    {
        try {
            $response = $this->reviewService->thanksMessage($request);
            return $response;
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("failed", $e->getCode());
        }
    }
    public function getSpecificReviewItem($request)
    {
        try {
            $defferentIds = $this->cacheService->clearShortcodesCache(\get_option('_rvx_reviews_ids'), $request->get_params());
            if ($defferentIds == \false) {
                \delete_transient('rvx_shortcode_transient');
            }
            $transient_key = 'rvx_shortcode_transient';
            $resp = \get_transient($transient_key);
            if ($resp !== \false) {
                $data = ['reviews' => $resp['reviews'], 'meta' => $resp['meta']];
                return Helper::rest($data)->success("Success (from transient)");
            } else {
                $response = $this->reviewService->getSpecificReviewItem($request);
                $api_data = $response->getApiData();
                \set_transient($transient_key, $api_data, 12 * HOUR_IN_SECONDS);
                \update_option('_rvx_reviews_ids', $request->get_params());
                return Helper::saasResponse($response);
            }
        } catch (Throwable $e) {
            return Helper::rvxApi(["error" => $e->getMessage()])->fails("Specific Review Item Fails", $e->getCode());
        }
    }
    public function getLocalSettings($request)
    {
        // Get API param
        $post_type = $request->get_param('cpt_type') ? \strtolower($request->get_param('cpt_type')) : 'product';
        $data = (array) (new SettingService())->getSettingsData($post_type) ?? [];
        if ($data) {
            return Helper::rest($data)->success("Success");
        } else {
            $response = $this->settingService->getLocalSettings($post_type);
            $apiResponse = Helper::getApiResponse($response);
            $review_setting = $apiResponse->data['data']['setting']['review_settings'];
            $this->settingService->updateReviewSettings($review_setting, $post_type);
            return $apiResponse;
        }
    }
}
PK     M.]      EmailTemplateController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Rvx\Services\EmailService;
use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class EmailTemplateController implements InvokableContract
{
    protected $emailService;
    /**
     * @param EmailService $emailService
     */
    public function __construct(EmailService $emailService)
    {
        $this->emailService = $emailService;
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function index()
    {
        $resp = $this->emailService->index();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function store($request)
    {
        try {
            $response = $this->emailService->store($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function show($request)
    {
        $id = $request->get_param('id');
        $resp = $this->emailService->show($id);
        return Helper::getApiResponse($resp);
    }
    public function update($request)
    {
        try {
            $response = $this->emailService->update($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function trash($request)
    {
        $id = $request->get_param('id');
        $resp = $this->emailService->trash($id);
        return Helper::getApiResponse($resp);
    }
    public function mailRequest($request)
    {
        $resp = $this->emailService->mailRequest($request->get_params());
        return Helper::getApiResponse($resp);
    }
    public function mailContents()
    {
        $resp = $this->emailService->content();
        return Helper::getApiResponse($resp);
    }
    public function saveEmailRequest($request)
    {
        try {
            $response = $this->emailService->saveEmailRequest($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function followup($request)
    {
        try {
            $response = $this->emailService->followup($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function photoReview($request)
    {
        try {
            $response = $this->emailService->photoReview($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function testMail($request)
    {
        try {
            $response = $this->emailService->testMail($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function markAsDone($request)
    {
        try {
            $response = $this->emailService->markAsComplete($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function requestEmailCancel($request)
    {
        try {
            $response = $this->emailService->emailCancel($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function requestEmailSend($request)
    {
        try {
            $response = $this->emailService->requestEmailSend($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function requestEmailResend($request)
    {
        try {
            $response = $this->emailService->requestEmailResend($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function requestEmailUnsubscribe()
    {
        try {
            $response = $this->emailService->requestEmailUnsubscribe();
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
    public function reviewRequestSettings()
    {
        $resp = $this->emailService->reviewRequestSettings();
        return Helper::getApiResponse($resp);
    }
    public function allReminderSettings($request)
    {
        try {
            $response = $this->emailService->allReminderSettings($request->get_params());
            return Helper::saasResponse($response);
        } catch (\Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('This Action Fails', $e->getCode());
        }
    }
}
PK     M.]      Products/ProductController.phpnu         <?php

namespace Rvx\Rest\Controllers\Products;

use Rvx\Services\ProductService;
use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class ProductController implements InvokableContract
{
    protected $productService;
    /**
     * @param ProductService $productService
     */
    public function __construct(ProductService $productService)
    {
        $this->productService = $productService;
    }
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function selectable($request)
    {
        $resp = $this->productService->getSelectProduct($request->get_params());
        if ($resp->getStatusCode() === Response::HTTP_OK) {
            $data = $resp->getApiData();
            if (isset($data['products']) && \is_array($data['products'])) {
                foreach ($data['products'] as &$product) {
                    if (isset($product['wp_id'])) {
                        $product['post_type'] = get_post_type($product['wp_id']);
                    }
                }
            }
            return Helper::rest($data)->success($resp()->message, $resp->getStatusCode());
        }
        return Helper::getApiResponse($resp);
    }
}
PK     M.]ȩ
  
    GoogleReviewController.phpnu         <?php

namespace Rvx\Rest\Controllers;

use Throwable;
use Rvx\Services\GoogleReviewService;
use Rvx\Utilities\Helper;
use Rvx\WPDrill\Contracts\InvokableContract;
use Rvx\WPDrill\Response;
class GoogleReviewController implements InvokableContract
{
    protected $googleReviewService;
    /**
     * @param GoogleReviewService $googleReviewService
     */
    public function __construct(GoogleReviewService $googleReviewService)
    {
        $this->googleReviewService = $googleReviewService;
    }
    /**
     * @return void
     */
    public function __invoke()
    {
    }
    /**
     * @return Response
     */
    public function googleReviewGet()
    {
        $resp = $this->googleReviewService->googleReviewGet();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function googleReviewPlaceApi()
    {
        $resp = $this->googleReviewService->googleReviewPlaceApi();
        return Helper::getApiResponse($resp);
    }
    /**
     * @return Response
     */
    public function googleRecaptchaVerify($request)
    {
        $resp = $this->googleReviewService->googleRecaptchaVerify($request->get_params());
        return $resp;
    }
    /**
     * @return Response
     */
    public function googleReviewKey($request)
    {
        try {
            $response = $this->googleReviewService->googleReviewKey($request->get_params());
            \delete_transient('rvx_google_api_settings');
            // When settings is changed remove the cache wpdb transient data
            \delete_transient('rvx_google_reviews_cache');
            // When settings is changed remove the cache wpdb transient data
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
    /**
     * @return Response
     */
    public function googleReviewSetting($request)
    {
        try {
            $response = $this->googleReviewService->googleReviewSetting($request->get_params());
            \delete_transient('rvx_google_api_settings');
            // When settings is changed remove the cache wpdb transient data
            \delete_transient('rvx_google_reviews_cache');
            // When settings is changed remove the cache wpdb transient data
            return Helper::saasResponse($response);
        } catch (Throwable $e) {
            return Helper::rvxApi(['error' => $e->getMessage()])->fails('Review Bulk Fails', $e->getCode());
        }
    }
}
PK       M.]
I  I                  ReviewController.phpnu         PK       M.]c&  &              ^I  CategoryController.phpnu         PK       M.]gQw_  _              N  PingController.phpnu         PK       M.]7H                kS  DashboardController.phpnu         PK       M.]CZ;s  s              Y  DataSyncController.phpnu         PK       M.]..%                j  LogController.phpnu         PK       M.]7r5  5              b~  UserController.phpnu         PK       M.]UO  O              ـ  WPDrillController.phpnu         PK       M.]Q/  Q/              m  AuthController.phpnu         PK       M.]ʨ                   FileController.phpnu         PK       M.]QK                  ImportExportController.phpnu         PK       M.]]                  DiscountController.phpnu         PK       M.]3}                    Q  SettingController.phpnu         PK       M.]2$h  h                AccessController.phpnu         PK       M.]}1  }1              B  CptController.phpnu         PK       M.]&3.B  .B               - StoreFrontReviewController.phpnu         PK       M.]                |o EmailTemplateController.phpnu         PK       M.]                Ȇ Products/ProductController.phpnu         PK       M.]ȩ
  
               GoogleReviewController.phpnu         PK      `  I