2 Commits

Author SHA1 Message Date
NW
c8d8aad8c3 feat(bot): SHOP_DB_PATH env — путь к БД настраиваемый (единая DB с админкой)
All checks were successful
Release: multi-arch Docker images / build-push (push) Successful in 11m54s
По умолчанию ../db/shop.db; если задана SHOP_DB_PATH (например общий файл
с админкой shop) — используется она. Позволяет боту и Next.js-админке
работать с одной базой (иначе товары из custom.db админки не видны боту).
2026-08-24 22:50:13 +01:00
NW
1c17501476 fix(bot): единый источник активности — env SHOP_ACTIVATED приоритет над БД
All checks were successful
Release: multi-arch Docker images / build-push (push) Successful in 20m10s
Рассинхрон: панель Bbox пишет SHOP_ACTIVATED в env, но бот читал активность
из БД site_settings (первично) → даже при true в панели бот отвечал
'Shop is not activated'. Теперь env — единый источник; БД — фоллбэк
(для админки магазина, если env не задан). Кэш 30с сохранён.
Версия v1.0.2.
2026-08-24 21:08:08 +01:00
3 changed files with 30 additions and 20 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "telegram-shop-bot",
"version": "1.0.1",
"version": "1.0.2",
"type": "module",
"scripts": {
"test": "vitest run",

View File

@@ -5,7 +5,13 @@ import { dirname } from 'path';
import { pathToFileURL } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
const DB_PATH = new URL('../../db/shop.db', import.meta.url).pathname;
// Путь к БД: env SHOP_DB_PATH (для единой БД с админкой) → по умолчанию ../db/shop.db.
// Рассинхрон: админка (Next.js/Prisma) писала в custom.db, бот — в shop.db → товары,
// добавленные в админке, не были видны боту. Оба должны использовать ОДИН файл.
const DB_PATH =
process.env.SHOP_DB_PATH && process.env.SHOP_DB_PATH !== 'false'
? process.env.SHOP_DB_PATH
: new URL('../../db/shop.db', import.meta.url).pathname;
let betterDb;

View File

@@ -55,7 +55,10 @@ export async function getCommissionWallets() {
/**
* Check if the shop is activated.
* Reads site_settings.shop_activated; falls back to env SHOP_ACTIVATED !== 'false' (default true).
* Приоритет: env SHOP_ACTIVATED (единый источник — панель Bbox) → БД site_settings.
* Раньше БД была первичной, и смена «Магазин активирован» в панели (env) не
* влияла на бота (в БД оставалось старое значение) — рассинхрон «пишет true,
* а бот говорит not activated». Теперь env главный; БД — зеркало-фоллбэк.
* @returns {Promise<boolean>}
*/
export async function getShopActivated() {
@@ -64,25 +67,26 @@ export async function getShopActivated() {
return shopActivatedCache;
}
try {
const row = await db.getAsync(
"SELECT value FROM site_settings WHERE key = 'shop_activated'"
);
let activated;
if (row) {
activated = row.value !== 'false';
} else {
activated = process.env.SHOP_ACTIVATED !== 'false';
let activated;
// 1. env (панель Bbox / compose) — единый источник правды
if (process.env.SHOP_ACTIVATED !== undefined) {
activated = process.env.SHOP_ACTIVATED !== 'false';
} else {
// 2. БД site_settings (админка магазина может вести туда же)
try {
const row = await db.getAsync(
"SELECT value FROM site_settings WHERE key = 'shop_activated'"
);
activated = row ? row.value !== 'false' : true;
} catch (err) {
logger.error({ err }, 'Failed to read shop_activated from site_settings');
activated = true;
}
shopActivatedCache = activated;
shopActivatedCachedAt = now;
return activated;
} catch (err) {
logger.error({ err }, 'Failed to read shop_activated from site_settings');
return process.env.SHOP_ACTIVATED !== 'false';
}
shopActivatedCache = activated;
shopActivatedCachedAt = now;
return activated;
}
/**