<?php namespace ElementorOne\Admin\Controllers; use Elementor\WPNotificationsPackage\V120\Notifications as NotificationsSDK; use ElementorOne\Admin\Services\Feedback as FeedbackService; use ElementorOne\Admin\Config; use ElementorOne\Common\RestError; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly } /** * Class TopBar * Handles all top bar-related REST API endpoints */ class TopBar extends \WP_REST_Controller { /** * Constructor */ public function __construct() { $this->namespace = Config::APP_REST_NAMESPACE; $this->rest_base = 'top-bar'; add_action( 'rest_api_init', [ $this, 'register_routes' ] ); } /** * Register all notifications-related routes * @return void */ public function register_routes() { // GET /top-bar/notifications register_rest_route( $this->namespace, '/' . $this->rest_base . '/notifications', [ [ 'methods' => \WP_REST_Server::READABLE, 'callback' => [ $this, 'get_notifications' ], 'permission_callback' => [ $this, 'create_item_permissions_check' ], 'args' => [ 'app_name' => [ 'type' => 'string', 'required' => true, ], 'app_version' => [ 'type' => 'string', 'required' => true, ], ], ], ] ); // POST /top-bar/feedback register_rest_route( $this->namespace, '/' . $this->rest_base . '/feedback', [ [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [ $this, 'send_product_feedback' ], 'permission_callback' => [ $this, 'create_item_permissions_check' ], 'args' => [ 'product' => [ 'type' => 'string', 'required' => true, ], 'subject' => [ 'type' => 'string', 'required' => true, ], 'title' => [ 'type' => 'string', 'required' => true, ], 'description' => [ 'type' => 'string', 'required' => true, ], 'countryCode' => [ 'type' => 'string', 'required' => false, ], ], ], ] ); } /** * Get notifications * @param \WP_REST_Request $request * @return \WP_REST_Response|\WP_Error */ public function get_notifications( \WP_REST_Request $request ) { try { $app_name = $request->get_param( 'app_name' ); $app_version = $request->get_param( 'app_version' ); $notifications_sdk = new NotificationsSDK( [ 'app_name' => $app_name, 'app_version' => $app_version, ] ); $notifications = $notifications_sdk->get_notifications_by_conditions( true ); return new \WP_REST_Response( $notifications ); } catch ( \Throwable $th ) { return RestError::internal_server_error( $th->getMessage() ); } } /** * Send feedback * @param \WP_REST_Request $request * @return \WP_REST_Response|\WP_Error */ public function send_product_feedback( \WP_REST_Request $request ) { try { $product = $request->get_param( 'product' ); $subject = $request->get_param( 'subject' ); $title = $request->get_param( 'title' ); $description = $request->get_param( 'description' ); $country_code = $request->get_param( 'countryCode' ); FeedbackService::instance()->send_product_feedback( $product, $subject, $title, $description, $country_code ); return new \WP_REST_Response( null, \WP_Http::NO_CONTENT ); } catch ( \Throwable $th ) { if ( \WP_Http::UNAUTHORIZED === $th->getCode() ) { return RestError::unauthorized( $th->getMessage() ); } return RestError::bad_request( $th->getMessage() ); } } /** * Check if the user has permission to create an item * @param \WP_REST_Request $request * @return true|\WP_Error */ public function create_item_permissions_check( $request ) { return current_user_can( 'manage_options' ); } }