Перезбірка сіду
Оновлення каталогу з легасі-консолі — лише читання, детерміновано, з рев'ю.
Каталог засіяно з бази консолі (animated-spoon). Коли в консолі з'являються мови чи мапінги провайдерів, які варто імпортувати, сід перезбирається зі свіжого дампу.
База консолі — це прод, і вона тільки читається
scripts/dump_console_db.sh відкриває з'єднання з default_transaction_read_only=on і 30-секундним statement timeout, виставленими на сервері через PGOPTIONS. Кожна інструкція в ньому — це SELECT. Навіть одрук, що вніс би запис, був би відхилений Postgres, а не виконаний.
Дані течуть лише в один бік: консоль → JSON-дамп → сід-файли → власна база цього сервісу. Шляху назад немає, і сам застосунок ніколи не тримає з'єднання з консоллю.
Перезбірка
# 1. Дамп (потрібен .env-console-db у корені репозиторію — у gitignore, ніколи не комітиться)
./scripts/dump_console_db.sh build/console-dump
# 2. Трансформація
python scripts/build_seed.py build/console-dump --out data/seed
# 3. Прочитати звіт
$EDITOR data/seed/REPORT.md
# 4. Переглянути дифф і закомітити
git diff --stat data/seed/
Трансформація чиста й детермінована: той самий дамп на вході дає байт-у-байт ті самі файли на виході, тож дифф справді придатний для рев'ю.
Як читати звіт
data/seed/REPORT.md перелічує кожне рішення білдера:
Multi-code (provider, language) pairs collapsed — де консоль пропонувала кілька кодів: який переміг і які були альтернативи. Кожна альтернатива лишається вхідним аліасом, тож ніщо, що резолвилось, не перестає.
Alias contests resolved — де один код претендував на дві мови й кому він дістався. fa-af, що пішов до «Farsi (Afghanistan)», а не до «Dari», — саме той випадок, вартий другої думки.
Merged duplicate console languages — рядки, що описують ту саму мову під різними id.
Languages with no usable code — імпортовані неактивними, з кодом-заглушкою, щоб нічого не втратити.
Aliases dropped (key already owned) — курований аліас, що зіткнувся з наявним кодом мови. Зазвичай коректно: de-DE — це власний рядок мови, тож de не отримує ще й de-de.
Providers with no regional overrides — це не прогалина. Консоль зберігала коди лише для регіональних мов.
Застосування
Коміту достатньо — деплой виконує python -m app.cli seed після міграцій. Локально:
python -m app.cli seed
python -m app.cli stats
Сід ідемпотентний і працює як upsert: рядки зіставляються за природним ключем і оновлюються на місці. Він ніколи не видаляє.
Для відомих йому рядків сід має пріоритет
Код, закріплений в адмінці для пари, яку сід теж несе, буде скинутий до засіяного значення на наступному деплої. Постійні виправлення мають бути в сіді — або виправте консоль і передампте, або додайте пару в таблицю каталогу в scripts/build_seed.py. Рядки, про які сід ніколи не чув, лишаються недоторканими.
Додавання провайдера в сід
CATALOG у scripts/build_seed.py дзеркалить config/providers.yaml із provider_credentials. Новому запису потрібні code, vendor_code, vendor_name, name, category, fallback_policy і legacy — ті service_name консолі, що мапляться на нього.
Правильний legacy — це те, що тримає старих викликачів робочими: кожна названа там назва стає аліасом провайдера, і кожен мапінг консолі під цими назвами вливається в таблицю цього провайдера.