-- 047_security_events.sql
-- Журнал событий безопасности и входа (Tier 1 + Tier 2 плана логирования).
--
-- Отдельная таблица, НЕ admin_audit_log, потому что:
--   • автор часто аноним (у неудачного логина ещё нет user_id);
--   • объём может быть большим (боты долбят логин / rate-limit);
--   • свой ретеншн (чистится агрессивнее, чем осознанные админ-действия).
-- admin_audit_log остаётся домом для привилегированных действий (Tier 3).
--
-- category:
--   auth          — login.success | login.fail | register | password.change
--   access_denied — forbidden (роль) | perm_denied (разрешение)
--   rate_limit    — rate_limited (превышение лимита запросов)

CREATE TABLE IF NOT EXISTS security_events (
  id         INTEGER PRIMARY KEY AUTOINCREMENT,
  category   TEXT    NOT NULL CHECK (category IN ('auth','access_denied','rate_limit')),
  event      TEXT    NOT NULL,
  user_id    INTEGER REFERENCES users(id) ON DELETE SET NULL,
  email      TEXT,                       -- email из попытки/связанный (для анонимных)
  ip         TEXT,
  user_agent TEXT,
  method     TEXT,
  route      TEXT,
  detail     TEXT,
  created_at TEXT    NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_sec_events_date     ON security_events (created_at DESC);
CREATE INDEX IF NOT EXISTS idx_sec_events_category ON security_events (category, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_sec_events_email    ON security_events (email);
CREATE INDEX IF NOT EXISTS idx_sec_events_ip       ON security_events (ip);
CREATE INDEX IF NOT EXISTS idx_sec_events_user     ON security_events (user_id);
