Files
ipwhitelist-app/v2/src/db/schema.js
T

65 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ═══════════════════════════════════════════════════════════════════════════════
// 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 };