### 🐛 FIX: Double Extension in Uploaded Files
- **✅ Исправлена критическая ошибка upload**: `filename.png.png` → `filename.png`
- **Проблема**: `generate_key_with_extension()` добавляла расширение к уже существующему
- **Следствие**: Файлы не находились в S3 (404), т.к. путь в Redis был неправильный
- **Решение**: Убираем существующее расширение перед добавлением нового
- **Файлы**: `quoter/src/s3_utils.rs` строки 77-81
- **Note**: Upload **уже загружает в Storj**, не в AWS (это правильно!)
### 🔧 FIX: Duplicate Nginx Upstream Error
- **✅ Исправлен nginx конфиг**: Убрано дублирование `upstream quoter-8080`
- **Проблема**: `nginx: [emerg] duplicate upstream "quoter-8080"`
- **Причина**: upstream определялся дважды - в цикле и после него
- **Решение**: Вынесли `{{ end }}` раньше, чтобы upstream создавался только один раз
- **Файлы**: `nginx.conf.sigil` строка 148
- 🚀 Деплой успешен, CDN работает стабильно
### 🔧 FIX: Nginx 413 Content Too Large
- **✅ Создан `nginx.conf.sigil` для Dokku**: Увеличены лимиты для больших файлов
- `client_max_body_size 500M` (было: 1M default)
- `client_body_timeout 300s` (5 минут для больших файлов)
- `proxy_request_buffering off` (не буферим в Nginx, стримим напрямую)
- `proxy_buffering off` (экономия памяти)
- Увеличены timeouts: connect/send/read до 300s
- Решает 413 ошибку при загрузке файлов >1MB на v3.dscrs.site
### 🔒 FIX: JWT Token Grace Period
- **✅ Добавлен grace period для истекших токенов**: 60 секунд
- Изменена логика проверки JWT `exp` в `auth.rs`
- Токены принимаются в течение 60 секунд после истечения
- Это даёт клиенту время автоматически обновить токен через `refreshToken()`
- Логирование разделено: `info` для grace period, `warn` для полного истечения
- Решает проблему "Invalid or expired token" при параллельных запросах
- Формула: `if exp + 60 < current_time` → reject, иначе accept
- Предотвращает race condition: upload начался до истечения, закончился после
- Replace 'echo' with 'printf' for STAGING_PRIVATE_KEY
- Fixes 'error in libcrypto' when loading malformed SSH key
- Ensures proper multi-line key format preservation
- 🔑 **JWT_SECRET → JWT_SECRET_KEY**: Используется `JWT_SECRET_KEY` для совместимости с `@core`, `@inbox`, `@presence`
- Fallback на `JWT_SECRET` для обратной совместимости
- Обновлена документация: README.md, configuration.md
- **BREAKING**: Требует установки `JWT_SECRET_KEY` в production (или использование legacy `JWT_SECRET`)
### Fixed (Tests & Code Quality)
- 🧪 **Удален мертвый код**: Removed unused mock functions and structs from tests
- 🔧 **Исправлены async тесты**: Changed `#[test]` → `#[tokio::test]` для async функций
- 🧹 **Чистые warnings**: Все тесты компилируются без warnings
- 📝 **Префиксы unused полей**: `_field` вместо `#[allow(dead_code)]`
### Fixed (Thumbnail Error Logging)
- **🔇 Reduced Noise**: Убраны избыточные warning логи для несуществующих thumbnails
- **🎯 Smart Logging**: NoSuchKey ошибки (нормальное поведение) больше не логируются как проблемы
- **🧹 Code Cleanup**: Удалена избыточная проверка `thumbnail_exists_in_storj` перед генерацией
- **⚡ Performance**: Уменьшено количество лишних запросов к Storj S3
### Technical Details
- `thumbnail.rs`: Добавлена фильтрация NoSuchKey/Not Found ошибок в `load_cached_thumbnail_from_storj()`
- `serve_file.rs`: Убрана двойная проверка существования thumbnail в кэше
- Логи теперь показывают только реальные проблемы, не нормальное отсутствие кэша
### Compatibility
- **Обратная совместимость**: Все существующие API endpoints работают без изменений
- **Graceful degradation**: Thumbnails генерируются on-demand если отсутствуют в кэше
### 🔐 Улучшенная аутентификация для микросервисов
#### ✨ Новые возможности
- **Универсальная аутентификация**: Добавлена функция `authenticate_request()` для всех handlers
- **Множественные источники токенов**: Поддержка Bearer, X-Session-Token, Cookie
- **Redis сессии**: Интеграция с Redis для проверки активных сессий
- **Безопасная валидация**: Функция `secure_token_validation()` с проверкой TTL и обновлением активности
- **Извлечение токенов**: Универсальная функция `extract_token_from_request()` для всех типов запросов
#### 🧪 Тестирование
- **14 новых тестов**: Полное покрытие новой логики аутентификации
- **Производительность**: Тесты производительности (< 1ms на операцию)
- **Безопасность**: Тесты защиты от подозрительных токенов
- **Граничные случаи**: Тестирование истекших токенов, неверных форматов
- **Интеграция**: Тесты с мокированным Redis
#### ♻️ Рефакторинг (DRY & YAGNI)
- **Устранение дублирования**: Объединена логика аутентификации из upload.rs и user.rs
- **Удаление устаревшего кода**: Убраны `extract_user_id_from_token`, `validate_token`, `get_user_by_token`
- **Очистка констант**: Удалены неиспользуемые `MAX_TOKEN_LENGTH`, `MIN_TOKEN_LENGTH`
- **Упрощение**: Заменена `extract_and_validate_token` на `authenticate_request`
#### ��️ Архитектурные улучшения
- **Библиотечная цель**: Добавлена `lib.rs` для тестирования модулей
- **Модульность**: Четкое разделение ответственности между модулями
- **Единообразие**: Все handlers теперь используют одинаковую логику аутентификации
#### 📋 Совместимость
- **Обратная совместимость**: Все существующие API endpoints работают без изменений
- **Graceful fallback**: Работа без Redis (JWT-only режим)
- **Множественные форматы**: Поддержка различных способов передачи токенов
- Add full filename in unsupported format error messages
- Add proper handling for system files (robots.txt, favicon.ico, sitemap.xml, humans.txt)
- Improve logging for static image server requests
- Add detailed logging for thumbnail vs image requests
- robots.txt now returns proper response for static image server
💋 Better static file server: proper system file handling and detailed logging.
- Removed automatic username addition for Redis URLs
- Redis works with password-only authentication
- Fixed connection issues with Dokku Redis service
- Restored thumbnail functions in src/thumbnail.rs with WebP support
- Added Storj caching for thumbnails (cache_thumbnail_to_storj, load_cached_thumbnail_from_storj)
- Updated handlers to use thumbnail generation with Storj caching
- Added ETag caching with MD5 hashes for optimal performance
- Updated documentation to reflect restored thumbnail functionality
- Removed local file caching in favor of reliable Storj storage
💋 Self-contained: Quoter now handles everything - uploads, thumbnails, and serving.
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной README.md с быстрым стартом
- docs/SETUP.md для конфигурации и развертывания
- Упрощенный features.md с фокусом на основную функциональность
- docs/vercel-frontend-migration.md - единый comprehensive guide для Vercel интеграции
- Добавлен акцент на Vercel по всему коду и документации
- Обновлены URL patterns в документации: quoter.discours.io → files.dscrs.site
### 🗑️ Удалено
- Избыточные файлы документации (api-reference, deployment, development, и т.д.)
- Дублирующийся контент в нескольких документах
- Излишне детальная документация для простого файлового прокси
- 4 отдельных Vercel документа: vercel-thumbnails.md, vercel-integration.md, hybrid-architecture.md, vercel-og-integration.md
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной README.md с быстрым стартом
- docs/SETUP.md для конфигурации и развертывания
- Упрощенный features.md с фокусом на основную функциональность
- Добавлен акцент на Vercel по всему коду и документации
### 🗑️ Удалено
- Избыточные файлы документации (api-reference, deployment, development, и т.д.)
- Дублирующийся контент в нескольких документах
- Излишне детальная документация для простого файлового прокси
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
- Deleted quota.rs module (quota management not needed via HTTP)
- Removed legacy get_id_by_token GraphQL function
- Removed unused set_user_quota and increase_user_quota methods
- Cleaned up unused imports and legacy structs
- Simplified handlers/mod.rs to only expose universal_handler
Architecture now focused on core functionality:
- GET / (user info)
- GET /<filename> (file serving)
- POST / (file upload)