routes.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. declare(strict_types=1);
  3. use App\Middleware\Admin;
  4. use App\Middleware\Guest;
  5. use App\Middleware\NodeToken;
  6. use App\Middleware\User;
  7. use Slim\Routing\RouteCollectorProxy;
  8. return static function (Slim\App $app): void {
  9. // Home
  10. $app->get('/', App\Controllers\HomeController::class . ':index');
  11. $app->get('/tos', App\Controllers\HomeController::class . ':tos');
  12. $app->get('/staff', App\Controllers\HomeController::class . ':staff');
  13. // Error Page
  14. $app->get('/404', App\Controllers\HomeController::class . ':notFound');
  15. $app->get('/405', App\Controllers\HomeController::class . ':methodNotAllowed');
  16. $app->get('/500', App\Controllers\HomeController::class . ':internalServerError');
  17. // Bot Callback
  18. $app->post('/callback/{type}', App\Controllers\CallbackController::class . ':index');
  19. // OAuth
  20. $app->post('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
  21. $app->get('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
  22. // 通用订阅
  23. $app->get('/sub/{token}/{subtype}', App\Controllers\SubController::class . ':index');
  24. // User
  25. $app->group('/user', static function (RouteCollectorProxy $group): void {
  26. $group->get('', App\Controllers\UserController::class . ':index');
  27. $group->get('/', App\Controllers\UserController::class . ':index');
  28. // 签到
  29. $group->post('/checkin', App\Controllers\UserController::class . ':checkin');
  30. // 公告
  31. $group->get('/announcement', App\Controllers\UserController::class . ':announcement');
  32. // 文档
  33. $group->get('/docs', App\Controllers\User\DocsController::class . ':index');
  34. $group->get('/docs/{id:[0-9]+}/view', App\Controllers\User\DocsController::class . ':detail');
  35. // 个人资料
  36. $group->get('/profile', App\Controllers\UserController::class . ':profile');
  37. // Invite
  38. $group->get('/invite', App\Controllers\User\InviteController::class . ':index');
  39. $group->post('/invite/reset', App\Controllers\User\InviteController::class . ':reset');
  40. // 封禁
  41. $group->get('/banned', App\Controllers\UserController::class . ':banned');
  42. // 节点
  43. $group->get('/server', App\Controllers\User\ServerController::class . ':index');
  44. // 动态倍率
  45. $group->get('/rate', App\Controllers\User\RateController::class . ':index');
  46. $group->post('/rate', App\Controllers\User\RateController::class . ':ajax');
  47. // 审计
  48. $group->get('/detect', App\Controllers\User\DetectRuleController::class . ':index');
  49. $group->get('/detect/log', App\Controllers\User\DetectLogController::class . ':index');
  50. // 工单
  51. $group->get('/ticket', App\Controllers\User\TicketController::class . ':index');
  52. $group->get('/ticket/create', App\Controllers\User\TicketController::class . ':create');
  53. $group->post('/ticket', App\Controllers\User\TicketController::class . ':add');
  54. $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\User\TicketController::class . ':detail');
  55. $group->put('/ticket/{id:[0-9]+}', App\Controllers\User\TicketController::class . ':update');
  56. // 资料编辑
  57. $group->get('/edit', App\Controllers\User\InfoController::class . ':index');
  58. $group->post('/email', App\Controllers\User\InfoController::class . ':updateEmail');
  59. $group->post('/username', App\Controllers\User\InfoController::class . ':updateUsername');
  60. $group->post('/unbind_im', App\Controllers\User\InfoController::class . ':unbindIM');
  61. $group->post('/password', App\Controllers\User\InfoController::class . ':updatePassword');
  62. $group->post('/passwd_reset', App\Controllers\User\InfoController::class . ':resetPasswd');
  63. $group->post('/apitoken_reset', App\Controllers\User\InfoController::class . ':resetApiToken');
  64. $group->post('/method', App\Controllers\User\InfoController::class . ':updateMethod');
  65. $group->post('/url_reset', App\Controllers\User\InfoController::class . ':resetURL');
  66. $group->post('/daily_mail', App\Controllers\User\InfoController::class . ':updateDailyMail');
  67. $group->post('/contact_method', App\Controllers\User\InfoController::class . ':updateContactMethod');
  68. $group->post('/theme', App\Controllers\User\InfoController::class . ':updateTheme');
  69. $group->post('/kill', App\Controllers\User\InfoController::class . ':sendToGulag');
  70. // 发送验证邮件
  71. $group->post('/send', App\Controllers\AuthController::class . ':sendVerify');
  72. // MFA
  73. $group->post('/ga_check', App\Controllers\User\MFAController::class . ':checkGa');
  74. $group->post('/ga_set', App\Controllers\User\MFAController::class . ':setGa');
  75. $group->post('/ga_reset', App\Controllers\User\MFAController::class . ':resetGa');
  76. // 深色模式切换
  77. $group->post('/switch_theme_mode', App\Controllers\UserController::class . ':switchThemeMode');
  78. // 订阅记录
  79. $group->get('/subscribe', App\Controllers\User\SubLogController::class . ':index');
  80. // 流量记录
  81. $group->get('/traffic', App\Controllers\User\TrafficLogController::class . ':index');
  82. // 账户余额
  83. $group->get('/money', App\Controllers\User\MoneyController::class . ':index');
  84. $group->post('/giftcard', App\Controllers\User\MoneyController::class . ':applyGiftCard');
  85. // 产品页面
  86. $group->get('/product', App\Controllers\User\ProductController::class . ':index');
  87. // 订单页面
  88. $group->get('/order', App\Controllers\User\OrderController::class . ':index');
  89. $group->get('/order/create', App\Controllers\User\OrderController::class . ':create');
  90. $group->post('/order/create', App\Controllers\User\OrderController::class . ':process');
  91. $group->get('/order/{id:[0-9]+}/view', App\Controllers\User\OrderController::class . ':detail');
  92. $group->post('/order/ajax', App\Controllers\User\OrderController::class . ':ajax');
  93. // 账单页面
  94. $group->get('/invoice', App\Controllers\User\InvoiceController::class . ':index');
  95. $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\User\InvoiceController::class . ':detail');
  96. $group->post('/invoice/pay_balance', App\Controllers\User\InvoiceController::class . ':payBalance');
  97. $group->post('/invoice/ajax', App\Controllers\User\InvoiceController::class . ':ajax');
  98. // 新优惠码系统
  99. $group->post('/coupon', App\Controllers\User\CouponController::class . ':check');
  100. // 支付
  101. $group->post('/payment/purchase/{type}', App\Services\Payment::class . ':purchase');
  102. $group->get('/payment/purchase/{type}', App\Services\Payment::class . ':purchase');
  103. $group->get('/payment/return/{type}', App\Services\Payment::class . ':returnHTML');
  104. // Get Clients
  105. $group->get('/clients/{name}', App\Controllers\User\ClientController::class . ':getClients');
  106. // 登出
  107. $group->get('/logout', App\Controllers\UserController::class . ':logout');
  108. })->add(new User());
  109. $app->group('/payment', static function (RouteCollectorProxy $group): void {
  110. $group->get('/notify/{type}', App\Services\Payment::class . ':notify');
  111. $group->post('/notify/{type}', App\Services\Payment::class . ':notify');
  112. $group->post('/status/{type}', App\Services\Payment::class . ':getStatus');
  113. });
  114. // Auth
  115. $app->group('/auth', static function (RouteCollectorProxy $group): void {
  116. $group->get('/login', App\Controllers\AuthController::class . ':login');
  117. $group->post('/login', App\Controllers\AuthController::class . ':loginHandle');
  118. $group->get('/register', App\Controllers\AuthController::class . ':register');
  119. $group->post('/register', App\Controllers\AuthController::class . ':registerHandle');
  120. $group->post('/send', App\Controllers\AuthController::class . ':sendVerify');
  121. $group->get('/logout', App\Controllers\AuthController::class . ':logout');
  122. })->add(new Guest());
  123. // Password
  124. $app->group('/password', static function (RouteCollectorProxy $group): void {
  125. $group->get('/reset', App\Controllers\PasswordController::class . ':reset');
  126. $group->post('/reset', App\Controllers\PasswordController::class . ':handleReset');
  127. $group->get('/token/{token}', App\Controllers\PasswordController::class . ':token');
  128. $group->post('/token/{token}', App\Controllers\PasswordController::class . ':handleToken');
  129. })->add(new Guest());
  130. // Admin
  131. $app->group('/admin', static function (RouteCollectorProxy $group): void {
  132. $group->get('', App\Controllers\AdminController::class . ':index');
  133. $group->get('/', App\Controllers\AdminController::class . ':index');
  134. // Node
  135. $group->get('/node', App\Controllers\Admin\NodeController::class . ':index');
  136. $group->get('/node/create', App\Controllers\Admin\NodeController::class . ':create');
  137. $group->post('/node', App\Controllers\Admin\NodeController::class . ':add');
  138. $group->get('/node/{id:[0-9]+}/edit', App\Controllers\Admin\NodeController::class . ':edit');
  139. $group->post(
  140. '/node/{id:[0-9]+}/reset_password',
  141. App\Controllers\Admin\NodeController::class . ':resetPassword'
  142. );
  143. $group->post(
  144. '/node/{id:[0-9]+}/reset_bandwidth',
  145. App\Controllers\Admin\NodeController::class . ':resetBandwidth'
  146. );
  147. $group->post('/node/{id:[0-9]+}/copy', App\Controllers\Admin\NodeController::class . ':copy');
  148. $group->put('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':update');
  149. $group->delete('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':delete');
  150. $group->post('/node/ajax', App\Controllers\Admin\NodeController::class . ':ajax');
  151. // Ticket
  152. $group->get('/ticket', App\Controllers\Admin\TicketController::class . ':index');
  153. $group->post('/ticket', App\Controllers\Admin\TicketController::class . ':add');
  154. $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\Admin\TicketController::class . ':detail');
  155. $group->put('/ticket/{id:[0-9]+}/close', App\Controllers\Admin\TicketController::class . ':close');
  156. $group->put('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':update');
  157. $group->put('/ticket/{id:[0-9]+}/ai', App\Controllers\Admin\TicketController::class . ':updateAI');
  158. $group->delete('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':delete');
  159. $group->post('/ticket/ajax', App\Controllers\Admin\TicketController::class . ':ajax');
  160. // Ann
  161. $group->get('/announcement', App\Controllers\Admin\AnnController::class . ':index');
  162. $group->get('/announcement/create', App\Controllers\Admin\AnnController::class . ':create');
  163. $group->post('/announcement', App\Controllers\Admin\AnnController::class . ':add');
  164. $group->get('/announcement/{id:[0-9]+}/edit', App\Controllers\Admin\AnnController::class . ':edit');
  165. $group->put('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':update');
  166. $group->delete('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':delete');
  167. $group->post('/announcement/ajax', App\Controllers\Admin\AnnController::class . ':ajax');
  168. // Docs
  169. $group->get('/docs', App\Controllers\Admin\DocsController::class . ':index');
  170. $group->get('/docs/create', App\Controllers\Admin\DocsController::class . ':create');
  171. $group->post('/docs', App\Controllers\Admin\DocsController::class . ':add');
  172. $group->post('/docs/generate', App\Controllers\Admin\DocsController::class . ':generate');
  173. $group->get('/docs/{id:[0-9]+}/edit', App\Controllers\Admin\DocsController::class . ':edit');
  174. $group->put('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':update');
  175. $group->delete('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':delete');
  176. $group->post('/docs/ajax', App\Controllers\Admin\DocsController::class . ':ajax');
  177. // 审计规则
  178. $group->get('/detect', App\Controllers\Admin\DetectRuleController::class . ':index');
  179. $group->get('/detect/create', App\Controllers\Admin\DetectRuleController::class . ':create');
  180. $group->post('/detect/add', App\Controllers\Admin\DetectRuleController::class . ':add');
  181. $group->delete('/detect/{id:[0-9]+}', App\Controllers\Admin\DetectRuleController::class . ':delete');
  182. $group->post('/detect/ajax', App\Controllers\Admin\DetectRuleController::class . ':ajax');
  183. // 审计触发日志
  184. $group->get('/detect/log', App\Controllers\Admin\DetectLogController::class . ':index');
  185. $group->post('/detect/log/ajax', App\Controllers\Admin\DetectLogController::class . ':ajax');
  186. // 审计封禁日志
  187. $group->get('/detect/ban', App\Controllers\Admin\DetectBanLogController::class . ':index');
  188. $group->post('/detect/ban/ajax', App\Controllers\Admin\DetectBanLogController::class . ':ajax');
  189. // User
  190. $group->get('/user', App\Controllers\Admin\UserController::class . ':index');
  191. $group->get('/user/{id:[0-9]+}/edit', App\Controllers\Admin\UserController::class . ':edit');
  192. $group->put('/user/{id:[0-9]+}', App\Controllers\Admin\UserController::class . ':update');
  193. $group->post('/user/create', App\Controllers\Admin\UserController::class . ':create');
  194. $group->delete('/user/{id}', App\Controllers\Admin\UserController::class . ':delete');
  195. $group->post('/user/ajax', App\Controllers\Admin\UserController::class . ':ajax');
  196. // Coupon
  197. $group->get('/coupon', App\Controllers\Admin\CouponController::class . ':index');
  198. $group->post('/coupon', App\Controllers\Admin\CouponController::class . ':add');
  199. $group->post('/coupon/ajax', App\Controllers\Admin\CouponController::class . ':ajax');
  200. $group->delete('/coupon/{id:[0-9]+}', App\Controllers\Admin\CouponController::class . ':delete');
  201. $group->post('/coupon/{id:[0-9]+}/disable', App\Controllers\Admin\CouponController::class . ':disable');
  202. // 登录日志
  203. $group->get('/login', App\Controllers\Admin\LoginLogController::class . ':index');
  204. $group->post('/login/ajax', App\Controllers\Admin\LoginLogController::class . ':ajax');
  205. // 在线IP日志
  206. $group->get('/online', App\Controllers\Admin\OnlineLogController::class . ':index');
  207. $group->post('/online/ajax', App\Controllers\Admin\OnlineLogController::class . ':ajax');
  208. // 订阅日志
  209. $group->get('/subscribe', App\Controllers\Admin\SubLogController::class . ':index');
  210. $group->post('/subscribe/ajax', App\Controllers\Admin\SubLogController::class . ':ajax');
  211. // 返利日志
  212. $group->get('/payback', App\Controllers\Admin\PaybackController::class . ':index');
  213. $group->post('/payback/ajax', App\Controllers\Admin\PaybackController::class . ':ajax');
  214. // 用户余额日志
  215. $group->get('/money', App\Controllers\Admin\MoneyLogController::class . ':index');
  216. $group->post('/money/ajax', App\Controllers\Admin\MoneyLogController::class . ':ajax');
  217. // 支付网关日志
  218. $group->get('/gateway', App\Controllers\Admin\PaylistController::class . ':index');
  219. $group->post('/gateway/ajax', App\Controllers\Admin\PaylistController::class . ':ajax');
  220. // 系统日志
  221. $group->get('/syslog', App\Controllers\Admin\SysLogController::class . ':index');
  222. $group->get('/syslog/{id:[0-9]+}/view', App\Controllers\Admin\SysLogController::class . ':detail');
  223. $group->post('/syslog/ajax', App\Controllers\Admin\SysLogController::class . ':ajax');
  224. // 系统状态
  225. $group->get('/system', App\Controllers\Admin\SystemController::class . ':index');
  226. $group->post('/system/check_update', App\Controllers\Admin\SystemController::class . ':checkUpdate');
  227. // 设置中心
  228. $group->get('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':index');
  229. $group->post('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':save');
  230. $group->post(
  231. '/setting/billing/set_stripe_webhook',
  232. App\Controllers\Admin\Setting\BillingController::class . ':setStripeWebhook'
  233. );
  234. $group->get('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':index');
  235. $group->post('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':save');
  236. $group->get('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':index');
  237. $group->post('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':save');
  238. $group->get('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':index');
  239. $group->post('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':save');
  240. $group->get('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':index');
  241. $group->post('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':save');
  242. $group->get('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':index');
  243. $group->post('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':save');
  244. $group->get('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':index');
  245. $group->post('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':save');
  246. $group->get('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':index');
  247. $group->post('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':save');
  248. $group->get('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':index');
  249. $group->post('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':save');
  250. $group->get('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':index');
  251. $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':save');
  252. // 设置测试
  253. $group->post(
  254. '/setting/test/email',
  255. App\Controllers\Admin\Setting\EmailController::class . ':testEmail'
  256. );
  257. $group->post(
  258. '/setting/test/telegram',
  259. App\Controllers\Admin\Setting\ImController::class . ':testTelegram'
  260. );
  261. $group->post(
  262. '/setting/test/discord',
  263. App\Controllers\Admin\Setting\ImController::class . ':testDiscord'
  264. );
  265. $group->post(
  266. '/setting/test/slack',
  267. App\Controllers\Admin\Setting\ImController::class . ':testSlack'
  268. );
  269. // 礼品卡
  270. $group->get('/giftcard', App\Controllers\Admin\GiftCardController::class . ':index');
  271. $group->post('/giftcard', App\Controllers\Admin\GiftCardController::class . ':add');
  272. $group->post('/giftcard/ajax', App\Controllers\Admin\GiftCardController::class . ':ajax');
  273. $group->delete('/giftcard/{id:[0-9]+}', App\Controllers\Admin\GiftCardController::class . ':delete');
  274. // 商品
  275. $group->get('/product', App\Controllers\Admin\ProductController::class . ':index');
  276. $group->get('/product/create', App\Controllers\Admin\ProductController::class . ':create');
  277. $group->post('/product', App\Controllers\Admin\ProductController::class . ':add');
  278. $group->get('/product/{id:[0-9]+}/edit', App\Controllers\Admin\ProductController::class . ':edit');
  279. $group->post('/product/{id:[0-9]+}/copy', App\Controllers\Admin\ProductController::class . ':copy');
  280. $group->put('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':update');
  281. $group->delete('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':delete');
  282. $group->post('/product/ajax', App\Controllers\Admin\ProductController::class . ':ajax');
  283. // 订单
  284. $group->get('/order', App\Controllers\Admin\OrderController::class . ':index');
  285. $group->get('/order/{id:[0-9]+}/view', App\Controllers\Admin\OrderController::class . ':detail');
  286. $group->post('/order/{id:[0-9]+}/cancel', App\Controllers\Admin\OrderController::class . ':cancel');
  287. $group->delete('/order/{id:[0-9]+}', App\Controllers\Admin\OrderController::class . ':delete');
  288. $group->post('/order/ajax', App\Controllers\Admin\OrderController::class . ':ajax');
  289. // 账单
  290. $group->get('/invoice', App\Controllers\Admin\InvoiceController::class . ':index');
  291. $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\Admin\InvoiceController::class . ':detail');
  292. $group->post('/invoice/{id:[0-9]+}/mark_paid', App\Controllers\Admin\InvoiceController::class . ':markPaid');
  293. $group->post('/invoice/ajax', App\Controllers\Admin\InvoiceController::class . ':ajax');
  294. })->add(new Admin());
  295. // WebAPI
  296. $app->group('/mod_mu', static function (RouteCollectorProxy $group): void {
  297. // 节点
  298. $group->get('/nodes/{id:[0-9]+}/info', App\Controllers\WebAPI\NodeController::class . ':getInfo');
  299. // 用户
  300. $group->get('/users', App\Controllers\WebAPI\UserController::class . ':index');
  301. $group->post('/users/traffic', App\Controllers\WebAPI\UserController::class . ':addTraffic');
  302. $group->post('/users/aliveip', App\Controllers\WebAPI\UserController::class . ':addAliveIp');
  303. $group->post('/users/detectlog', App\Controllers\WebAPI\UserController::class . ':addDetectLog');
  304. // 审计 & 杂七杂八的功能
  305. $group->get('/func/detect_rules', App\Controllers\WebAPI\FuncController::class . ':getDetectRules');
  306. $group->get('/func/ping', App\Controllers\WebAPI\FuncController::class . ':ping');
  307. })->add(new NodeToken());
  308. // Admin REST API
  309. //$app->group('/admin/api/v1', function (RouteCollectorProxy $group): void {
  310. // $group->post('/{action}', App\Controllers\Api\AdminApiV1Controller::class . ':actionHandler');
  311. //})->add(new AdminApi());
  312. // User REST API
  313. //$app->group('/user/api/v1', function (RouteCollectorProxy $group): void {
  314. // $group->post('/{action}', App\Controllers\Api\UserApiV1Controller::class . ':actionHandler');
  315. //})->add(new UserApi());
  316. // WebAPI V2(Aka Node API V1)
  317. //$app->group('/node/api/v1', function (RouteCollectorProxy $group): void {
  318. // $group->put('/heartbeat', App\Controllers\Api\NodeApiV1Controller::class . ':getHeartbeat');
  319. // $group->get('/info', App\Controllers\Api\NodeApiV1Controller::class . ':getInfo');
  320. // $group->get('/user', App\Controllers\Api\NodeApiV1Controller::class . ':getUser');
  321. // $group->get('/detect_rule', App\Controllers\Api\NodeApiV1Controller::class . ':getDetectRule');
  322. // $group->post('/user/traffic', App\Controllers\Api\NodeApiV1Controller::class . ':addUserTraffic');
  323. // $group->post('/user/online_ip', App\Controllers\Api\NodeApiV1Controller::class . ':addUserOnlineIp');
  324. // $group->post('/user/detect_log', App\Controllers\Api\NodeApiV1Controller::class . ':addUserDetectLog');
  325. //})->add(new NodeApi());
  326. };