Files
netrunner-backend/migrations/0004_traffic_limits.sql
T
nineap 7290f9483b Тесты для ключевой бизнес-логики + 3 найденных бага
Добавляет 52 теста (было 7), приоритет: биллинг -> auth -> RBAC-гварды ->
staff/выводы средств -> hack-сессии -> рефералы -> proxy_internal.

Попутно найдены и исправлены реальные баги:
- migrations/0004: ALTER TABLE auth_sessions падал на чистой БД, потому что
  0002 эту таблицу уже дропнул — ломало --migrate на CI/новом инстансе и
  весь sqlx::test. Заменено на CREATE TABLE IF NOT EXISTS.
- request_withdrawal: гонка при параллельных заявках на вывод (не было
  FOR UPDATE) — партнёр мог одновременно вывести баланс кратно больше
  доступного. Новый repository::request_partner_withdrawal блокирует
  строку партнёра и пересчитывает остаток в одной транзакции.
- get_referral_stats: SUM() над BIGINT возвращал NUMERIC, sqlx падал на
  ColumnDecode для любого юзера с рефералами.
- reward_referrer: начислял рефереру 10% при каждой повторной покупке
  того же приведённого юзера вместо разового бонуса — добавлен фильтр
  WHERE status = 'pending'.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 01:18:15 +07:00

36 lines
2.7 KiB
SQL

-- =====================================================================
-- ДИНАМИЧЕСКИЕ ЛИМИТЫ ТРАФИКА ПРОКСИ
-- =====================================================================
-- data_limit_bytes = NULL означает безлимит. Лимит читается прокси-сервером
-- на каждой проверке (POST /api/v1/internal/validate) и на каждом отчёте о
-- расходе (POST /api/v1/internal/usage) — админ меняет его в любой момент
-- через PATCH /api/v1/admin/users/{id}/limit без перезапуска прокси.
ALTER TABLE users ADD COLUMN IF NOT EXISTS data_limit_bytes BIGINT;
ALTER TABLE users ADD COLUMN IF NOT EXISTS data_used_bytes BIGINT NOT NULL DEFAULT 0;
ALTER TABLE users ADD COLUMN IF NOT EXISTS data_period_reset_at TIMESTAMPTZ;
-- Дефолтный лимит тарифа — проставляется юзеру в data_limit_bytes при покупке
-- подписки (см. AppRepository::buy_subscription), чтобы не заводить отдельный
-- админ-флоу на каждую покупку. NULL = тариф без предустановленного лимита.
ALTER TABLE plans ADD COLUMN IF NOT EXISTS default_limit_bytes BIGINT;
-- =====================================================================
-- MAGIC-LINK ВХОД ЧЕРЕЗ TELEGRAM-БОТА ДЛЯ ДЕСКТОП/МОБИЛЬНОГО ПРИЛОЖЕНИЯ
-- =====================================================================
-- auth_sessions была создана в 0001_init.sql, но 0002_refresh_sessions.sql
-- (репурпоз черновика Magic Link под refresh-токены) её DROP'нул и не
-- пересоздал — на любой БД, накатываемой с нуля (CI, sqlx::test, новый
-- инстанс), следующий ALTER TABLE падал на несуществующей таблице. CREATE
-- TABLE IF NOT EXISTS чинит fresh-инсталл; ALTER/CREATE INDEX ниже остаются
-- IF NOT EXISTS на случай окружений, где таблица уже существует в старом виде.
CREATE TABLE IF NOT EXISTS auth_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID,
auth_code VARCHAR(8) NOT NULL UNIQUE,
is_verified BOOLEAN NOT NULL DEFAULT FALSE,
expires_at TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
ALTER TABLE auth_sessions ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ NOT NULL DEFAULT NOW();
CREATE INDEX IF NOT EXISTS idx_auth_sessions_code ON auth_sessions(auth_code);