# QR API Endpoints - Примеры запросов ## 1. Генерация QR кодов (Admin endpoint) ### POST /api/admin/qrcodes Генерирует уникальные QR токены указанного типа. **Request:** ```bash curl -X POST http://localhost:8080/api/admin/qrcodes \ -H "Content-Type: application/json" \ -d '{ "type": "reward", "value": "50", "count": 5 }' ``` **Response (200 OK):** ```json { "success": true, "message": "5 unique QR codes generated successfully", "data": { "tokens": [ "a1b2c3d4e5f678901234567890abcdef", "b2c3d4e5f678901234567890abcdef12", "c3d4e5f678901234567890abcdef1234", "d4e5f678901234567890abcdef123456", "e5f678901234567890abcdef12345678" ] } } ``` --- ### Генерация QR для викторины **Request:** ```bash curl -X POST http://localhost:8080/api/admin/qrcodes \ -H "Content-Type: application/json" \ -d '{ "type": "quiz", "value": "123", "count": 3 }' ``` **Response (200 OK):** ```json { "success": true, "message": "3 unique QR codes generated successfully", "data": { "tokens": [ "f678901234567890abcdef1234567890a", "78901234567890abcdef1234567890ab", "8901234567890abcdef1234567890abc" ] } } ``` --- ### Генерация QR для магазина **Request:** ```bash curl -X POST http://localhost:8080/api/admin/qrcodes \ -H "Content-Type: application/json" \ -d '{ "type": "shop", "value": "discount_10", "count": 2 }' ``` **Response (200 OK):** ```json { "success": true, "message": "2 unique QR codes generated successfully", "data": { "tokens": [ "901234567890abcdef1234567890abcd", "01234567890abcdef1234567890bcde" ] } } ``` --- ## 2. Валидация QR кодов (User endpoint) ### POST /api/qr/validate Валидирует уникальный токен и выполняет соответствующее действие. **Request:** ```bash curl -X POST http://localhost:8080/api/qr/validate \ -H "Content-Type: application/json" \ -d '{ "payload": "a1b2c3d4e5f678901234567890abcdef" }' ``` --- ### Успешная валидация reward токена **Response (200 OK):** ```json { "success": true, "message": "QR payload validated successfully", "data": { "type": "REWARD", "data": { "amount": 50 } } } ``` --- ### Успешная валидация quiz токена **Response (200 OK):** ```json { "success": true, "message": "QR payload validated successfully", "data": { "type": "OPEN_QUIZ", "data": { "id": 123, "title": "Знаешь ли ты бренд?", "description": "Тест на знание популярных брендов", "reward_stars": 100, "has_timer": false, "can_repeat": true, "repeat_cooldown_hours": 24, "questions": [ { "id": 1, "text": "Какой бренд использует слоган 'Just Do It'?", "type": "single", "options": [ {"id": 1, "text": "Adidas", "is_correct": false}, {"id": 2, "text": "Nike", "is_correct": true}, {"id": 3, "text": "Puma", "is_correct": false} ], "order_index": 0 } ] } } } ``` --- ### Успешная валидация shop токена **Response (200 OK):** ```json { "success": true, "message": "QR payload validated successfully", "data": { "type": "SHOP_ACTION", "data": { "action": "discount_10" } } } ``` --- ## 3. Ошибки валидации ### Неверный или просроченный токен **Response (400 Bad Request):** ```json { "success": false, "message": "invalid or expired token" } ``` ### Токен уже использован **Response (400 Bad Request):** ```json { "success": false, "message": "token has already been used" } ``` ### Пустой payload **Request:** ```bash curl -X POST http://localhost:8080/api/qr/validate \ -H "Content-Type: application/json" \ -d '{ "payload": "" }' ``` **Response (400 Bad Request):** ```json { "success": false, "message": "Payload cannot be empty" } ``` --- ## 4. Ошибки генерации QR кодов ### Неверный тип **Request:** ```bash curl -X POST http://localhost:8080/api/admin/qrcodes \ -H "Content-Type: application/json" \ -d '{ "type": "invalid_type", "value": "50", "count": 1 }' ``` **Response (400 Bad Request):** ```json { "success": false, "message": "Invalid type. Must be 'reward', 'quiz', or 'shop'" } ``` ### Неверное количество **Request:** ```bash curl -X POST http://localhost:8080/api/admin/qrcodes \ -H "Content-Type: application/json" \ -d '{ "type": "reward", "value": "50", "count": 0 }' ``` **Response (400 Bad Request):** ```json { "success": false, "message": "Count must be between 1 and 100" } ``` --- ## 5. Как использовать сгенерированные токены 1. **Сгенерируйте токены** через админский эндпоинт 2. **Создайте QR коды** с полученными токенами (используйте любой QR генератор) 3. **Разместите QR коды** в физических локациях или в цифровых материалах 4. **Пользователи сканируют** QR коды через приложение 5. **Приложение отправляет** токен на `/api/qr/validate` 6. **Система выполняет** действие (начисляет звезды, открывает викторину и т.д.) ### Пример QR кода для награды: ``` Содержимое QR кода: a1b2c3d4e5f678901234567890abcdef ``` ### Пример QR кода для викторины: ``` Содержимое QR кода: f678901234567890abcdef1234567890a ``` --- ## 6. Технические особенности - **Токены** имеют 128-битную энтропию (32 шестнадцатеричных символа) - **Хранятся** в Redis с 30-дневным сроком действия - **Одноразовые** - после использования помечаются как использованные - **Типы:** reward (награда), quiz (викторина), shop (магазин) - **Валидация** проверяет существование, срок действия и факт использования