'POST', 'permission_callback' => [APEARI_Ownership::class, 'allowed'], 'callback' => [APEARI_Ownership::class, 'verify'], ]); foreach ( [ 'session' => 'POST', 'intro_dismiss' => 'POST', 'tour_seen' => 'POST', 'workspace' => 'POST', 'pages' => 'GET', 'media' => 'POST', 'library' => 'GET', 'chat_context' => 'POST', 'chat_generate' => 'POST', 'preview' => 'POST', 'publish' => 'POST', 'revert' => 'POST', 'history' => 'POST', 'content_state' => 'GET', 'content_start' => 'POST', 'content_step' => 'POST', 'content_cancel' => 'POST', 'content_publish' => 'POST', ] as $route => $method ) { register_rest_route('apeari/v1', '/' . $route, [ 'methods' => $method, 'permission_callback' => [$this, 'allowed'], 'callback' => function ($request) use ($route) { $input = $request->get_json_params() ?? $request->get_params(); return $this->$route(is_array($input) ? $input : []); }, ]); } } public function session(array $input) { APEARI_Theme_Knowledge::get(); $id = is_string($input['sessionId'] ?? null) ? $input['sessionId'] : ''; $archive = APEARI_Conversations::restore(); if (!$id) { $id = $archive['sessionId'] ?? ''; } $data = APEARI_Workspace::load($id); if (is_wp_error($data)) { $id = bin2hex(random_bytes(24)); $data = APEARI_Workspace::normalize([ 'user' => get_current_user_id(), 'theme' => get_stylesheet(), 'remember' => true, 'lastPage' => $archive['lastPage'] ?? 'home', 'conversations' => $archive['conversations'] ?? [], ]); } APEARI_Workspace::keep($id, $data); return ['sessionId' => $id, 'historyAvailable' => !empty($data['conversations'])] + APEARI_Workspace::public_state($data); } public function intro_dismiss(array $input): array { update_user_meta(get_current_user_id(), 'apeari_pro_intro_dismissed_' . get_current_blog_id(), true); return ['dismissed' => true]; } public function tour_seen(array $input): array { update_user_meta(get_current_user_id(), 'apeari_editor_tour_seen_' . get_current_blog_id(), true); return ['seen' => true]; } public function workspace(array $input) { return APEARI_Workspace::workspace($input); } public function pages(array $input): array { $items = []; $posts = get_posts([ 'post_type' => 'page', 'post_status' => ['publish', 'draft', 'private', 'pending'], 'numberposts' => 200, 'orderby' => 'title', 'order' => 'ASC', ]); foreach ($posts as $post) { if (current_user_can('edit_post', $post->ID)) { $items[] = [ 'ref' => 'page:' . $post->ID, 'title' => get_the_title($post) ?: __('Bez tytułu', 'apeari'), 'url' => $post->post_status === 'publish' ? get_permalink($post) : get_preview_post_link($post), ]; } } return ['items' => $items, 'frontPageRef' => 'page:' . (int) get_option('page_on_front')]; } public function media(array $input) { return is_array($input['ids'] ?? null) ? APEARI_Media::context($input['ids']) : new WP_Error('apeari_media', __('Wybierz zdjęcia.', 'apeari'), ['status' => 422]); } public function library(array $input): array { $items = []; $query = new WP_Query([ 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => 'image', 'posts_per_page' => 30, 'paged' => max(1, (int) ($input['page'] ?? 1)), 's' => sanitize_text_field((string) ($input['search'] ?? '')), ]); foreach ($query->posts as $post) { if (!current_user_can('read_post', $post->ID)) { continue; } $items[] = [ 'id' => $post->ID, 'title' => get_the_title($post), 'url' => wp_get_attachment_url($post->ID), 'thumbnail' => wp_get_attachment_image_url($post->ID, 'thumbnail') ?: wp_get_attachment_url($post->ID), 'alt' => (string) get_post_meta($post->ID, '_wp_attachment_image_alt', true), ]; } return ['items' => $items, 'pages' => $query->max_num_pages]; } public function chat_context(array $input) { return APEARI_Chat::create($input); } public function chat_generate(array $input) { $instruction = $input['instruction'] ?? null; if (!is_string($instruction) || !trim($instruction) || strlen($instruction) > 6000) { return new WP_Error('apeari_instruction', __('Opisz zmianę do 6000 bajtów.', 'apeari'), [ 'status' => 422, ]); } $context = APEARI_Chat::resolve( (string) ($input['contextId'] ?? ''), (string) ($input['sessionId'] ?? ''), ); if (is_wp_error($context)) { return $context; } $mode = get_option('apeari_mode', 'apeari'); $context['operationKey'] = 'chat:' . (string) $input['sessionId'] . ':' . (string) $input['contextId']; $local = APEARI_Chat::selected_text_plan($instruction, $context); $result = $local ?? ($mode === 'demo' ? APEARI_Chat::demo($instruction, $context) : APEARI_Providers::generate($mode, $instruction, $context)); if (is_wp_error($result)) { return $result; } $plan = APEARI_Chat::validate($result['plan'] ?? $result, $context); if (is_wp_error($plan)) { return $plan; } $current = APEARI_Chat::resolve((string) $input['contextId'], (string) $input['sessionId']); if (is_wp_error($current)) { return $current; } $targets = []; $documents = []; foreach ($plan['changes'] as $change) { $target = $current['targets'][$change['targetId']]['target']; $targets[$change['targetId']] = $target; $snapshot = APEARI_Context::snapshot((string) $input['sessionId'], $target['documentRef']); if (is_wp_error($snapshot)) { return $snapshot; } $doc = $snapshot['document']; $doc['content'] = $snapshot['content']; $doc['version'] = $snapshot['version']; $documents[$doc['ref']] = APEARI_Documents::public_data($doc); } return [ 'plan' => $plan, 'mode' => null === $local ? $mode : 'local', 'targets' => $targets, 'documents' => array_values($documents), ]; } public function preview(array $input) { return APEARI_Workspace::preview($input); } public function publish(array $input) { return APEARI_Workspace::write($input); } public function revert(array $input) { return APEARI_Workspace::write($input, true); } public function history(array $input) { return APEARI_Workspace::history($input); } public function content_state(array $input) { return APEARI_Content_Jobs::state(); } public function content_start(array $input) { return APEARI_Content_Jobs::start($input); } public function content_step(array $input) { return APEARI_Content_Jobs::step($input); } public function content_cancel(array $input) { return APEARI_Content_Jobs::cancel($input); } public function content_publish(array $input) { return APEARI_Content_Jobs::publish($input); } }