From f8730d9d099bbd01983a43e9e2c33f81fab7a7fe Mon Sep 17 00:00:00 2001 From: zeroday Date: Tue, 25 Aug 2026 22:35:20 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=82=D0=B8=D0=BF=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=B0=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B8=20=D0=B4=D0=BE=D0=B3=D0=BE=D0=BD=D1=8F=D1=8E=D1=89?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B0=D0=BD=D0=B3=D0=BB=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оба дефекта вскрылись сборкой образа после слияния веток. 1. public.ts: SQL выбирает content_json_en, а описание типа запроса пришло из ветки визиток и этой колонки не знало — tsc отказывался собирать. След слияния: запрос из одной ветки, тип из другой. 2. Английские колонки (sections.content_json_en, products.title_en/subtitle_en/ description_en) существуют на боевой базе, но их не создаёт ни одна миграция — когда-то добавили руками. На бою работало, на любой ЧИСТОЙ базе приложение упало бы на первом запросе /api/content. Заведена 005 с IF NOT EXISTS: на бою пусто, на чистой базе создаст. Проверено на живом сайте: образ собран, контейнер healthy, миграции 004 и 005 применились сами, /api/content отдаёт 4 раздела на двух языках, 2 продукта, полные реквизиты; страница визитки отвечает 200. --- backend/src/routes/public.ts | 2 +- db/005_english_columns.sql | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 db/005_english_columns.sql diff --git a/backend/src/routes/public.ts b/backend/src/routes/public.ts index e25a37b..42337b6 100644 --- a/backend/src/routes/public.ts +++ b/backend/src/routes/public.ts @@ -6,7 +6,7 @@ export const publicRouter = Router(); publicRouter.get('/content', async (_req, res) => { try { const [sections, products, approach, settings] = await Promise.all([ - query<{ key: string; title: string; content_json: unknown; sort_order: number }>( + query<{ key: string; title: string; content_json: unknown; content_json_en: unknown; sort_order: number }>( `SELECT key, title, content_json, content_json_en, sort_order FROM sections WHERE is_active = true diff --git a/db/005_english_columns.sql b/db/005_english_columns.sql new file mode 100644 index 0000000..8a403a0 --- /dev/null +++ b/db/005_english_columns.sql @@ -0,0 +1,16 @@ +-- Английские колонки для переключателя языка. +-- +-- Колонки уже существуют на боевой базе — их когда-то добавили вручную, минуя +-- миграции. Найдено 25.08.2026 при слиянии веток: код их читает, а ни один +-- файл в db/ не создаёт, то есть на любой ЧИСТОЙ базе (новый стенд, локальная +-- разработка, восстановление из пустого) приложение падало бы на первом же +-- запросе /api/content. +-- +-- IF NOT EXISTS делает миграцию безопасной для боевой базы: там она ничего не +-- изменит, только зафиксирует факт в _migrations. + +ALTER TABLE sections ADD COLUMN IF NOT EXISTS content_json_en JSONB; + +ALTER TABLE products ADD COLUMN IF NOT EXISTS title_en VARCHAR(256); +ALTER TABLE products ADD COLUMN IF NOT EXISTS subtitle_en VARCHAR(512); +ALTER TABLE products ADD COLUMN IF NOT EXISTS description_en TEXT;