// ═══════════════════════════════════════════════════════════════════════════════ // V2 — инициализация схемы БД // // ЭТО: CREATE TABLE IF NOT EXISTS — безопасный повторный запуск. // ЗАЧЕМ: // 1. Приложение само создаёт таблицы при старте — не нужны миграции. // 2. v2_ префикс изолирует тестовые таблицы от основных. // 3. Безопасно для production: IF NOT EXISTS. // // ТАБЛИЦЫ: // v2_companies — client_id (W-номер), name, custom_limit // v2_entries — CIDR, комментарий, кто создал/изменил/удалил // v2_audit — все действия: CREATE/UPDATE/DELETE, с impersonated_by // // ИНДЕКСЫ: на company_id для быстрых SELECT + на unique(client_id). // ═══════════════════════════════════════════════════════════════════════════════ async function ensureSchema(pool) { await pool.query(` -- Компании: W-номер уникален, upsert через ON CONFLICT CREATE TABLE IF NOT EXISTS v2_companies ( id SERIAL PRIMARY KEY, client_id VARCHAR(64) NOT NULL UNIQUE, name VARCHAR(255), custom_limit INTEGER DEFAULT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ ); -- Записи: CIDR + метаданные, soft delete CREATE TABLE IF NOT EXISTS v2_entries ( id SERIAL PRIMARY KEY, company_id INTEGER NOT NULL, value_cidr VARCHAR(64) NOT NULL, comment TEXT, created_by VARCHAR(255), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_by VARCHAR(255), updated_at TIMESTAMPTZ, deleted_by VARCHAR(255), deleted_at TIMESTAMPTZ ); -- Аудит: каждое действие с возможностью отследить имперсонацию CREATE TABLE IF NOT EXISTS v2_audit ( id SERIAL PRIMARY KEY, user_email VARCHAR(255) NOT NULL, company_id INTEGER NOT NULL, action VARCHAR(32) NOT NULL CHECK (action IN ('CREATE','UPDATE','DELETE')), old_value TEXT, new_value TEXT, entry_id INTEGER, impersonated_by VARCHAR(255) DEFAULT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_v2_audit_company_time ON v2_audit(company_id, created_at DESC); `); console.log('[v2:db] Schema ensured'); } module.exports = { ensureSchema };