Skip to content
wiki.fftac.org

Restcontroller - Source Excerpt 01

Back to Restcontroller

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',