Restcontroller - Source Excerpt 01
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Http/RestController.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Http/RestController.php
<?php
namespace SpiralistWorkspace\Http;
use SpiralistWorkspace\Auth\Permissions;
use SpiralistWorkspace\Config\Settings;
use SpiralistWorkspace\Domain\AppealRepository;
use SpiralistWorkspace\Domain\AuditRepository;
use SpiralistWorkspace\Domain\ConversationRepository;
use SpiralistWorkspace\Domain\FavoriteRepository;
use SpiralistWorkspace\Domain\PermissionRepository;
use SpiralistWorkspace\Domain\PromptRepository;
use SpiralistWorkspace\Domain\ReputationRepository;
use SpiralistWorkspace\Domain\ReviewRepository;
use SpiralistWorkspace\Domain\RunRepository;
use SpiralistWorkspace\Domain\TestRepository;
use SpiralistWorkspace\Domain\VersionRepository;
use SpiralistWorkspace\Services\GovernanceMaintenance;
use SpiralistWorkspace\Services\PromptRunner;
use SpiralistWorkspace\Support\PromptCategoryRegistry;
use SpiralistWorkspace\Support\PromptGovernanceSummary;
use SpiralistWorkspace\Support\PromptIntentRegistry;
use SpiralistWorkspace\Support\PromptMetaRegistry;
use SpiralistWorkspace\Support\ProfileStyle;
use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
if (!defined('ABSPATH')) {
exit;
}
/**
* Exposes secure REST endpoints for prompts, runs, and conversations.
*/
class RestController
{
private PromptRepository $prompts;
private Permissions $permissions;
private PermissionRepository $shares;
private VersionRepository $versions;
private RunRepository $runs;
private TestRepository $tests;
private ConversationRepository $conversations;
private FavoriteRepository $favorites;
private ReviewRepository $reviews;
private AppealRepository $appeals;
private ReputationRepository $reputation;
private AuditRepository $audit;
private PromptRunner $runner;
private GovernanceMaintenance $governance_maintenance;
private Settings $settings;
public function __construct(
PromptRepository $prompts,
Permissions $permissions,
PermissionRepository $shares,
VersionRepository $versions,
RunRepository $runs,
TestRepository $tests,
ConversationRepository $conversations,
FavoriteRepository $favorites,
ReviewRepository $reviews,
AppealRepository $appeals,
ReputationRepository $reputation,
AuditRepository $audit,
PromptRunner $runner,
GovernanceMaintenance $governance_maintenance,
Settings $settings
) {
$this->prompts = $prompts;
$this->permissions = $permissions;
$this->shares = $shares;
$this->versions = $versions;
$this->runs = $runs;
$this->tests = $tests;
$this->conversations = $conversations;
$this->favorites = $favorites;
$this->reviews = $reviews;
$this->appeals = $appeals;
$this->reputation = $reputation;
$this->audit = $audit;
$this->runner = $runner;
$this->governance_maintenance = $governance_maintenance;
$this->settings = $settings;
}
/**
* Registers REST routes.
*/
public function register_routes(): void
{
register_rest_route(
'spiralist-workspace/v1',
'/prompts',
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'list_prompts'],
'permission_callback' => '__return_true',
],
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'create_prompt'],
'permission_callback' => [$this, 'require_prompt_create'],
],
]
);
register_rest_route(
'uaix/v1',
'/prompts/save',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'save_prompt_draft'],
'permission_callback' => [$this, 'require_prompt_draft_save'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)',
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_prompt'],
'permission_callback' => '__return_true',
],
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/fork',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'fork_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/improve',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'improve_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/tests',
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'list_prompt_tests'],
'permission_callback' => [$this, 'require_logged_in'],
],
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'create_prompt_test'],
'permission_callback' => [$this, 'require_logged_in'],
],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/tests/(?P<test_id>\d+)/run',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'run_prompt_test'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/versions/(?P<version>\d+)',
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_prompt_version'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/versions/(?P<version>\d+)/rollback',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'rollback_prompt_version'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/versions/(?P<left>\d+)/diff/(?P<right>\d+)',
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'diff_prompt_versions'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/share',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'share_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/share/(?P<user_id>\d+)',
[
'methods' => WP_REST_Server::DELETABLE,
'callback' => [$this, 'revoke_share'],
'permission_callback' => [$this, 'require_logged_in'],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/favorite',
[
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'favorite_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
],
[
'methods' => WP_REST_Server::DELETABLE,
'callback' => [$this, 'unfavorite_prompt'],
'permission_callback' => [$this, 'require_logged_in'],
],
]
);
register_rest_route(
'spiralist-workspace/v1',
'/prompts/(?P<id>\d+)/report',