# Demo API Guide для Лэндинга ## Обзор Demo API предоставляет функционал для демонстрации основных возможностей платформы NoCopy на лэндинге без необходимости регистрации пользователя. ## Ключевые Особенности ✅ **Анонимная загрузка файлов** - без авторизации ✅ **Хранение в S3** - безопасное облачное хранилище ✅ **Автоматическая очистка** - удаление через 24 часа ✅ **Ограничения по IP** - защита от злоупотреблений ✅ **Размер лимитов** - до 50 MB на файл, 10 файлов в день --- ## API Эндпоинты ### 1. Загрузка файла ``` POST /api/demo/upload Content-Type: multipart/form-data ``` **Параметры:** - `file` (required) - файл для загрузки (jpg, png, pdf, docx, mp3 и т.д.) **Примеры ответа:** ✅ Успех (200 OK): ```json { "sessionId": "550e8400-e29b-41d4-a716-446655440000", "fileName": "document.pdf", "fileType": "document", "fileSize": 1048576, "status": "COMPLETED", "message": "File uploaded successfully", "uploadedBytes": 1048576, "progressPercentage": 100 } ``` ❌ Файл слишком большой (400): ```json { "sessionId": null, "fileName": null, "fileType": null, "fileSize": 0, "status": "FAILED", "message": "File too large. Max size: 50 MB", "uploadedBytes": 0, "progressPercentage": 0 } ``` ❌ Лимит на день превышен (400): ```json { "sessionId": null, "status": "FAILED", "message": "Daily limit reached. Max 10 files per day" } ``` --- ### 2. Получение информации о файле ``` GET /api/demo/file/{sessionId} ``` **Параметры:** - `sessionId` (path) - ID сессии из ответа загрузки **Ответ (200 OK):** ```json { "sessionId": "550e8400-e29b-41d4-a716-446655440000", "fileName": "document.pdf", "fileType": "document", "fileSize": 1048576, "status": "COMPLETED", "createdAt": "2025-07-01T10:30:00Z", "expiresAt": "2025-07-02T10:30:00Z", "searchResultsCount": null, "mimeType": "application/pdf" } ``` --- ### 3. Запуск поиска похожих файлов ``` POST /api/demo/search/{sessionId} ``` **Параметры:** - `sessionId` (path) - ID сессии **Ответ (200 OK):** ```json { "sessionId": "550e8400-e29b-41d4-a716-446655440000", "status": "COMPLETED", "resultsCount": 3, "matchPercentage": 92.5, "startedAt": "2025-07-01T10:31:00Z", "completedAt": "2025-07-01T10:31:05Z", "processingTimeMs": 5000, "similarFiles": [ { "fileId": "demo_abc123", "fileName": "similar_image_1.jpg", "similarityScore": 0.95, "source": "web" }, { "fileId": "demo_def456", "fileName": "similar_image_2.png", "similarityScore": 0.90, "source": "database" }, { "fileId": "demo_ghi789", "fileName": "duplicate_document.pdf", "similarityScore": 0.85, "source": "web" } ], "message": "Search completed successfully" } ``` --- ### 4. Очистка сессии ``` DELETE /api/demo/cleanup/{sessionId} ``` **Параметры:** - `sessionId` (path) - ID сессии **Ответ (200 OK):** ```json { "sessionId": "550e8400-e29b-41d4-a716-446655440000", "status": "CLEANED", "message": "Session cleaned successfully", "progressPercentage": 100 } ``` --- ### 5. Health Check ``` GET /api/demo/health ``` **Ответ (200 OK):** ```json { "status": "HEALTHY", "message": "Demo service is ready" } ``` --- ## Лимиты и Ограничения | Параметр | Значение | Описание | |----------|----------|----------| | Max файл | 50 MB | Максимальный размер одного файла | | Файлов в день | 10 | Максимум файлов с одного IP в день | | TTL сессии | 24 часа | Время жизни демо-сессии | | Cleanup интервал | 30 минут | Как часто очищаются истекшие файлы | | Поддерживаемые типы | image, document, audio | Типы файлов для демо | --- ## Поддерживаемые Типы Файлов **Изображения:** - JPG/JPEG (.jpg, .jpeg) - PNG (.png) - GIF (.gif) - WebP (.webp) **Документы:** - PDF (.pdf) - Word (.docx, .doc) - Excel (.xlsx, .xls) - Text (.txt) **Аудио:** - MP3 (.mp3) - WAV (.wav) - M4A (.m4a) - OGG (.ogg) --- ## Примеры использования ### cURL **Загрузка файла:** ```bash curl -X POST http://localhost:8080/api/demo/upload \ -F "file=@document.pdf" ``` **Получение информации:** ```bash curl http://localhost:8080/api/demo/file/550e8400-e29b-41d4-a716-446655440000 ``` **Запуск поиска:** ```bash curl -X POST http://localhost:8080/api/demo/search/550e8400-e29b-41d4-a716-446655440000 ``` **Очистка:** ```bash curl -X DELETE http://localhost:8080/api/demo/cleanup/550e8400-e29b-41d4-a716-446655440000 ``` ### JavaScript **Загрузка файла:** ```javascript const formData = new FormData(); formData.append('file', fileInput.files[0]); const response = await fetch('http://localhost:8080/api/demo/upload', { method: 'POST', body: formData }); const result = await response.json(); const sessionId = result.sessionId; ``` **Получение информации:** ```javascript const info = await fetch(`http://localhost:8080/api/demo/file/${sessionId}`) .then(r => r.json()); ``` **Запуск поиска:** ```javascript const search = await fetch(`http://localhost:8080/api/demo/search/${sessionId}`, { method: 'POST' }) .then(r => r.json()); ``` ### Python **Загрузка файла:** ```python import requests files = {'file': open('document.pdf', 'rb')} response = requests.post('http://localhost:8080/api/demo/upload', files=files) result = response.json() session_id = result['sessionId'] ``` --- ## Обработка Ошибок ### 400 Bad Request - Файл слишком большой ```json { "status": "FAILED", "message": "File too large. Max size: 50 MB" } ``` **Решение:** Загрузите файл меньшего размера ### 400 Bad Request - Неподдерживаемый тип файла ```json { "status": "FAILED", "message": "File type not supported for demo" } ``` **Решение:** Используйте поддерживаемый тип файла ### 400 Bad Request - Лимит на день ```json { "status": "FAILED", "message": "Daily limit reached. Max 10 files per day" } ``` **Решение:** Подождите до следующего дня или зарегистрируйтесь ### 404 Not Found - Сессия не найдена ```json { "status": "ERROR" } ``` **Решение:** Проверьте правильность sessionId ### 500 Internal Server Error ```json { "status": "FAILED", "message": "Upload failed: ..." } ``` **Решение:** Попробуйте позже или свяжитесь с поддержкой --- ## Cleanup-сервис (важное объяснение) ### Что делает Cleanup-сервис? Это автоматизированный сервис, который периодически: 1. **Ищет истекшие сессии** (старше 24 часов) 2. **Удаляет файлы из S3** для экономии места 3. **Помечает сессии как CLEANED** в БД 4. **Удаляет FAILED сессии** (старше 1 часа) ### Почему это нужно? - **Экономия дискового пространства** - S3 стоит денег - **Соблюдение GDPR/приватности** - данные не лежат вечно - **Производительность БД** - не растёт бесконечно - **Безопасность** - временные данные не остаются в системе ### Как это работает? ``` Каждые 30 минут: ┌─────────────────────────────────────┐ │ 1. Найти истекшие сессии │ │ WHERE expiresAt <= NOW() │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 2. Для каждой сессии: │ │ - Удалить из S3 │ │ - Обновить статус = CLEANED │ └─────────────────────────────────────┘ ``` ### В конфиге (application.yaml): ```yaml demo: max-file-size: 52428800 # 50 MB max-files-per-day: 10 # макс 10 файлов в день s3-path: demo/ # путь в S3 session-ttl-hours: 24 # 24 часа жизни сессии cleanup-interval: 30 # cleanup каждые 30 минут failed-cleanup-interval: 60 # очистка FAILED каждый час ``` --- ## Статистика и Мониторинг ### Метрики для отслеживания ```java // Количество активных демо-сессий long activeSessions = demoCleanupService.getActiveDemoSessionsCount(); // Общий размер демо-данных в S3 long dataSizeInBytes = demoCleanupService.getActiveDemoDataSize(); long dataSizeInMB = dataSizeInBytes / (1024 * 1024); ``` ### Логирование Все операции логируются: ``` [INFO] Demo upload started for IP: 192.168.1.1 [INFO] File uploaded to S3 at: demo/550e8400.../test.jpg [INFO] Starting search for session: 550e8400-e29b-41d4... [INFO] Demo cleanup completed. Cleaned 5 sessions ``` --- ## Best Practices для Frontend 1. **Показывайте progress** - используйте `progressPercentage` 2. **Обрабатывайте ошибки** - проверяйте `status` == "FAILED" 3. **Очищайте сессии** - вызывайте `/cleanup` перед уходом 4. **Не перезагружайте** - максимум 10 файлов в день 5. **Таймауты** - сессия истекает через 24 часа --- ## Интеграция на лэндинге ### Step 1: Drag & Drop зона ```html