65 lines
2.9 KiB
JavaScript
65 lines
2.9 KiB
JavaScript
// ═══════════════════════════════════════════════════════════════════════════════
|
||
// 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 };
|