7290f9483b
Добавляет 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>
36 lines
2.7 KiB
SQL
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);
|