v2: CRUD-модуль — /v2/app с выбором компании, добавление/изменение/удаление записей
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
-- ═══════════════════════════════════════════════════════════════════════════════
|
||||
-- V2 schema — отдельные таблицы, не пересекаются с основным приложением
|
||||
-- ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
-- Компании (по W-номеру = client_id)
|
||||
CREATE TABLE IF NOT EXISTS v2_companies (
|
||||
id SERIAL PRIMARY KEY,
|
||||
client_id VARCHAR(64) UNIQUE NOT NULL, -- WZ01112, WZ03709 ...
|
||||
name VARCHAR(255), -- название компании
|
||||
custom_limit INTEGER DEFAULT NULL -- NULL = использовать DEFAULT_LIMIT
|
||||
CHECK (custom_limit IS NULL OR custom_limit >= 0),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Записи белого списка (soft delete через deleted_at)
|
||||
CREATE TABLE IF NOT EXISTS v2_entries (
|
||||
id SERIAL PRIMARY KEY,
|
||||
company_id INTEGER NOT NULL REFERENCES v2_companies(id) ON DELETE RESTRICT,
|
||||
value_cidr VARCHAR(18) NOT NULL -- формат: x.x.x.x/xx (CIDR или /32)
|
||||
CHECK (value_cidr ~ '^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$'),
|
||||
comment VARCHAR(255),
|
||||
created_by VARCHAR(255) NOT NULL, -- email создателя
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_by VARCHAR(255),
|
||||
updated_at TIMESTAMPTZ,
|
||||
deleted_by VARCHAR(255),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Уникальность: в одной компании не может быть двух активных записей с одинаковым CIDR
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_v2_entries_active_cidr
|
||||
ON v2_entries(company_id, value_cidr) WHERE deleted_at IS NULL;
|
||||
|
||||
-- Быстрый список активных записей компании
|
||||
CREATE INDEX IF NOT EXISTS idx_v2_entries_active
|
||||
ON v2_entries(company_id, created_at DESC) WHERE deleted_at IS NULL;
|
||||
|
||||
-- Аудит (неизменяемый журнал)
|
||||
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 -- CREATE, UPDATE, DELETE
|
||||
CHECK (action IN ('CREATE','UPDATE','DELETE')),
|
||||
old_value TEXT, -- предыдущий CIDR (для UPDATE)
|
||||
new_value TEXT, -- новый CIDR
|
||||
entry_id INTEGER, -- id записи в v2_entries
|
||||
impersonated_by VARCHAR(255), -- кто реально (если имперсонация)
|
||||
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);
|
||||
Reference in New Issue
Block a user