docs: перенос документации из IPWhiteList + CONTEXT.md (резюме для нового чата)
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# Промпт для Claude Opus 4 — ревью схемы БД
|
||||
|
||||
## Контекст (не анализируй)
|
||||
PostgreSQL. Микросервис IP WhiteList. Многоарендность: у каждой компании (companies) свои записи (whitelist_entries). Лимит по умолчанию 15 активных записей на компанию, custom_limit переопределяет. Soft delete. Аудит всех изменений (audit_log). Сервис на Node.js + pg pool.
|
||||
|
||||
## Что нужно
|
||||
Ниже `schema.sql`. Найди:
|
||||
- Отсутствующие индексы (полный скан таблиц под нагрузкой)
|
||||
- Отсутствующие уникальные constraint'ы (дубликаты на уровне БД, не только в коде)
|
||||
- Проблемы с внешними ключами (каскадное удаление?)
|
||||
- Неоптимальные типы данных
|
||||
- Уязвимости в структуре (можно ли обойти изоляцию через БД?)
|
||||
- Что добавить для production
|
||||
|
||||
Ограничения:
|
||||
- Только конкретные DDL-строки
|
||||
- ВЕСЬ ОТВЕТ ОДНИМ БЛОКОМ — без свёрток, без интерактивных элементов
|
||||
|
||||
```sql
|
||||
-- IP WhiteList schema
|
||||
|
||||
CREATE TABLE IF NOT EXISTS companies (
|
||||
id SERIAL PRIMARY KEY,
|
||||
client_id VARCHAR(64) UNIQUE NOT NULL,
|
||||
name VARCHAR(255),
|
||||
custom_limit INTEGER DEFAULT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS whitelist_entries (
|
||||
id SERIAL PRIMARY KEY,
|
||||
company_id INTEGER NOT NULL REFERENCES companies(id),
|
||||
value_cidr VARCHAR(18) NOT NULL,
|
||||
comment VARCHAR(255),
|
||||
created_by VARCHAR(255) NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_by VARCHAR(255),
|
||||
updated_at TIMESTAMPTZ,
|
||||
deleted_by VARCHAR(255),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_entries_active
|
||||
ON whitelist_entries(company_id, value_cidr) WHERE deleted_at IS NULL;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS audit_log (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_email VARCHAR(255) NOT NULL,
|
||||
company_id INTEGER NOT NULL,
|
||||
action VARCHAR(32) NOT NULL,
|
||||
old_value TEXT,
|
||||
new_value TEXT,
|
||||
entry_id INTEGER,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_company ON audit_log(company_id);
|
||||
```
|
||||
Reference in New Issue
Block a user