6.5 KiB
6.5 KiB
[0.4.3-beta] - 2026-09-25
Добавлено
- Credit-Based Billing: Полная переработка биллинга — переход от подписок к системе кредитов. Платные кредиты не сгорают и не имеют срока действия, бесплатный дневной лимит (5 запросов/сутки) сбрасывается каждые 24 часа.
- Priority Deduction Logic: Двухуровневое списание с приоритетом — сначала расходуются платные кредиты, затем бесплатный дневной лимит. Атомарные SQL-операции гарантируют корректность при конкурентных запросах.
- Credit Packages: Три пакета кредитов для покупки — Старт (1 000 за 99 ₽), Оптимальный (3 000 за 199 ₽, −33%), Профи (8 000 за 399 ₽, −50%).
- Billing API v2: Новые эндпоинты
GET /api/billing/credits(баланс),GET /api/billing/packages(каталог пакетов),POST /api/billing/purchase(покупка). - Test Endpoints: Отладочные эндпоинты
POST /api/billing/test/add-credits(+100 кредитов) иPOST /api/billing/test/reset-daily(сброс дневного лимита) для упрощения разработки. - Skeleton Loaders: Плавные скелетон-загрузчики в
QuotaBadgeиUserDropdownпри ожидании данных биллинга. - i18n Expansion: Новые ключи переводов (RU/EN) для кредитной системы: баланс кредитов, дневной лимит, пакеты, покупка, цена за запрос, процент выгоды.
Изменено
- Database Schema: Удалены таблицы
subscriptionsиuser_current_usage. Добавлена таблицаuser_credits(credits, daily_used, daily_reset_at) с CHECK-ограничениями и каскадным удалением. - Domain Layer: Полная замена
Subscription/PlanLimits/UsageStatsнаUserCredits/CreditPackage/PackagesConfigс хелпер-методами (CanUseCredit,ShouldResetDaily,DeductCredit). - QuotaService: Переписан с нуля — убрана логика подписок и автопродления, добавлен автоматический сброс дневного лимита при проверке квоты (lazy reset через
time.Since). - Frontend Billing Store:
BillingStoreтеперь хранитCreditsResponseвместоSubscriptionResponse, оптимистичное обновление корректно обрабатывает приоритет (кредиты → дневной лимит). - QuotaBadge Component: Адаптивное отображение —
⚡ 1 234при наличии кредитов,📅 2/5при использовании дневного лимита. Мини-прогресс-бар показывается только при отсутствии кредитов. - UserDropdown: Новый блок квоты с прогресс-баром дневного использования, таймером сброса и кнопкой «Купить кредиты» с градиентным стилем.
- Pricing Page: Полная переработка — карточки пакетов вместо тарифных планов, отображение цены за запрос (в копейках), бейджи выгоды.
- Error Handling: Обновлён HTTP 402 ответ
quota_exceeded— сообщение теперь учитывает обе причины (нет кредитов + дневной лимит исчерпан). - Cache Strategy: Кэш баланса кредитов (TTL 5 мин) вместо кэша подписок (TTL 10 мин) — более агрессивная инвалидация для часто меняющихся данных.
- Removed: Удалены устаревшие
SubscriptionRepository,UsageRepository, feature flags инфраструктура, все эндпоинты тестового апгрейда планов.
[0.3.2-beta] - 2026-09-22
Добавлено
- Billing & Subscriptions: Модуль управления тарифными планами (
Free,Basic,Pro) с ежемесячными квотами и атомарным трекингом использования (usage tracking). - Auth & Security: Полноценный цикл аутентификации на
HttpOnlycookies, сброс пароля по OTP на email и защита от брутфорса. - Rate Limiting: Многоуровневое ограничение запросов (суточное для анонимных пользователей, месячное по тарифам для авторизованных).
- History & Logs: Пагинируемая история конвертаций в API и интерфейсе с разделением хранения логов и лимитов.
- UX & Frontend Integration: Уведомления об исчерпании лимитов, модальные окна регистрации и повторное использование сохраненных URL.
Изменено
- API v2: Переход бэкенда на новую версию архитектуры (Clean Architecture).
- Database Architecture: Миграция хранилища на PostgreSQL (управление миграциями через Goose) и Redis для кэширования и лимитов.
- CI/CD Pipeline: Автоматизация сборки Docker-образов и деплоя через приватный registry Gitea.
[0.2.1-alpha] - 2026-06-15
Добавлено
- Базовый API конвертации HTML в чистый Markdown для LLM.
- Поддержка первичного веб-интерфейса на SvelteKit.
- Базовая обработка ошибок и первичная валидация входных URL.
[0.1.0-alpha] - 2026-03-01
Добавлено
- Инициализация проекта MarkClean, MVP мотора конвертации текста.