Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions assets/components/minishop3/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,27 +65,9 @@
$ms3 = $modx->services->get('ms3');
$ms3->initialize('web');

// Создаём роутер
// Создаём роутер — только Web API (фронтенд); manager connector не грузит эти пути (#384)
$router = new \MiniShop3\Router\Router($modx);

// Загружаем ТОЛЬКО Web API роуты (фронтенд, публичные)
$webRoutesFile = $componentPath . 'config/routes/web.php';

if (!file_exists($webRoutesFile)) {
throw new \Exception('Web routes not found: ' . $webRoutesFile);
}

$router->loadRoutes($webRoutesFile);

// Загружаем пользовательские роуты (опционально)
$customRoutesFile = MODX_CORE_PATH . 'config/ms3_routes_web.custom.php';
if (file_exists($customRoutesFile)) {
$router->loadRoutes($customRoutesFile);
}

$router->loadRoutesFromDirectory(\MiniShop3\Router\Router::coreAddonRoutesDirectory('web'));

// Строим dispatcher
$router->loadWebRoutes($componentPath, MODX_CORE_PATH);
$router->build();

// Обрабатываем запрос
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
*
* Скопируйте в: core/config/ms3.routes.d/manager/50-myaddon.php
*
* Порядок (Processors\Api\Router — встроенная админка MODX): системные manager.php →
* ms3_routes_manager.custom.php → ms3.routes.d/manager/*.php (web.php и ms3.routes.d/web/ не грузятся).
*
* Processors\Api\Index (кастомные фронты / Vue-менеджер): дополнительно web.php и ms3.routes.d/web/*.php.
* Порядок (Index и Router на connector): системные manager.php →
* ms3_routes_manager.custom.php → ms3.routes.d/manager/*.php.
* Storefront (web.php, ms3.routes.d/web/) — только через api.php (#384).
*
* @var \MiniShop3\Router\Router $router
* @var \MODX\Revolution\modX $modx
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
* core/config/ms3.routes.d/web/50-myaddon.php
* (имя с префиксом для порядка загрузки; файлы сортируются по алфавиту.)
*
* ВАЖНО — ДВЕ ТОЧКИ ВХОДА:
* ========================
* Файлы из ms3.routes.d/web/ подключаются и в публичном Web API (api.php), и в connector через
* Processors\Api\Index (кастомный фронт / Vue-менеджер). Они НЕ подключаются в Processors\Api\Router
* (встроенная админка MODX). Учитывайте это при проектировании путей и прав доступа.
* ВАЖНО — ТОЧКА ВХОДА:
* ====================
* Файлы из ms3.routes.d/web/ подключаются только в публичном Web API (api.php).
* Connector Index/Router manager-роуты не грузят (#384).
*
* ПОРЯДОК ЗАГРУЗКИ (Web API, api.php):
* ====================================
Expand Down
4 changes: 2 additions & 2 deletions core/components/minishop3/config/routes/manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
*
* DO NOT edit this file directly!
* For custom routes use: core/config/ms3_routes_manager.custom.php
* For addon fragments: core/config/ms3.routes.d/manager/*.php (connector). Web fragments (ms3.routes.d/web/)
* load via api.php and Processors\Api\Index only, not via Processors\Api\Router (built-in manager).
* For addon fragments: core/config/ms3.routes.d/manager/*.php (connector Index/Router).
* Web fragments (ms3.routes.d/web/) load via api.php onlynot via connector processors (#384).
*
* Custom and addon routes are loaded AFTER system routes and can override them.
*
Expand Down
2 changes: 1 addition & 1 deletion core/components/minishop3/config/routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* DO NOT edit this file directly!
* For custom routes use: core/config/ms3_routes_web.custom.php
* For addon fragments (one file per addon): core/config/ms3.routes.d/web/*.php
* (same fragments load in api.php and in Processors\Api\Index on connector, not in Processors\Api\Router)
* Loaded only via api.php — not via connector Index/Router (#384).
*
* Custom and addon routes are loaded AFTER system routes and can override them.
*
Expand Down
94 changes: 7 additions & 87 deletions core/components/minishop3/src/Processors/Api/Index.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,109 +2,29 @@

namespace MiniShop3\Processors\Api;

use MiniShop3\Router\Router as ApiRouter;
use MODX\Revolution\Processors\Processor;

/**
* Processor for handling API requests through connector.php (кастомные фронты / Vue-менеджер).
* Processor for handling API requests through connector.php (Vue Manager / custom mgr fronts).
*
* Полная цепочка: manager.php, web.php, custom-файлы, ms3.routes.d/manager и ms3.routes.d/web.
* Встроенная админка MODX использует Processors\Api\Routerбез web-роутов и без web-фрагментов.
* Manager routes only: manager.php, ms3_routes_manager.custom.php, ms3.routes.d/manager/.
* Storefront /api/v1 lives on api.phpnot loaded here (#384).
*
* Usage:
* connector.php?action=api&route=/api/mgr/test/success
* connector.php?action=MiniShop3\Processors\Api\Index&route=/api/mgr/...
*/
class Index extends Processor
{
use ProcessesManagerConnectorRouteTrait;

/** @var string $permission Empty string = public access without permission check */
public $permission = '';

/**
* Check access permissions
* Router will check permissions via middleware, so allow everything here
*
* @return bool
* Router middleware enforces mgr Auth + permissions per route.
*/
public function checkPermissions()
{
return true;
}

/**
* {@inheritdoc}
*/
public function process()
{
try {
$route = $this->getProperty('route', '');

if (empty($route)) {
return $this->failure('Route parameter is required', ['code' => 400]);
}

$componentPath = MODX_CORE_PATH . 'components/minishop3/';
$autoloader = $componentPath . 'vendor/autoload.php';

if (!file_exists($autoloader)) {
return $this->failure('Component not properly installed. Run: composer install', ['code' => 500]);
}

if (!class_exists('FastRoute\\simpleDispatcher')) {
require_once $autoloader;
}

$router = new ApiRouter($this->modx);

$systemRoutesFile = $componentPath . 'config/routes/manager.php';

if (!file_exists($systemRoutesFile)) {
return $this->failure('System routes not found: ' . $systemRoutesFile, ['code' => 500]);
}

$router->loadRoutes($systemRoutesFile);

$webRoutesFile = $componentPath . 'config/routes/web.php';

if (file_exists($webRoutesFile)) {
$router->loadRoutes($webRoutesFile);
}

$customRoutesFile = MODX_CORE_PATH . 'config/ms3_routes_manager.custom.php';

if (file_exists($customRoutesFile)) {
$router->loadRoutes($customRoutesFile);
}

$router->loadRoutesFromDirectory(ApiRouter::coreAddonRoutesDirectory('manager'));
$router->loadRoutesFromDirectory(ApiRouter::coreAddonRoutesDirectory('web'));

$router->build();

$response = $router->dispatch($route, $_SERVER['REQUEST_METHOD']);

$responseData = $response->getData();
$statusCode = $response->getStatusCode();

http_response_code($statusCode);

if ($statusCode >= 200 && $statusCode < 300) {
return $this->success('', $responseData['data'] ?? $responseData);
}

return $this->failure(
$responseData['message'] ?? 'API request failed',
$responseData
);

} catch (\Exception $e) {
$this->modx->log(\MODX\Revolution\modX::LOG_LEVEL_ERROR, '[MiniShop3 API] ' . $e->getMessage());

return $this->failure(
$this->modx->getOption('ms3_api_debug', null, false)
? $e->getMessage()
: 'Internal server error',
['code' => 500]
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

namespace MiniShop3\Processors\Api;

use MiniShop3\Router\Router as ApiRouter;

/**
* Shared connector.php dispatch for manager API routes (Index / Router).
*
* Manager routes only via Router::loadManagerRoutes(); storefront /api/v1 rejected (#384).
*/
trait ProcessesManagerConnectorRouteTrait
{
/**
* {@inheritdoc}
*/
public function process()
{
try {
$route = trim((string)$this->getProperty('route', ''));

if ($route === '') {
http_response_code(400);

return $this->failure('Route parameter is required', ['code' => 400]);
}

if (ApiRouter::isStorefrontRoute($route)) {
http_response_code(404);

return $this->failure(
'Storefront API is not available via manager connector. Use api.php.',
['code' => 404]
);
}

$componentPath = MODX_CORE_PATH . 'components/minishop3/';
$autoloader = $componentPath . 'vendor/autoload.php';

if (!file_exists($autoloader)) {
http_response_code(500);

return $this->failure('Component not properly installed. Run: composer install', ['code' => 500]);
}

$managerRoutes = $componentPath . 'config/routes/manager.php';
if (!file_exists($managerRoutes)) {
http_response_code(500);

return $this->failure('System routes not found: ' . $managerRoutes, ['code' => 500]);
}

if (!class_exists('FastRoute\\simpleDispatcher')) {
require_once $autoloader;
}

$router = new ApiRouter($this->modx);
$router->loadManagerRoutes($componentPath, MODX_CORE_PATH);
$router->build();

$response = $router->dispatch($route, $_SERVER['REQUEST_METHOD']);

$responseData = $response->getData();
$statusCode = $response->getStatusCode();

http_response_code($statusCode);

if ($statusCode >= 200 && $statusCode < 300) {
return $this->success('', $responseData['data'] ?? $responseData);
}

return $this->failure(
$responseData['message'] ?? 'API request failed',
$responseData
);
} catch (\Exception $e) {
$this->modx->log(\MODX\Revolution\modX::LOG_LEVEL_ERROR, '[MiniShop3 API] ' . $e->getMessage());
http_response_code(500);

return $this->failure(
$this->modx->getOption('ms3_api_debug', null, false)
? $e->getMessage()
: 'Internal server error',
['code' => 500]
);
}
}
}
80 changes: 5 additions & 75 deletions core/components/minishop3/src/Processors/Api/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,88 +2,18 @@

namespace MiniShop3\Processors\Api;

use MiniShop3\Router\Router as ApiRouter;
use MODX\Revolution\Processors\Processor;

/**
* Processor for handling API requests through connector.php (встроенная админка MODX, сессия менеджера).
* Processor for handling API requests through connector.php (built-in MODX manager UI).
*
* Загружаются только manager-роуты: системный manager.php, ms3_routes_manager.custom.php, ms3.routes.d/manager/.
* Web-роуты (web.php, ms3.routes.d/web/) сюда не подключаются — для них отдельные точки входа: api.php и Processors\Api\Index.
* Manager routes only: manager.php, ms3_routes_manager.custom.php, ms3.routes.d/manager/.
* Storefront /api/v1 lives on api.php (#384).
*
* Usage:
* connector.php?action=api&route=/api/mgr/test/success
* connector.php?action=MiniShop3\Processors\Api\Router&route=/api/mgr/...
*/
class Router extends Processor
{
/**
* {@inheritdoc}
*/
public function process()
{
try {
$route = $this->getProperty('route', '');

if (empty($route)) {
return $this->failure('Route parameter is required', ['code' => 400]);
}

$componentPath = MODX_CORE_PATH . 'components/minishop3/';
$autoloader = $componentPath . 'vendor/autoload.php';

if (!file_exists($autoloader)) {
return $this->failure('Component not properly installed. Run: composer install', ['code' => 500]);
}

if (!class_exists('FastRoute\\simpleDispatcher')) {
require_once $autoloader;
}

$router = new ApiRouter($this->modx);

$systemRoutesFile = $componentPath . 'config/routes/manager.php';

if (!file_exists($systemRoutesFile)) {
return $this->failure('System routes not found: ' . $systemRoutesFile, ['code' => 500]);
}

$router->loadRoutes($systemRoutesFile);

$customRoutesFile = MODX_CORE_PATH . 'config/ms3_routes_manager.custom.php';

if (file_exists($customRoutesFile)) {
$router->loadRoutes($customRoutesFile);
}

$router->loadRoutesFromDirectory(ApiRouter::coreAddonRoutesDirectory('manager'));

$router->build();

$response = $router->dispatch($route, $_SERVER['REQUEST_METHOD']);

$responseData = $response->getData();
$statusCode = $response->getStatusCode();

http_response_code($statusCode);

if ($statusCode >= 200 && $statusCode < 300) {
return $this->success('', $responseData['data'] ?? $responseData);
}

return $this->failure(
$responseData['message'] ?? 'API request failed',
$responseData
);

} catch (\Exception $e) {
$this->modx->log(\MODX\Revolution\modX::LOG_LEVEL_ERROR, '[MiniShop3 API] ' . $e->getMessage());

return $this->failure(
$this->modx->getOption('ms3_api_debug', null, false)
? $e->getMessage()
: 'Internal server error',
['code' => 500]
);
}
}
use ProcessesManagerConnectorRouteTrait;
}
Loading