Files
ipwhitelist-app/research/prompt-opus-schema.md
T

2.6 KiB

Промпт для 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-строки
  • ВЕСЬ ОТВЕТ ОДНИМ БЛОКОМ — без свёрток, без интерактивных элементов
-- 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);