From 2752ec3dd18261af9894c8a28a6775bdb22301c3 Mon Sep 17 00:00:00 2001 From: Nikita Kiselev Date: Sun, 3 Aug 2025 10:00:54 +0300 Subject: [PATCH] feat(app): add maintenance mode --- .../controller/extension/module/tgshop.php | 39 ++++++++++----- .../controller/extension/tgshop/handle.php | 4 ++ .../src/Handlers/HelloWorldHandler.php | 50 ------------------- .../src/Handlers/SettingsHandler.php | 1 + spa/src/main.js | 5 ++ spa/src/stores/SettingsStore.js | 2 + 6 files changed, 38 insertions(+), 63 deletions(-) delete mode 100755 module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HelloWorldHandler.php diff --git a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php index dc83d66..c834d30 100755 --- a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php +++ b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php @@ -1,5 +1,19 @@ 'Шёлк (silk)', ]; - private $error = array(); + private array $error = []; - public function index() + public function index(): void { $this->load->language('extension/module/tgshop'); $this->load->model('setting/setting'); @@ -83,9 +97,9 @@ class ControllerExtensionModuleTgshop extends Controller true ); - $data['settings'] = static::$settings; + $data['settings'] = static::getSettingsConfig(); - foreach (static::$settings as $configs) { + foreach ($data['settings'] as $configs) { foreach ($configs as $key => $config) { if ($config['type'] === 'image') { $this->load->model('tool/image'); @@ -99,6 +113,7 @@ class ControllerExtensionModuleTgshop extends Controller } elseif ($config['type'] === 'products') { $products = $this->request->post[$key] ?? $this->config->get($key) ?? []; $this->load->model('catalog/product'); + $data[$key] = []; foreach ($products as $productId) { $productItem = $this->model_catalog_product->getProduct($productId); $data[$key][] = [ @@ -106,12 +121,10 @@ class ControllerExtensionModuleTgshop extends Controller 'name' => $productItem['name'], ]; } + } elseif (isset($this->request->post[$key])) { + $data[$key] = $this->request->post[$key]; } else { - if (isset($this->request->post[$key])) { - $data[$key] = $this->request->post[$key]; - } else { - $data[$key] = $this->config->get($key); - } + $data[$key] = $this->config->get($key); } } } @@ -146,13 +159,13 @@ class ControllerExtensionModuleTgshop extends Controller $this->response->setOutput($this->load->view('extension/module/tgshop_init', $data)); } - protected function validate() + protected function validate(): bool { if (! $this->user->hasPermission('modify', 'extension/module/tgshop')) { $this->error['error_warning'] = $this->language->get('error_permission'); } - foreach (static::$settings as $configs) { + foreach (static::getSettingsConfig() as $configs) { foreach ($configs as $key => $config) { if (($config['required'] ?? false) === true && ! $this->request->post[$key]) { $this->error["error_$key"] = 'Поле "' . $this->language->get( @@ -235,7 +248,7 @@ class ControllerExtensionModuleTgshop extends Controller ]; } - private function getSettingsConfig(): array + private static function getSettingsConfig(): array { return [ 'general' => [ @@ -245,7 +258,7 @@ class ControllerExtensionModuleTgshop extends Controller 0 => 'Выключено', 1 => 'Включено', ], - 'help' => '', + 'help' => 'Если выключено, покупатели в Telegram увидят сообщение, что магазин временно закрыт. Заказы и просмотр товаров будут недоступны.', ], 'module_tgshop_app_name' => [ diff --git a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php index 9059ce3..13d9831 100755 --- a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php +++ b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php @@ -19,11 +19,15 @@ if (is_readable($sysLibPath . '/oc_telegram_shop.phar')) { throw new RuntimeException('Unable to locate bulk products directory.'); } +/** + * @property Config $config + */ class Controllerextensiontgshophandle extends Controller { public function index(): void { $app = ApplicationFactory::create([ + 'app_enabled' => filter_var($this->config->get('module_tgshop_status'), FILTER_VALIDATE_BOOLEAN), 'oc_config_tax' => $this->config->get('config_tax'), 'oc_default_currency' => $this->config->get('config_currency'), // ID группы покупателей, которая будет использоаваться в заказах через Телеграм. diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HelloWorldHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HelloWorldHandler.php deleted file mode 100755 index 7c613e7..0000000 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HelloWorldHandler.php +++ /dev/null @@ -1,50 +0,0 @@ -queryBuilder = $queryBuilder; - } - - public function handle(): JsonResponse - { - $languageId = 1; - - $products = $this->queryBuilder->newQuery() - ->select([ - 'products.product_id' => 'product_id', - 'products.quantity' => 'product_quantity', - 'product_description.name' => 'product_name', - 'products.price' => 'product_price', - ]) - ->from(db_table('product'), 'products') - ->join( - db_table('product_description') . ' AS product_description', - function (JoinClause $join) use ($languageId) { - $join->on('products.product_id', '=', 'product_description.product_id') - ->where('product_description.language_id', '=', $languageId); - } - ) - ->get(); - - return new JsonResponse([ - 'data' => array_map(function ($product) { - return [ - 'product_id' => (int) $product['product_id'], - 'product_quantity' => (int) $product['product_quantity'], - 'product_name' => $product['product_name'], - 'product_price' => (float) $product['product_price'], - ]; - }, $products), - ]); - } -} \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php index 116352d..cedab00 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php @@ -46,6 +46,7 @@ class SettingsHandler 'theme_light' => $this->settings->get('theme_light'), 'theme_dark' => $this->settings->get('theme_dark'), 'ya_metrika_enabled' => $this->settings->get('ya_metrika_enabled'), + 'app_enabled' => $this->settings->get('app_enabled'), ]); } diff --git a/spa/src/main.js b/spa/src/main.js index 0575c07..0682f9c 100644 --- a/spa/src/main.js +++ b/spa/src/main.js @@ -24,6 +24,11 @@ categoriesStore.fetchTopCategories(); categoriesStore.fetchCategories(); settings.load() + .then(() => { + if (settings.app_enabled === false) { + throw new Error('App disabled (maintenance mode)'); + } + }) .then(() => { document.documentElement.setAttribute('data-theme', settings.theme[window.Telegram.WebApp.colorScheme]); if (settings.night_auto) { diff --git a/spa/src/stores/SettingsStore.js b/spa/src/stores/SettingsStore.js index 7d675ef..b3dfe9a 100644 --- a/spa/src/stores/SettingsStore.js +++ b/spa/src/stores/SettingsStore.js @@ -3,6 +3,7 @@ import {fetchSettings} from "@/utils/ftch.js"; export const useSettingsStore = defineStore('settings', { state: () => ({ + app_enabled: true, app_name: 'OpenCart Telegram магазин', app_icon: '', app_icon192: '', @@ -32,6 +33,7 @@ export const useSettingsStore = defineStore('settings', { this.theme.light = settings.theme_light; this.theme.dark = settings.theme_dark; this.ya_metrika_enabled = settings.ya_metrika_enabled; + this.app_enabled = settings.app_enabled; } } });