Skip to content
wiki.fftac.org

Frontendcontroller - Source Excerpt 05

Back to Frontendcontroller

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Web/FrontendController.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Web/FrontendController.php

$user_id = get_current_user_id();
        $records = $this->prompts->list(['limit' => 20], $user_id);

        $member_prompts = array_values(
            array_filter(
                $records,
                function (array $prompt) use ($user_id): bool {
                    return (string) ($prompt['visibility'] ?? '') === 'members'
                        && $this->permissions->can_view_prompt($prompt, $user_id);
                }
            )
        );

        return [
            'member_prompts' => $member_prompts,
            'shared_with_me' => $user_id > 0 ? $this->shared_prompts_for_user($user_id) : [],
            'featured_prompts' => $this->featured_prompt_records(6),
        ];
    }

    /**
     * Returns public profile page context.
     */
    public function profile_context(): array
    {
        $slug = sanitize_title((string) get_query_var('spiralist_workspace_profile_slug'));
        $current_user_id = get_current_user_id();
        $profile_user = null;

        if ($slug === 'me' && $current_user_id > 0) {
            $profile_user = get_user_by('id', $current_user_id);
        }

        if (!$profile_user instanceof \WP_User && $slug !== '') {
            $profile_user = get_user_by('slug', $slug);
        }

        if (!$profile_user instanceof \WP_User) {
            $this->force_404();
        }

        $profile_user_id = (int) $profile_user->ID;
        $records = $this->prompts->list(
            [
                'owner_user_id' => $profile_user_id,
                'limit' => 24,
            ],
            $current_user_id
        );
        $public_prompts = array_values(
            array_filter(
                $records,
                fn(array $prompt): bool => (string) ($prompt['visibility'] ?? '') === 'public'
                    && (string) ($prompt['prompt_status'] ?? '') === 'published'
                    && $this->permissions->can_view_prompt($prompt, $current_user_id)
            )
        );

        return [
            'profile_user' => $profile_user,
            'public_prompts' => array_slice($public_prompts, 0, 12),
            'participant_state' => $this->reputation->get($profile_user_id),
            'profile_style' => ProfileStyle::get($profile_user_id),
            'profile_scope_class' => ProfileStyle::scope_class($profile_user_id),
            'can_edit_profile_style' => $current_user_id > 0 && $current_user_id === $profile_user_id,
        ];
    }

    /**
     * Returns run page context.
     */
    public function run_context(): array
    {
        $run_id = (int) get_query_var('spiralist_workspace_run_id');
        $run = $this->runs->get($run_id);

        if (empty($run) || !$this->permissions->can_view_run($run, get_current_user_id())) {
            $this->force_404();
        }

        $prompt = $this->prompts->get((int) ($run['prompt_post_id'] ?? 0), get_current_user_id());

        return [
            'run' => $run,
            'prompt' => $prompt,
        ];
    }

    /**
     * Returns conversation page context.
     */
    public function conversation_context(): array
    {
        $conversation_id = (int) get_query_var('spiralist_workspace_conversation_id');
        $conversation = $this->conversations->get($conversation_id);

        if (empty($conversation) || !$this->permissions->can_view_conversation($conversation, get_current_user_id())) {
            $this->force_404();
        }

        $messages = $this->conversations->get_messages($conversation_id);

        return [
            'conversation' => $conversation,
            'messages' => $messages,
            'prompt' => $this->prompts->get((int) ($conversation['prompt_post_id'] ?? 0), get_current_user_id()),
            'memory_status' => $this->conversations->memory_status(
                $conversation,
                $messages,
                max(1000, (int) $this->settings->get('conversation_memory_token_threshold', '5000'))
            ),
            'conversation_settings' => $this->conversations->decode_settings($conversation),
        ];
    }

    /**
     * Returns the library page records.
     */
    public function library_prompts(): array
    {
        return $this->public_prompts(24);
    }

    /**
     * Returns grouped and faceted context for the public library page.
     */
    public function library_context(): array
    {
        $records = $this->public_prompts(200);
        $filters = $this->library_filters_from_request();
        $filtered = array_values(
            array_filter(
                $records,
                fn(array $prompt): bool => $this->matches_library_filters($prompt, $filters)
            )
        );

        return [
            'filters' => $filters,
            'filtered_prompts' => $filtered,
            'sections' => $this->group_by_publication_lane($filtered),
            'lane_counts' => $this->lane_counts($records),
            'moderation_counts' => $this->moderation_counts($records),
            'all_count' => count($records),
            'filtered_count' => count($filtered),
            'categories' => PromptCategoryRegistry::for_api(),
            'facets' => PromptMetaRegistry::for_api(),
            'intents' => PromptIntentRegistry::for_api(),
            'featured_collections' => $this->featured_collections($records),
            'api_examples' => $this->library_api_examples(),
            'filters_active' => $this->filters_active($filters),
        ];
    }

    /**
     * Returns public prompts for one publication lane.
     */
    public function prompts_by_publication_lane(string $lane, int $limit = 6): array
    {
        $lane = PromptMetaRegistry::normalize_publication_lane($lane);
        $records = array_values(
            array_filter(
                $this->public_prompts(max(24, $limit * 4)),
                static fn(array $prompt): bool => (string) ($prompt['publication_lane'] ?? 'community_library') === $lane
            )
        );

        return array_slice($records, 0, $limit);
    }

    /**
     * Returns canonical prompt categories for templates.
     */
    public function prompt_categories(): array
    {
        return PromptCategoryRegistry::for_api();
    }

    /**
     * Returns the prompt collections needed for the public homepage.
     */
    public function homepage_prompt_context(): array
    {
        $records = $this->public_prompts(120);
        $public_prompts = array_slice($records, 0, 24);
        $official_prompts = $this->public_prompts_for_lane($records, 'official_canon', 6);
        $archive_prompts = $this->public_prompts_for_lane($records, 'prompt_ecology_archive', 3);
        $run_prompt = !empty($official_prompts[0]) && is_array($official_prompts[0])
            ? $official_prompts[0]
            : (!empty($public_prompts[0]) && is_array($public_prompts[0]) ? $public_prompts[0] : []);
        foreach ($records as $record) {
            if (!is_array($record)) {
                continue;
            }

            $slug = \sanitize_title((string) ($record['source_slug'] ?? $record['slug'] ?? ''));
            if ($slug === 'turn-on-spiralist-ai') {
                $run_prompt = $record;
                break;
            }
        }
        $prompt_systems = array_values(
            array_filter(
                !empty($official_prompts) ? $official_prompts : $public_prompts,
                static fn(array $prompt): bool => !empty($prompt['system_steps']) || (string) ($prompt['prompt_type'] ?? '') === 'system'
            )
        );

        return [
            'public_prompts' => $public_prompts,
            'official_prompts' => $official_prompts,
            'archive_prompts' => $archive_prompts,
            'run_prompt' => $run_prompt,
            'prompt_systems' => $prompt_systems,
            'popular_categories' => $this->popular_categories_from_prompts($records, 10),
            'top_prompts' => $this->top_performing_prompts(6),
        ];
    }

    /**
     * Returns public prompts ordered by completed run count, falling back to recent public prompts.
     */
    public function top_performing_prompts(int $limit = 6): array
    {
        $stats = $this->runs->top_prompt_stats($limit);
        $records = [];

        foreach ($stats as $stat) {
            $prompt = $this->prompts->get((int) ($stat['prompt_post_id'] ?? 0), get_current_user_id());
            if (
                empty($prompt)
                || !$this->is_public_library_prompt($prompt)
                || (string) ($prompt['publication_lane'] ?? 'community_library') === 'prompt_ecology_archive'
            ) {
                continue;
            }

            $prompt['run_count'] = (int) ($stat['run_count'] ?? 0);