♻ update
This commit is contained in:
+59
-39
@@ -1,6 +1,51 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [0.6.11-beta] - 2026-10-12
|
# Changelog
|
||||||
|
|
||||||
|
## [0.15.1-rc] - 2026-10-17
|
||||||
|
### Добавлено
|
||||||
|
**История платежей (Backend)**
|
||||||
|
`GET /api/billing/payments` — новый эндпоинт для получения списка заказов пользователя с пагинацией (`limit`, `offset`). Возвращает метаданные: `total`, `has_more`. Реализовано через `PaymentService.ListOrders` и `postgresPaymentRepo.ListByUserID`.
|
||||||
|
|
||||||
|
**Интерфейс оплаты (Frontend)**
|
||||||
|
Страница `/billing/history` — визуализация истории покупок. Карточки заказов отображают статус, продукт, сумму и дату. Клик по карточке ведет на детальную страницу заказа.
|
||||||
|
Функция `listPayments()` в `lib/billing.ts` для работы с новым API.
|
||||||
|
|
||||||
|
**Детальная страница заказа (Frontend)**
|
||||||
|
Маршрут `/billing/payments/:id` (или модальное окно/страница статуса) позволяет пользователю проверить актуальный статус конкретного платежа после возвращения с ЮKassa или при повторном посещении истории.
|
||||||
|
|
||||||
|
### Изменено
|
||||||
|
**UX процесса покупки**
|
||||||
|
Кнопка «Купить» теперь инициирует создание платежа через бэкенд и открывает `confirmation_url` в новой вкладке, вместо прямой выдачи кредитов (которая была доступна только в dev-mode).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.14.5-beta] - 2026-10-16
|
||||||
|
### Добавлено
|
||||||
|
**Интеграция с YooKassa (СБП/Карта)**
|
||||||
|
Новый модуль `internal/billing/payment`:
|
||||||
|
- `YooKassaGateway`: реализация интерфейса шлюза на чистом `net/http`. Поддержка создания платежей СБП (`payment_method_data.type=sbp`) и банковских карт (`bank_card`) через конфигурацию.
|
||||||
|
- Автоматическая генерация `Idempotence-Key` на бэкенде (UUID) для защиты от дублирования заказов при повторных запросах клиента.
|
||||||
|
- Проверка подлинности вебхуков: обязательный запрос состояния платежа через API ЮKassa перед начислением товаров (защита от фейковых уведомлений).
|
||||||
|
|
||||||
|
**Миграция базы данных**
|
||||||
|
Таблица `payment_orders`: хранение локальных заказов, сумм, статусов (`pending`, `paid`, `canceled`, `failed`), связей с провайдером (`provider_payment_id`) и ключей идемпотентности. Индексы для быстрого поиска по пользователю и ID платежа.
|
||||||
|
|
||||||
|
**Безопасность биллинга**
|
||||||
|
- Отключение бесплатного эндпоинта `POST /api/billing/purchase` в режиме `release`. Теперь кредиты выдаются только после подтверждения оплаты через ЮKassa.
|
||||||
|
- IP-фильтрация вебхуков (`YOOOKASSA_WEBHOOK_ALLOWED_CIDRS`): блокировка входящих уведомлений от неизвестных источников.
|
||||||
|
|
||||||
|
### Исправлено
|
||||||
|
**Обработка смены магазина/способа оплаты**
|
||||||
|
Логика `intentFromExisting` обновлена: если заказ существует, но платёж у провайдера не найден (404) или был создан с другими параметрами (ошибка идемпотентности), система автоматически сбрасывает привязку к старому платежу и создаёт новый. Это устраняет ошибки "Payment method is not available" и конфликты ключей при переходе с тестового на боевой магазин или с карты на СБП.
|
||||||
|
|
||||||
|
### Изменено
|
||||||
|
**Архитектура зависимостей**
|
||||||
|
Введение слоя `PaymentService`, который оркеструет взаимодействие между `QuotaService` (бизнес-логика квот) и `YooKassaGateway` (внешний мир). Бизнес-логика начисления кредитов и активации подписок осталась изолированной в существующих сервисах, что позволило переиспользовать её без дублирования кода.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.13.6] - 2026-10-12
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **Cleanup job** — автоматическая очистка записей `conversion_logs` старше 90 дней через `CleanupOldLogs()`.
|
- **Cleanup job** — автоматическая очистка записей `conversion_logs` старше 90 дней через `CleanupOldLogs()`.
|
||||||
@@ -23,7 +68,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.6.10-beta] - 2026-10-10
|
## [0.12.3-rs] - 2026-10-10
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **🎨 Редизайн главной страницы** — шесть новых информационных блоков на landing page для улучшения onboarding и конверсии.
|
- **🎨 Редизайн главной страницы** — шесть новых информационных блоков на landing page для улучшения onboarding и конверсии.
|
||||||
@@ -52,7 +97,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.6.9-beta] - 2026-10-05
|
## [0.11.4-beta] - 2026-10-05
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **Три типа монетизации** — единый ответ `GET /api/billing/packages` теперь возвращает `{ free, credits, subscriptions }` вместо плоского списка пакетов.
|
- **Три типа монетизации** — единый ответ `GET /api/billing/packages` теперь возвращает `{ free, credits, subscriptions }` вместо плоского списка пакетов.
|
||||||
@@ -75,7 +120,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.6.8-beta] - 2026-10-04
|
## [0.10.4] - 2026-10-04
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **💳 Подписки (Subscriptions)** — новая модель безлимитного доступа к конвертеру.
|
- **💳 Подписки (Subscriptions)** — новая модель безлимитного доступа к конвертеру.
|
||||||
@@ -100,7 +145,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.5.8-beta] - 2026-10-03
|
## [0.9.2-rc.1] - 2026-10-03
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **📑 Оглавление (Table of Contents)** — новая опция `include_toc` в API-запросе для генерации оглавления на основе заголовков H1–H3.
|
- **📑 Оглавление (Table of Contents)** — новая опция `include_toc` в API-запросе для генерации оглавления на основе заголовков H1–H3.
|
||||||
@@ -115,7 +160,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.5.7-beta] - 2026-10-03
|
## [0.8.3-rc] - 2026-10-03
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **🔍 Автоматическое определение языка контента** — триграммный анализ через `whatlanggo` с предочисткой текста от Markdown-разметки, кода и URL-адресов.
|
- **🔍 Автоматическое определение языка контента** — триграммный анализ через `whatlanggo` с предочисткой текста от Markdown-разметки, кода и URL-адресов.
|
||||||
@@ -133,7 +178,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.5.6-beta] - 2026-09-27
|
## [0.7.3-beta.3] - 2026-09-27
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
@@ -202,31 +247,6 @@
|
|||||||
- **Responsive Design**: Адаптивная верстка для мобильных устройств
|
- **Responsive Design**: Адаптивная верстка для мобильных устройств
|
||||||
- **Accessibility**: ARIA-атрибуты, фокус-менеджмент, keyboard navigation
|
- **Accessibility**: ARIA-атрибуты, фокус-менеджмент, keyboard navigation
|
||||||
|
|
||||||
### Миграция БД
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE TABLE api_keys (
|
|
||||||
id UUID PRIMARY KEY,
|
|
||||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
||||||
name VARCHAR(50) NOT NULL DEFAULT 'Default Key',
|
|
||||||
key_prefix VARCHAR(50) NOT NULL,
|
|
||||||
key_hash TEXT NOT NULL,
|
|
||||||
last_used_at TIMESTAMPTZ,
|
|
||||||
expires_at TIMESTAMPTZ,
|
|
||||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX idx_api_keys_user_unique
|
|
||||||
ON api_keys(user_id)
|
|
||||||
WHERE is_active = TRUE;
|
|
||||||
|
|
||||||
CREATE INDEX idx_api_keys_hash
|
|
||||||
ON api_keys(key_hash)
|
|
||||||
WHERE is_active = TRUE;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Тестирование
|
### Тестирование
|
||||||
|
|
||||||
- **Postman Collection**: Готовая коллекция для тестирования всех сценариев
|
- **Postman Collection**: Готовая коллекция для тестирования всех сценариев
|
||||||
@@ -235,7 +255,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.4.6-beta] - 2026-09-26
|
## [0.6.3-beta.2] - 2026-09-26
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
@@ -260,7 +280,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.4.5-beta] - 2026-09-25
|
## [0.5.4-beta.1] - 2026-09-25
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
@@ -329,7 +349,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.4.4-beta] - 2026-09-24
|
## [0.4.6-beta] - 2026-09-24
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
@@ -362,7 +382,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.4.3-beta] - 2026-09-23
|
## [0.3.10] - 2026-09-23
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
@@ -389,7 +409,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.3.2-beta] - 2026-09-22
|
## [0.2.3-beta] - 2026-09-22
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- **Billing & Subscriptions**: Модуль управления тарифными планами (`Free`, `Basic`, `Pro`) с ежемесячными квотами и атомарным трекингом использования (`usage tracking`).
|
- **Billing & Subscriptions**: Модуль управления тарифными планами (`Free`, `Basic`, `Pro`) с ежемесячными квотами и атомарным трекингом использования (`usage tracking`).
|
||||||
@@ -405,7 +425,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.2.1-alpha] - 2026-06-15
|
## [0.1.3-alpha] - 2026-06-15
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- Базовый API конвертации HTML в чистый Markdown для LLM.
|
- Базовый API конвертации HTML в чистый Markdown для LLM.
|
||||||
@@ -414,7 +434,7 @@ CREATE INDEX idx_api_keys_hash
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [0.1.0-alpha] - 2026-03-01
|
## [0.1.0-alpha] - 2026-05-01
|
||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
- Инициализация проекта MarkClean, MVP мотора конвертации текста.
|
- Инициализация проекта MarkClean, MVP мотора конвертации текста.
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user