## v0.0.78 — 2025-01-30

### Fixed
- Ошибка `Call to a member function toISOString() on string` в `TelegramApiController::getConnectionStatus()`
- Добавлен каст `telegram_connected_at` => `datetime` в модель User

## v0.0.77 — 2025-01-30

### Added
- Команда `tags:merge-ai` для объединения всех AI-тегов в канонический `#AI`
- Автоматическое обнаружение AI-тегов по паттернам (искусственный интеллект, ИИ, AI, artificial intelligence)
- Обновление связей в pivot таблице при объединении тегов
- Unit тесты для `MergeAiTagsCommand`
- Обновленная документация с описанием новой команды

### Changed
- Улучшена документация `TAGS_NORMALIZATION.md` с примерами AI-анализа
- Обновлен `README.md` с описанием всех доступных команд

## v0.0.76 — 2025-01-30

### Added
- AI-система анализа тегов с автоматическим поиском алиасов
- `TagAnalysisService` для интеллектуального анализа тегов
- Семантическая группировка тегов по смыслу
- Автоматическое предложение канонических названий
- Интеграция AI-анализа в `NormalizeTagsCommand`

### Changed
- `TagService::resolveNameForUser` теперь использует AI для поиска канонических тегов
- `AiService` расширен методами для анализа тегов
- `NormalizeTagsCommand` интегрирован с AI-системой

## v0.0.75 — 2025-01-30

### Added
- Команда `tags:normalize` для нормализации всех тегов пользователей
- AI-анализ существующих тегов для предложения объединений
- Автоматическое обнаружение алиасов и похожих тегов
- Интерактивные предложения по объединению тегов
- Unit тесты для команды нормализации

### Changed
- `TagService` теперь поддерживает AI-анализ тегов
- Улучшена логика объединения дубликатов

## v0.0.74 — 2025-01-30

### Fixed
- Ошибка `Call to undefined method App\Models\User::tags()` в `ProcessAiJob` и `ProcessVideoAiJob`
- Добавлено отношение `tags()` в модель `User`

### Added
- Unit тесты для модели `User` с проверкой отношений

## v0.0.73 — 2025-01-30

### Added
- Artisan команда `telegram:generate-token` для генерации токенов привязки к Telegram
- Поддержка генерации токенов для конкретных пользователей
- Автоматическое отключение существующих подключений при повторной генерации
- Unit тесты для команды генерации токенов

### Changed
- Улучшена документация по настройке Telegram бота

## v0.0.72 — 2025-01-30

### Added
- Документация по настройке Google Safe Browsing API
- Скрипт проверки конфигурации Google Safe Browsing
- Инструкции по получению API ключа и настройке

### Fixed
- Предупреждение о ненастроенном Google Safe Browsing API ключе

## v0.0.71 — 2025-01-30

### Added
- Интеграция с Google Safe Browsing API для проверки безопасности ссылок
- Автоматическая проверка URL на вредоносность
- Логирование результатов проверки безопасности

### Changed
- `LinkValidationService` теперь использует Google Safe Browsing для дополнительной проверки

## v0.0.70 — 2025-01-30

### Added
- Система уровней пользователей с разными лимитами
- Автоматическое ограничение количества ссылок и токенов
- Биллинг система с учетом использования ресурсов

### Changed
- Пользователи теперь имеют уровни: Free, Basic, Pro, Enterprise
- Каждый уровень имеет свои лимиты на токены и ссылки

## v0.0.69 — 2025-01-30

### Added
- Интеграция с YouTube Data API для автоматического получения метаданных видео
- Автоматическое извлечение названия, описания и тегов из YouTube
- Синхронизация тегов между YouTube и системой

### Changed
- `ProcessVideoAiJob` теперь использует YouTube API для обогащения данных

## v0.0.68 — 2025-01-30

### Added
- Telegram бот для сохранения ссылок через мессенджер
- Команды `/start`, `/auth`, `/status`, `/help`, `/balance`, `/stats`
- Webhook обработка сообщений от Telegram
- Автоматическая привязка аккаунтов через токены

### Changed
- Добавлены поля `telegram_id`, `telegram_auth_token`, `telegram_connected_at` в модель User
- Создан `TelegramService` для обработки команд бота

## v0.0.67 — 2025-01-30

### Added
- AI-сервис для автоматической генерации тегов и summary
- Интеграция с OpenRouter API для доступа к различным AI моделям
- Автоматическое определение типа контента (статья/видео)

### Changed
- `ProcessAiJob` теперь использует AI для анализа контента
- Добавлена поддержка различных AI моделей через конфигурацию

## v0.0.66 — 2025-01-30

### Added
- Система тегов для организации ссылок
- Автоматическая генерация тегов на основе контента
- Поиск и фильтрация по тегам
- Связи many-to-many между ссылками и тегами

### Changed
- Модель `Link` теперь поддерживает множественные теги
- Добавлена pivot таблица `link_tag` для связей

## v0.0.65 — 2025-01-30

### Added
- Базовая система управления ссылками
- Конвертация HTML в Markdown
- Очистка HTML от потенциально опасного контента
- Логирование всех этапов обработки ссылок

### Changed
- Создана базовая архитектура для обработки ссылок
- Добавлены модели `Link`, `Log`, `LinkLog`, `AuditLog`

## v0.0.64 — 2025-01-30

### Added
- Система аутентификации через Laravel Sanctum
- Google OAuth2 интеграция
- API endpoints для входа и выхода
- Базовая структура пользователей

### Changed
- Создана базовая архитектура API
- Добавлена модель `User` с поддержкой OAuth2

## v0.0.63 — 2025-01-30

### Added
- Инициализация Laravel проекта
- Базовая структура API
- Конфигурация базы данных
- Система миграций

### Changed
- Проект создан на базе Laravel 12.0+
- Настроена база данных SQLite для разработки

## v0.0.62 — 2025-01-27

### Added
- Поиск по полям (title, summary, url) в API для получения списка ссылок
- Параметр `q` для поискового запроса в endpoint `/api/links`
- Комбинированный поиск с фильтрацией по тегам
- Поддержка множественной фильтрации по тегам через запятую
- Comprehensive тесты для всех сценариев поиска и фильтрации

### Changed
- Обновлен LinkFilterService для поддержки поиска по полям
- Обновлена OpenAPI документация с параметром поиска
- Добавлена фабрика TagFactory для тестирования

### Technical
- Поиск реализован с помощью SQL LIKE с wildcards
- Логика комбинирования: AND между поиском и фильтрацией по тегам
- Все тесты проходят успешно
- Создана документация FRONTEND_SEARCH_IMPLEMENTATION.md для фронтенд команды

## v0.0.61 — 2025-01-27

### Added
- Обновлены OpenAPI спецификации с информацией о Telegram боте
- Добавлен новый тег Telegram в openapi-spa.yaml с описанием webhook эндпоинта
- Добавлены схемы для Telegram webhook запросов и ответов
- Добавлены поля telegram_id и telegram_connected_at в схемы UserResponse
- Добавлен новый тег AdminTelegram в openapi-admin.yaml для мониторинга
- Добавлены эндпоинты /admin/telegram/stats и /admin/telegram/users для административной панели
- Добавлены схемы TelegramStatsResponse и TelegramUserResponse для админки
- Документированы все доступные команды Telegram бота (/start, /auth, /status, /help, /balance, /stats)

### Changed
- Обновлены описания API с упоминанием интеграции с Telegram ботом
- Расширена документация административной панели с возможностями мониторинга Telegram

## v0.0.60 — 2025-01-27

### Changed
- Миграция с SQLite на MySQL базу данных
- Обновлена конфигурация базы данных для работы с MySQL контейнером
- Перенесены все данные из SQLite в MySQL (пользователи, ссылки, теги, логи)
- Создана резервная копия SQLite базы данных

### Technical
- Обновлен .env файл для подключения к MySQL (host: localhost, port: 3306)
- Настроена кодировка utf8mb4 для корректной работы с Unicode
- Все миграции выполнены успешно на новой базе данных
- Проверена корректность работы всех моделей и API

## v0.0.59 — 2025-01-27

### Fixed
- Исправлена обработка ошибок в методе retry для ссылок
- При превышении лимита попыток (3) возвращается статус 400 вместо 500
- Добавлена проверка доступа пользователя к ссылке в методе retry
- Улучшена безопасность и обработка ошибок в LinksController

## v0.0.58 — 2025-01-27

### Added
- Интеграция YouTube Data API v3 для получения метаданных видео
- Новый сервис YouTubeApiService для работы с YouTube API
- Поле meta (JSON) в таблице links для хранения дополнительных метаданных
- Подготовка контекста для AI из YouTube данных (заголовок, описание, статистика, теги)
- Кэширование YouTube API запросов на 1 час для оптимизации
- Три новые Artisan команды для управления пользователями:
  - `users:balance {user_id?}` - показать баланс токенов пользователей
  - `users:reset-balance {user_id} {--balance=0}` - сбросить баланс токенов пользователя
  - `users:change-level {user_id} {level}` - изменить уровень пользователя
- Автоматическая синхронизация тегов из YouTube API в систему тегов приложения

### Changed
- ProcessVideoJob теперь использует YouTube API для получения метаданных видео
- ProcessVideoAiJob использует обогащенный контекст из YouTube данных
- Увеличены лимиты токенов для всех уровней пользователей в 1000 раз
- Документация перемещена в папку docs для лучшей организации

### Fixed
- Исправлена логика проверки токенов в UserLevelService::canUserUseTokens
- Исправлен метод AiService::debitTokens для корректного учета дневных лимитов
- Пользователи с нулевым балансом теперь могут использовать дневные лимиты

### Technical
- Добавлена конфигурация YouTube API в config/services.php
- Созданы тесты для YouTubeApiService и обновлены тесты обработки видео
- Миграция для добавления поля meta в таблицу links
- Обновлена модель Link для работы с полем meta
- Полное покрытие тестами для всех новых команд

## v0.0.57 — 2025-01-27

### Added
- Python микросервис для получения транскриптов YouTube видео
- FastAPI приложение с поддержкой youtube_transcript_api
- Docker контейнеризация микросервиса
- Laravel сервис YouTubeTranscriptService для интеграции с микросервисом
- Поддержка получения транскриптов в форматах text и JSON
- Кэширование транскриптов на 1 час
- Получение списка доступных языков для видео
- Извлечение video ID из различных форматов YouTube URL

### Technical
- Создан youtube-transcript-service/ с Python микросервисом
- Добавлена конфигурация youtube_transcript в config/services.php
- Создан тестовый скрипт test_microservice.php для проверки работы

## v0.0.56 — 2025-01-27

### Added
- Автоматическая синхронизация тегов из YouTube API в систему тегов приложения
- ProcessVideoJob теперь добавляет теги из YouTube API в поле tags ссылки
- Логирование количества синхронизированных тегов в LinkLog

### Changed
- ProcessVideoJob использует LinkService::syncTags для добавления тегов из YouTube API
- Улучшено логирование в ProcessVideoJob с информацией о количестве тегов

## v0.0.55 — 2025-01-27

### Added
- Три новые Artisan команды для управления пользователями:
  - `users:balance {user_id?}` - показать баланс токенов пользователей (всех или конкретного)
  - `users:reset-balance {user_id} {--balance=0}` - сбросить баланс токенов пользователя
  - `users:change-level {user_id} {level}` - изменить уровень пользователя
- Полное покрытие тестами для всех новых команд
- Информативный вывод с детальной информацией о балансе, лимитах и использовании токенов

## v0.0.54 — 2025-01-27

### Added
- Интеграция YouTube Data API v3 для получения метаданных видео
- Новый сервис YouTubeApiService для работы с YouTube API
- Поле meta (JSON) в таблице links для хранения дополнительных метаданных
- Подготовка контекста для AI из YouTube данных (заголовок, описание, статистика, теги)
- Кэширование YouTube API запросов на 1 час для оптимизации

### Changed
- ProcessVideoJob теперь использует YouTube API для получения метаданных видео
- ProcessVideoAiJob использует обогащенный контекст из YouTube данных
- Увеличены лимиты токенов для всех уровней пользователей в 1000 раз:
  - Free: 100 → 100,000
  - Basic: 500 → 500,000
  - Pro: 2,000 → 2,000,000
  - Enterprise: 10,000 → 10,000,000

### Fixed
- Исправлена логика проверки токенов в UserLevelService::canUserUseTokens
- Исправлен метод AiService::debitTokens для корректного учета дневных лимитов
- Пользователи с нулевым балансом теперь могут использовать дневные лимиты
- BillingLog записи создаются для всех операций, независимо от баланса пользователя

### Technical
- Добавлена конфигурация YouTube API в config/services.php
- Созданы тесты для YouTubeApiService и обновлены тесты обработки видео
- Миграция для добавления поля meta в таблицу links
- Обновлена модель Link для работы с полем meta

## v0.0.53 — 2025-01-27

### Fixed
- Исправлены несоответствия между OpenAPI спецификацией и реальной логикой контроллеров
- Исправлен ответ эндпоинта /links/{id}/retry (теперь возвращает {'status': 'ok'})
- Перенесен эндпоинт /billing/topup из SPA в админскую группу маршрутов
- Обновлена структура ответа /billing/history для соответствия реальной логике

## v0.0.52 — 2025-01-27

### Changed
- Разделена OpenAPI спецификация на два файла по логике приложений
- Создан openapi-spa.yaml для основного SPA приложения (пользователи, ссылки, теги)
- Создан openapi-admin.yaml для административной панели (биллинг, управление, аудит)
- Улучшена читаемость и структура документации API

## v0.0.51 — 2025-01-27

### Changed
- Оптимизирована OpenAPI спецификация: вынесены повторяющиеся ответы в переиспользуемые схемы
- Созданы схемы ErrorResponse, SuccessResponse, TokenResponse, BalanceResponse, LevelUpdateResponse
- Упрощена структура документации, улучшена читаемость

## v0.0.50 — 2025-07-24

Added
- Поддержка параметра per_page для управления количеством элементов на странице в API ссылок
- Поддержка параметров сортировки sort_by и sort_order в API ссылок
- Добавлена валидация параметров сортировки с ограничением доступных полей
- Ограничение per_page от 1 до 100 элементов на страницу
- Поддержка сортировки по полям: created_at, updated_at, title, status, type
- Для админского API добавлено поле user_id в доступные для сортировки поля

Changed
- Изменено значение по умолчанию per_page с 20 на 10 элементов на страницу
- Исправлена структура пагинации согласно стандартам Laravel 12
- Удален кастомный LinkCollection в пользу стандартного подхода с LinkResource::collection()
- Обновлена OpenAPI документация с новыми параметрами для эндпоинтов /links и /admin/links
- Добавлены примеры использования параметров per_page, sort_by, sort_order
- Обновлены сервисы LinkFilterService и AdminLinkFilterService для поддержки новых параметров

Added
- Созданы тесты для проверки функциональности per_page и сортировки
- Тесты покрывают валидацию параметров и корректность работы сортировки
- Добавлен тест для проверки нового значения по умолчанию per_page=10
- Добавлен тест для проверки правильной структуры ответа с meta полем

## v0.0.49 — 2025-07-24

Added
- Расширено логирование в AuditLog для отслеживания безопасности и лимитов
- Добавлено логирование создания ссылок (create_link)
- Добавлено логирование попыток доступа к чужим ресурсам (unauthorized_access)
- Добавлено логирование попыток создания ссылок при превышении лимитов (create_link_limit_exceeded)
- Добавлено логирование ошибок создания ссылок (create_link_error)
- Добавлено логирование попыток использования токенов при превышении лимитов (token_limit_exceeded)
- Добавлены проверки доступа к ссылкам в методах show, update, destroy, logs

Changed
- Метод getTodayTokensUsage в UserLevelService сделан публичным для использования в логировании
- Добавлены проверки лимитов токенов в AiService для всех методов генерации (summary, video_summary, tags)

Added
- Создан тест AuditLogTest для проверки расширенного логирования
- Тесты покрывают логирование попыток несанкционированного доступа и успешных операций

Changed
- Рефакторинг контроллеров: вся бизнес-логика перенесена в сервисы
- Создан AuditService для централизованного управления аудитом
- Создан StatsService для работы со статистикой пользователей
- Создан LinkFilterService для фильтрации ссылок пользователей
- Создан ClientDetectionService для определения типа клиента в OAuth
- Создан TagService для работы с тегами
- Создан AdminLinkFilterService для административной фильтрации ссылок
- LinksController: убрана бизнес-логика аудита, фильтрации и статистики
- AuthController: убрана логика определения клиента и редиректов
- TagsController: убрана логика работы с тегами
- AdminLinksController: убрана логика административной фильтрации
- Обновлена OpenAPI документация: добавлены коды ответов 403 для эндпоинтов ссылок
- Добавлен эндпоинт /links/{id}/logs в OpenAPI документацию

## v0.0.48 — 2025-07-24

Added
- Полностью обновлена OpenAPI документация с новыми эндпоинтами системы уровней пользователей
- Добавлены эндпоинты: /user-levels, /user-level, /billing/balance, /billing/history
- Добавлены административные эндпоинты: /admin/users/{id}/upgrade, /admin/users/{id}/downgrade
- Созданы новые схемы: UserLevelInfo, UserLimits, UserModelInfo, ModelPricing, UserBalance
- Обновлена схема User с полями user_level и user_level_display
- Добавлен новый тег UserLevels в OpenAPI

## v0.0.47 — 2025-07-24

Changed
- Убраны нереализованные функции (custom_tags, bulk_operations, api_access, priority_support) из конфигурации
- Оставлены только реализованные функции: ai_processing, video_processing
- Обновлена документация с указанием на план развития

Added
- Создан план развития проекта `docs/ROADMAP.md` с описанием будущих функций
- Добавлена документация по планируемым возможностям с приоритетами и сроками
- Обновлен README.md с информацией о системе уровней и новых API эндпоинтах

## v0.0.46 — 2025-07-24

Added
- Создан конфигурационный файл `config/user_levels.php` для централизованного управления настройками уровней
- Добавлен сервис `ModelPricingService` для работы с ценами AI-моделей
- Расширен функционал уровней пользователей с поддержкой функций (features)
- Добавлены переменные окружения для гибкой настройки лимитов и параметров
- Создана документация по конфигурации в `docs/CONFIGURATION.md`

Changed
- Enum `UserLevel` теперь использует конфигурацию вместо хардкода
- `AiService` использует настройки уровня пользователя для длины саммари и количества пунктов
- `UserLevelService` расширен информацией о функциях и параметрах уровня
- `UserLevelController` возвращает расширенную информацию включая цены моделей
- Модель `User` получила методы для работы с функциями уровня

Technical
- Все настройки уровней вынесены в конфигурационный файл
- Добавлена поддержка feature flags для разных уровней
- Улучшена оценка токенов с настраиваемыми параметрами
- Интеграция с системой билинга для отслеживания стоимости

## v0.0.45 — 2025-07-24

Changed
- Убрано заполнение поля summary из описания для видео в ParseService
- Теперь summary для видео создается только через AI-обработку
- Обновлены тесты для проверки нового поведения (summary = null для видео)

## v0.0.44 — 2025-07-24

Added
- AI-обработка видео с генерацией краткого пересказа
- Новый джоб ProcessVideoAiJob для обработки видео через AI
- Настройка OPENROUTER_VIDEO_SUMMARY_MAX_POINTS для управления количеством пунктов (по умолчанию 5)
- Настройка OPENROUTER_VIDEO_SUMMARY_PROMPT для промпта пересказа видео
- Метод generateVideoSummary в AiService для генерации пересказа видео

Changed
- Видео теперь обрабатываются через AI вместо простого извлечения мета-данных
- Обновлена цепочка обработки видео: ParseLinkJob → ProcessVideoAiJob
- Обновлены тесты для новой логики обработки видео

## v0.0.43 — 2025-07-24

Fixed
- Убрано многоточие в конце описания видео из YouTube
- Обновлен приоритет извлечения описания видео (Twitter description имеет высший приоритет)
- Добавлена попытка извлечения описания из контента страницы

Added
- Новые тесты для ParseService с проверкой удаления многоточия
- Тестирование различных сценариев извлечения описания видео

## v0.0.42 — 2025-07-24

Added
- Добавлена настройка OPENROUTER_SUMMARY_MAX_LENGTH для управления максимальной длиной summary
- Промпт для AI теперь использует настраиваемое ограничение на длину summary

Changed
- Обновлен промпт для AI с ограничением "не более 400 символов" по умолчанию
- AiService теперь подставляет значение из конфигурации в промпт

## v0.0.41 — 2025-07-24

Changed
- Убрана принудительная обрезка summary до 200 символов в AiService
- Обновлен промпт для AI без ограничения на длину summary
- AI теперь может генерировать summary любой длины без добавления многоточия

## v0.0.40 — 2025-07-24

Added
- Новый эндпоинт GET /links/stats для получения статистики ссылок пользователя
- Статистика показывает общее количество ссылок, количество тегов и распределение по статусам
- Оптимизированные SQL-запросы для быстрой работы с большим количеством ссылок
- Полное покрытие тестами нового функционала статистики

## v0.0.39 — 2025-07-24

Added
- Полностью переработан функционал тегов с нормализацией данных
- Создана отдельная модель Tag с релейшенами many-to-many
- Добавлены API эндпоинты для работы с тегами: GET /tags, GET /tags/{id}
- Теги теперь хранятся в отдельной таблице с подсчетом количества ссылок
- Обновлен LinkService для работы с новой структурой тегов
- Исправлен ProcessAiJob для корректной работы с новой структурой тегов

Changed
- Поле tags в таблице links заменено на связь many-to-many через таблицу link_tag
- Обновлена фильтрация по тегам в LinksController для работы с новой структурой
- Обновлена OpenAPI документация с новыми схемами и эндпоинтами для тегов
- LinkResource теперь возвращает теги как массив строк вместо JSON
- Убрана поддержка тегов при создании ссылки - теги генерируются только AI-сервисом
- Обновлена документация API с описанием автоматической генерации тегов

Fixed
- Исправлена проблема с обновлением поля tags в ProcessAiJob
- Устранены ошибки SQL при работе с тегами

## v0.0.38 — 2025-07-24

Fixed
- Исправлен редирект после OAuth авторизации для локальной разработки
- Добавлена логика определения правильного URL редиректа на основе referer
- Теперь при разработке на localhost:3000 редирект происходит на локальный сервер, а не на продакшн

## v0.0.37 — 2025-07-24

Changed
- Убрана вся отладочная информация из кода
- Упрощено логирование ошибок OAuth
- Удалены избыточные комментарии и детальное логирование
- Код стал более чистым и читаемым

## v0.0.36 — 2025-07-24

Fixed
- Исправлена проблема InvalidStateException в Google OAuth через использование stateless режима
- Отключена проверка состояния в Socialite для корректной работы OAuth callback
- Устранена ошибка "Invalid state parameter" при авторизации

Changed
- Google OAuth callback теперь использует stateless режим для обхода проблем с состоянием
- Сохранение состояния в сессии остается для определения SPA приложений
- Улучшена стабильность OAuth авторизации

## v0.0.35 — 2025-07-24

Fixed
- Исправлена проблема с InvalidStateException в Google OAuth
- Добавлено сохранение состояния OAuth в сессии для корректной работы
- Улучшена обработка state параметра между redirect и callback

Changed
- Состояние OAuth теперь сохраняется в сессии для надежности
- Добавлено дополнительное логирование для отладки state параметра
- Очистка состояния из сессии после успешной авторизации

## v0.0.34 — 2025-07-24

Fixed
- Исправлена проблема с Google OAuth callback - теперь система корректно редиректит на SPA
- Улучшена обработка ошибок OAuth с детальным логированием
- Добавлена поддержка различных типов исключений OAuth

Changed
- Улучшена логика определения SPA по параметру state
- Добавлено детальное логирование ошибок OAuth для отладки
- Обновлена документация с примерами использования

## v0.0.33 — 2025-07-24

Fixed
- Исправлена логика редиректа для SPA приложений - теперь по умолчанию происходит редирект на SPA
- Улучшена логика определения SPA по параметру state и response_type
- Добавлен параметр state=spa в Google OAuth для надежного определения SPA

Changed
- Обновлена документация SPA_AUTH_GUIDE.md с новой логикой авторизации
- По умолчанию система редиректит на SPA, для JSON ответа используйте response_type=json
- Упрощена логика определения источника запроса

## v0.0.32 — 2025-07-24

Added
- Улучшена логика определения SPA в AuthController::handleGoogleCallback
- Добавлена поддержка параметра response_type=json для принудительного JSON ответа
- Добавлены методы userExists и createUserWithToken в AuthService
- Расширены тесты авторизации в AuthApiTest

Changed
- Улучшена обработка редиректов для SPA приложений
- Добавлена поддержка 127.0.0.1:3000 в список разрешенных SPA доменов
- Обновлены тесты для соответствия реальному поведению валидации

Fixed
- Исправлена логика определения источника запроса для корректной работы с SPA

## v0.0.31 — 2025-07-22

Added
- Добавлен раздел настройки переменных окружения в SPA_AUTH_GUIDE.md
- Подробные инструкции по настройке FRONTEND_URL для разных окружений
- Примеры конфигурации для разработки, продакшна и ngrok

Changed
- Обновлена документация SPA_AUTH_GUIDE.md с примерами настройки .env

## v0.0.30 — 2025-07-22

Added
- Фильтрация по тегам в API эндпоинтах GET /links и GET /admin/links
- Поддержка фильтрации по статусу и типу контента
- Расширенная фильтрация в админке (по пользователю, датам)
- Обновлена OpenAPI документация с описанием всех параметров фильтрации

Changed
- LinksController::index теперь поддерживает фильтрацию по тегам, статусу, типу
- AdminLinksController::index расширен дополнительными фильтрами
- Добавлены примеры использования фильтров в OpenAPI

## v0.0.29 — 2025-07-22

Added
- Настройки OpenRouter модели и промптов вынесены в переменные окружения
- Поддержка кастомизации модели, max_tokens, temperature через env
- Возможность настройки промптов для саммари и тегов через env
- Обновлена документация с примерами кастомизации промптов

Changed
- AiService теперь использует конфигурацию из config/services.php
- Добавлены значения по умолчанию для всех настроек OpenRouter

## v0.0.28 — 2025-07-22

Changed
- Улучшена обработка ошибок OpenRouter API в AiService
- Добавлена специальная обработка ошибки 402 (недостаточно средств)
- Добавлено детальное логирование ошибок API с указанием операции
- Обновлена документация OPENROUTER_SETUP.md с описанием решения ошибки 402

## v0.0.27 — 2025-07-22

Added
- Интеграция OpenRouter AI для автоматической генерации саммари и тегов
- Новый сервис AiService для работы с OpenRouter API
- Новый Job ProcessAiJob для обработки AI в цепочке очередей
- Конфигурация OpenRouter в config/services.php
- Обновлена цепочка обработки: ParseLinkJob → ConvertToMarkdownJob → ProcessAiJob
- Автоматическая генерация саммари на 200 символов и 5 релевантных тегов

Changed
- Обновлена документация QUEUES.md и ARCHITECTURE.md с описанием нового этапа AI обработки
- Статус converted теперь промежуточный, completed устанавливается после AI обработки
- Retry теперь включает AI обработку для статей

## v0.0.26 — 2025-07-22

Added
- Создана инструкция для джуниор разработчика SPA приложения по процессу авторизации (docs/SPA_AUTH_GUIDE.md)
- Создана инструкция для разработчика Chrome расширения по процессу авторизации (docs/CHROME_EXTENSION_AUTH_GUIDE.md)
- Добавлены ссылки на инструкции в README.md

Changed
- Обновлена инструкция SPA_AUTH_GUIDE.md: добавлен упрощенный подход авторизации без GOOGLE_CLIENT_ID на фронтенде через серверный редирект
- Модифицирован AuthController::handleGoogleCallback для поддержки редиректа в SPA приложения
- Добавлена конфигурация frontend_url в config/app.php для настройки URL фронтенда
- Обновлен openapi.yaml: добавлено описание нового поведения эндпоинта /auth/google/callback с поддержкой редиректа для SPA
- Исправлена ошибка "Session store not set": маршруты Google OAuth возвращены в web.php (требуют сессии)
- Обновлена конфигурация Google OAuth в config/services.php с правильным callback URL (без /api)
- Добавлены инструкции по настройке Google Cloud Console и отладке в SPA_AUTH_GUIDE.md
- Обновлены все конфигурации и документация с правильным доменом ngrok (holy-needed-lizard.ngrok-free.app)
- Добавлено подробное описание решения ошибки redirect_uri_mismatch в Google OAuth
- Исправлен формат ответа API эндпоинта /links: теперь возвращает объект с полем data вместо массива

## v0.0.25 — 2025-07-22

Changed
- remove welcome blade

## v0.0.25 — 2025-07-22

Changed
- prepare for github


# CHANGELOG

## v0.0.24 — 2025-07-15

Changed
- Результат проверки Safe Browsing теперь всегда логируется в LinkLog (успех/угроза)

## v0.0.23 — 2025-07-15

Changed
- Тип ссылки теперь определяется автоматически: video для youtube/vimeo, иначе link (заглушка для видео)

## v0.0.22 — 2025-07-15

Changed
- В поле html теперь сохраняется только очищённый HTML (Purifier), все небезопасные теги удаляются при парсинге

## v0.0.21 — 2025-07-15

Changed
- При парсинге ссылки теперь автоматически извлекается и сохраняется <title> из HTML в поле title

## v0.0.20 — 2025-07-15

Added
- Artisan-команда links:retry-failed — перезапуск обработки всех ссылок со статусом failed

## v0.0.19 — 2025-07-15

Added
- Миграция: добавлено поле html (longText) в таблицу links для хранения исходного HTML
- В модель Link добавлено поле html в fillable

Changed
- При парсинге ссылки теперь сохраняется исходный HTML в поле html
- Markdown теперь формируется из html, а не из markdown
- При конвертации в markdown автоматически удаляются повторные пустые строки

## v0.0.18 — 2025-07-15

Removed
- Удалены неиспользуемые: миграция, модель и связь logs (Log) — теперь используется только link_logs

## v0.0.17 — 2025-07-15

Removed
- Удалён неиспользуемый пакет spatie/laravel-html

## v0.0.16 — 2025-07-15

Changed
- Переход на пакет mews/purifier для очистки HTML (вместо Spatie HtmlSanitizer)
- MarkdownService теперь использует Purifier::clean()

## v0.0.15 — 2025-07-15

Added
- Миграция для таблицы link_logs (логирование этапов обработки ссылок)

## v0.0.14 — 2025-07-15

Changed
- Для retry теперь также запускается цепочка обработки через Bus::chain (ParseLinkJob, ConvertToMarkdownJob)
- Добавлено логирование этапа retry через LinkLogService

## v0.0.13 — 2025-07-15

Changed
- После добавления ссылки теперь автоматически запускается цепочка обработки через Bus::chain (ParseLinkJob, ConvertToMarkdownJob)

## v0.0.12 — 2025-07-15

Changed
- Вынесена вся бизнес-логика из BillingController, AdminUserController, AdminLinksController в сервисы (BillingService, AdminUserService, AdminLinkService)
- Контроллеры теперь только валидируют и делегируют, код стал короче и безопаснее
- Для обновления ссылок в админке теперь используется строгий LinkUpdateRequest вместо обычного Request
- Добавлена связь billingLogs в модель User для удобного получения логов биллинга

## v0.0.11 — 2025-07-15

Changed
- Полный рефакторинг всей документации в docs: актуализированы AI.md, QUEUES.md, MODEL.md, LOGS.md, AUTH.md, SECURITY.md, PARSER.md, DASHBOARD.md, README.md
- ARCHITECTURE.md переписан под MySQL/Eloquent, убраны все упоминания MongoDB и старых пакетов
- Удалён служебный файл .DS_Store из docs

## v0.0.10 — 2025-07-15

Changed
- Все статусы ссылки централизованы через enum App\Enums\LinkStatus (pending, queued, processing, parsing, parsed, converting, converted, completed, failed, retrying)
- Удалён устаревший статус 'new' из фабрик, сервисов и тестов
- Обновлена документация: README.md, MODEL.md, QUEUES.md, AI.md
- Фабрика LinkFactory теперь использует статус 'pending' по умолчанию

## v0.0.9 — 2025-07-14

Changed
- Проект переведён с MongoDB на MySQL: удалён пакет laravel-mongodb, переписаны модели, добавлены миграции для всех коллекций, обновлён README.md

## v0.0.8 — 2025-07-14

Changed
- README.md переписан: теперь содержит только логику работы, архитектуру и сценарии

## v0.0.7 — 2025-07-13

### Added
- Интеграция строгой очистки HTML через Spatie HtmlSanitizer (HTML Purifier) с кастомным профилем (разрешены только базовые теги, удаляются скрипты, стили, iframes, inline-атрибуты, javascript/data-ссылки)
- Конфиг config/html_sanitizer.php для настройки профиля очистки

### Changed
- README.md: обновлён раздел "Безопасность" с описанием строгой очистки HTML

## v0.0.6 — 2025-07-13

### Added
- Описание схемы AuditLog и эндпоинта GET /admin/audit-logs в openapi.yaml
- Подробный раздел про AuditLog в docs/LOGS.md (структура, пример, отличие от LinkLog)

### Changed
- LOGS.md и openapi.yaml: актуализация под новую архитектуру логирования и аудита

## v0.0.5 — 2025-07-13

### Added
- Модель LinkLog для хранения этапов обработки ссылок (pipeline)
- Сервис LinkLogService для централизованного логирования этапов
- Интеграция логирования этапов в jobs ParseLinkJob и ConvertToMarkdownJob
- Эндпоинт GET /admin/links/{id}/logs для просмотра логов обработки ссылки в админке
- LinkLogResource для форматирования логов

### Changed
- README.md, LOGS.md: описание новой системы логирования этапов обработки ссылок

## v0.0.4 — 2025-01-27

### Changed
- Структурно улучшены OpenAPI спецификации (openapi-spa.yaml и openapi-admin.yaml)
- Вынесены повторяющиеся enum'ы в отдельные схемы: LinkStatus, ContentType, SortField, SortOrder, UserLevel, BillingLogType
- Разделены схемы по категориям:
  - **requests**: CreateLinkRequest, UpdateLinkRequest, ChromeAuthRequest, BillingTopupRequest, UpdateUserLevelRequest
  - **responses**: UserResponse, LinkResponse, TagResponse, BillingLogResponse, AuditLogResponse, PaginatedLinksResponse и др.
  - **entities**: User, Link, Tag, BillingLog, AuditLog (ссылаются на соответствующие Response схемы)
- Добавлены недостающие поля в мета-информацию пагинации (from, to, path) для всех PaginatedResponse схем
- Улучшена читаемость и поддерживаемость документации API

## v0.0.3 — 2025-01-27

### Added
- Эндпоинт POST /logout (выход, удаление текущего токена)
- Эндпоинт POST /auth/google/chrome (авторизация через Chrome Extension)
- Описания новых роутов в openapi.yaml, README.md, AUTH.md

### Changed
- README.md и AUTH.md: добавлены примеры запросов и ответов для новых маршрутов

### Fixed
- Унифицированы поля уровня пользователя во всех API ответах
- Убрано дублирование полей `user_level_display` и `level_display_name`
- Создан метод `getUserLevelInfo()` в модели User для централизованного получения информации об уровне
- Обновлена OpenAPI спецификация для соответствия унифицированным полям

### Changed
- Все API endpoints теперь используют единообразные названия полей: `user_level` и `user_level_display`
- Упрощена логика в Resource классах через использование spread оператора
- Улучшена согласованность API ответов

## v0.0.2 — 2025-01-27

### Fixed
- Исправлены API контроллеры для соответствия стандартам Laravel 12
- Убрано двойное оборачивание в `data` для всех endpoints
- Созданы Resource классы для сложных структур данных (Stats, Balance, History, UserLevels, Tags)
- Обновлена OpenAPI спецификация для соответствия реальным ответам API
- Добавлены недостающие поля в мета-информацию пагинации (from, to, path)
- Исправлен возвращаемый тип метода index в LinksController (убрано JsonResponse)
- Исправлены тесты BillingApiTest для использования правильного админского маршрута

### Changed
- Пагинация ссылок теперь использует стандартный подход Laravel 12
- Статистика ссылок возвращает структуру без оборачивания в data
- Биллинг endpoints используют Resource классы
- Уровни пользователей используют Resource классы
- Теги используют Resource классы

## v0.0.1 — 2025-01-27

### Added
- Ограничение: максимум 50 ссылок в сутки на пользователя
- Ограничение: максимум 3 retry на одну ссылку
- Новые обязательные поля в Link: type, summary, image (image обязательно для video)
- Fail-safe: ошибки 429 при превышении лимита ссылок, 400 при превышении retry

### Changed
- Обновлены схемы OpenAPI и описание модели Link
- Обновлена документация (README, QUEUES.md, PLAN.md)

### Fixed
- Унификация статусов ссылок и описание ошибок

### Removed
- Поле avatar удалено из User (миграции, openapi, документация)
