-- 083_trade_in_estimates_created_by.sql
-- #656 [P1, security/data-leak] — добавляем владельца оценки для скоупинга GET /history.
--
-- ПРОБЛЕМА: GET /history SELECT'ил последние оценки ВСЕХ пользователей (без фильтра)
--   → cross-pilot data leak (один пилот видел адреса/клиентов другого). trade_in_estimates
--   не имела колонки владельца. Caddy basic_auth прокидывает X-Authenticated-User в каждый
--   аутентифицированный запрос; RBAC middleware уже 401'ит неизвестных юзеров, так что
--   заголовок гарантированно присутствует для реальных вызовов.
--
-- ФИКС: created_by text (username из X-Authenticated-User). Estimator пишет его на INSERT.
--   GET /history скоупит: non-admin → WHERE created_by = :user; admin → все строки
--   (или ?account=<user> фильтр). Legacy-строки остаются created_by=NULL — они без
--   владельца, поэтому non-admin их НЕ видит (корректно: нет owner = не показываем).
--
-- Индекс (created_by, created_at DESC) обслуживает основной паттерн запроса /history
--   (ORDER BY created_at DESC LIMIT N, опционально WHERE created_by = :user).
-- Idempotent: ADD COLUMN IF NOT EXISTS / CREATE INDEX IF NOT EXISTS.
-- Apply after: 082_scrape_schedules_seed_ratio_refresh.sql

BEGIN;

ALTER TABLE trade_in_estimates
    ADD COLUMN IF NOT EXISTS created_by text;

CREATE INDEX IF NOT EXISTS idx_trade_in_estimates_created_by_created_at
    ON trade_in_estimates (created_by, created_at DESC);

COMMENT ON COLUMN trade_in_estimates.created_by IS
    'Username (X-Authenticated-User из Caddy basic_auth), создавший оценку. '
    'Используется для скоупинга GET /history (#656): non-admin видит только свои '
    'строки. NULL для legacy-строк, созданных до миграции 083 — они без владельца '
    'и в non-admin историю не попадают.';

COMMIT;
