Frontendcontroller - Source Excerpt 05
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);