Files
hub-insurance/wp-content/plugins/visual-regression-tests/includes/rest-api/class-rest-tests-controller.php
T
2026-07-02 15:54:39 -06:00

186 lines
5.0 KiB
PHP

<?php
namespace Vrts\Rest_Api;
use Vrts\Features\Subscription;
use WP_REST_Request;
use WP_Error;
use WP_REST_Server;
use Vrts\Models\Test;
use Vrts\Services\Test_Service;
class Rest_Tests_Controller {
/**
* Namespace.
*
* @var string
*/
private $namespace;
/**
* Resource name.
*
* @var string
*/
private $resource_name;
/**
* Constructor.
*/
public function __construct() {
$this->namespace = 'vrts/v1';
$this->resource_name = 'tests';
add_action( 'rest_api_init', [ $this, 'register_routes' ] );
}
/**
* Register routes.
*/
public function register_routes() {
register_rest_route($this->namespace, $this->resource_name, [
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'tests_remaining_total_callback' ],
'permission_callback' => '__return_true',
]);
register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'tests_callback' ],
'permission_callback' => '__return_true',
]);
register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'create_test_callback' ],
'permission_callback' => [ $this, 'user_can_create' ],
]);
register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [
'methods' => WP_REST_Server::DELETABLE,
'callback' => [ $this, 'delete_test_callback' ],
'permission_callback' => [ $this, 'user_can_create' ],
]);
register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'update_test_callback' ],
'permission_callback' => [ $this, 'user_can_create' ],
]);
}
/**
* Gets some tests data.
*
* @param WP_REST_Request $request Current request.
*/
public function tests_callback( WP_REST_Request $request ) {
$data = $request->get_params();
$post_id = $data['post_id'] ?? 0;
if ( 0 !== $post_id ) {
$test = Test::get_item_by_post_id( $post_id );
if ( ! empty( $test ) ) {
$test = Test::cast_values( $test );
return rest_ensure_response( $test, 200 );
}
}
$error = new WP_Error(
'rest_not_found',
esc_html__( 'The test does not exist.', 'visual-regression-tests' ),
[ 'status' => 404 ] );
return rest_ensure_response( $error );
}
/**
* Get remaining and total tests.
*/
public function tests_remaining_total_callback() {
return rest_ensure_response([
'remaining_tests' => (int) Subscription::get_remaining_tests(),
'total_tests' => (int) Subscription::get_total_tests(),
], 200);
}
/**
* Creates a test.
*
* @param WP_REST_Request $request Current request.
*/
public function create_test_callback( WP_REST_Request $request ) {
$data = $request->get_params();
$post_id = $data['post_id'] ?? 0;
if ( 0 !== $post_id ) {
$service = new Test_Service();
$test = $service->create_test( $post_id );
return rest_ensure_response( Test::cast_values( $test ), 201 );
}
$error = new WP_Error(
'rest_create_test_failed',
esc_html__( 'The test could not be created.', 'visual-regression-tests' ),
[ 'status' => 400 ] );
return rest_ensure_response( $error );
}
/**
* Deletes a test.
*
* @param WP_REST_Request $request Current request.
*/
public function delete_test_callback( WP_REST_Request $request ) {
$data = $request->get_params();
$post_id = $data['post_id'] ?? 0;
if ( 0 !== $post_id ) {
$test = Test::get_item_by_post_id( $post_id );
$service = new Test_Service();
$service->delete_test( (int) $test->id );
return rest_ensure_response( [], 200 );
}
$error = new WP_Error(
'rest_delete_test_failed',
esc_html__( 'The test could not be deleted.', 'visual-regression-tests' ),
[ 'status' => 400 ] );
return rest_ensure_response( $error );
}
/**
* Updates a test.
*
* @param WP_REST_Request $request Current request.
*/
public function update_test_callback( WP_REST_Request $request ) {
$data = $request->get_params();
$post_id = $data['post_id'] ?? 0;
$test_id = $data['test_id'] ?? 0;
$hide_css_selectors = $data['hide_css_selectors'] ?? [];
if ( 0 !== $post_id && 0 !== $test_id && ! empty( $hide_css_selectors ) ) {
$service = new Test_Service();
$updated = $service->update_css_hide_selectors( $test_id, $hide_css_selectors );
if ( $updated && ! is_wp_error( $updated ) ) {
$service->resume_test( $post_id );
$test = Test::get_item_by_post_id( $post_id );
if ( ! empty( $test ) ) {
return rest_ensure_response( Test::cast_values( $test ), 200 );
}
}
}
$error = new WP_Error(
'rest_update_test_failed',
esc_html__( 'The test could not be updated.', 'visual-regression-tests' ),
[ 'status' => 400 ] );
return rest_ensure_response( $error );
}
/**
* Checks if a given request has access to create items.
*
* @return bool True if the request has access to create items, false otherwise.
*/
public function user_can_create() {
return current_user_can( 'manage_options' );
}
}