* Dispatch one guarded operation. * * @param array $payload * @param array $authContext * @return array */
(string $operation, array $payload = [], array $authContext = [])
| 71 | * @return array<string,mixed> |
| 72 | */ |
| 73 | public static function dispatch(string $operation, array $payload = [], array $authContext = []): array |
| 74 | { |
| 75 | try { |
| 76 | self::ensureBootstrap(); |
| 77 | $ctx = McpOpsContext::fromAuthPayload($authContext); |
| 78 | $op = self::normalizeOperation($operation); |
| 79 | |
| 80 | switch ($op) { |
| 81 | case 'list_folders': |
| 82 | case 'list_children': |
| 83 | return self::opListFolders($ctx, $payload); |
| 84 | case 'list_files': |
| 85 | return self::opListFiles($ctx, $payload); |
| 86 | case 'read_file': |
| 87 | return self::opReadFile($ctx, $payload); |
| 88 | case 'create_file': |
| 89 | return self::opCreateFile($ctx, $payload); |
| 90 | case 'create_folder': |
| 91 | return self::opCreateFolder($ctx, $payload); |
| 92 | case 'copy_files': |
| 93 | return self::opCopyFiles($ctx, $payload); |
| 94 | case 'move_files': |
| 95 | return self::opMoveFiles($ctx, $payload); |
| 96 | case 'rename_file': |
| 97 | return self::opRenameFile($ctx, $payload); |
| 98 | case 'move_folder': |
| 99 | case 'move_folders': |
| 100 | return self::opMoveFolder($ctx, $payload); |
| 101 | case 'delete_files': |
| 102 | return self::opDeleteFiles($ctx, $payload); |
| 103 | case 'delete_folder': |
| 104 | return self::opDeleteFolder($ctx, $payload); |
| 105 | case 'save_file_tag': |
| 106 | return self::opSaveFileTag($ctx, $payload); |
| 107 | case 'get_file_tags': |
| 108 | return self::opGetFileTags($ctx, $payload); |
| 109 | default: |
| 110 | throw new RuntimeException( |
| 111 | 'Unsupported MCP core operation. raw=' . trim($operation) . ' normalized=' . $op, |
| 112 | 400 |
| 113 | ); |
| 114 | } |
| 115 | } catch (RuntimeException $e) { |
| 116 | $status = (int)$e->getCode(); |
| 117 | if ($status < 400 || $status > 599) { |
| 118 | $status = 400; |
| 119 | } |
| 120 | return [ |
| 121 | 'ok' => false, |
| 122 | 'error' => $e->getMessage(), |
| 123 | 'status' => $status, |
| 124 | ]; |
| 125 | } catch (Throwable $e) { |
| 126 | error_log('McpCoreOpsService::dispatch error: ' . $e->getMessage()); |
| 127 | return [ |
| 128 | 'ok' => false, |
| 129 | 'error' => 'Internal error', |
| 130 | 'status' => 500, |
no test coverage detected