[598][@ant] refactor(boot): market extension рядом с capital в postgres-init — как и должно быть

Перенёс INSERT extension market из ad-hoc функции в installExtraData (где
он был хаком сразу после фикса) в initExtensionsInPostgres() — там же где
capital и reports. Это правильное архитектурное место: postgres-init.ts
владеет seed'ом extensions при первичной инициализации PG, и market теперь
получает ту же обработку, что capital.

schema_version=0 в INSERT означает: при следующем старте coopback
ExtensionSchemaMigrationService прогонит marketplace-bootstrap миграции
v1→v6 по порядку. v4 (upsertBaseline) сидирует 9 baseline-категорий.

Заодно убрал дубликат ensureMarketplaceExtensionEnabled() из infra.ts.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-21 10:30:56 +00:00
parent 2a73af90d3
commit 4d7ac317fc
2 changed files with 27 additions and 38 deletions
-38
View File
@@ -697,34 +697,6 @@ async function getOnChainActiveKey(blockchain: Blockchain, username: string): Pr
}
}
async function ensureMarketplaceExtensionEnabled(pg: PgClient): Promise<void> {
// Дефолт-конфиг marketplace (из components/controller/.../marketplace/types.ts).
// schema_version=0 → ExtensionSchemaMigrationService при init coopback пройдёт
// миграции v1→v6 по порядку; v4 (marketplace-bootstrap-v4) сделает
// marketplaceCategoryRepository.upsertBaseline() и заполнит marketplace_category.
const defaultMarketplaceConfig = {
enabled: true,
debug: false,
lastSyncTimestamp: '',
coopAcceptance: {
accepted: false,
document_registry_id: 0,
accepted_at: '',
accepted_by_board_decision_id: '',
},
writeoff: {
auto_proposal_enabled: false,
expiry_grace_days: 7,
},
}
await pg.query(`
INSERT INTO extensions (name, enabled, schema_version, config, created_at, updated_at)
VALUES ('market', true, 0, $1::jsonb, NOW(), NOW())
ON CONFLICT (name) DO NOTHING
`, [JSON.stringify(defaultMarketplaceConfig)])
console.log('[mvp] extension `market` активирован (schema_version=0 → миграции v1-v6 при следующем старте coopback)')
}
async function ensureMarketplaceParticipant(
blockchain: Blockchain,
generator: Generator,
@@ -1140,16 +1112,6 @@ export async function installExtraData(blockchain: Blockchain) {
await ensureParticipantBranchOnChain(blockchain, coopname, a.username, a.braname, wif)
}
// 5. Активируем extension `market` в реестре расширений кооператива.
// Без этой записи MarketplacePlugin.initialize() бросает «Конфиг не найден»,
// bootstrap-миграции v1-v6 не запускаются → marketplace_category пустая →
// фронт UI Стола заказов («Категория *» в форме offer-create) залипает на
// валидации. В проде это делает chairman через GraphQL installExtension;
// в boot:extra сидируем напрямую через PG с schema_version=0, чтобы при
// следующем старте coopback миграции прогнались по порядку и засеяли
// baseline-категории (9 продовольственных + «Прочее»).
await ensureMarketplaceExtensionEnabled(pg)
await pg.end()
await mongoose.disconnect().catch(() => {})
+27
View File
@@ -294,6 +294,33 @@ export async function initExtensionsInPostgres() {
ON CONFLICT (name) DO NOTHING
`, ['reports', true, '{}', 1])
// market — расширение «Стол заказов» (Marketplace MVP). Без записи в
// extensions MarketplacePlugin.initialize() бросает «Конфиг не найден»,
// bootstrap-миграции v1-v6 не запускаются → marketplace_category пустая,
// marketplaceListCategories возвращает [], форма create-offer падает на
// валидации «Категория *». schema_version=0 чтобы все 6 миграций marketplace
// прогнались по порядку (v4 → upsertBaseline для 9 категорий).
const marketConfig = {
enabled: true,
debug: false,
lastSyncTimestamp: '',
coopAcceptance: {
accepted: false,
document_registry_id: 0,
accepted_at: '',
accepted_by_board_decision_id: '',
},
writeoff: {
auto_proposal_enabled: false,
expiry_grace_days: 7,
},
}
await client.query(`
INSERT INTO "extensions" (name, enabled, config, schema_version)
VALUES ($1, $2, $3, $4)
ON CONFLICT (name) DO NOTHING
`, ['market', true, JSON.stringify(marketConfig), 0])
console.log('Extensions инициализированы в PostgreSQL')
}
catch (error) {