Spaces:
Running
Running
| from __future__ import annotations | |
| import urllib.parse | |
| from typing import Any, Dict, List | |
| from app.core.logger import get_logger | |
| logger = get_logger(__name__) | |
| QR_CODE_BASE_URL = "https://api.qrserver.com/v1/create-qr-code/" | |
| DEFAULT_SIZE = "300x300" | |
| MAX_DATA_LENGTH = 2048 | |
| MAX_ITEMS = 500 | |
| class QRGeneratorError(Exception): | |
| pass | |
| class QRGeneratorService: | |
| def generate_bulk( | |
| self, | |
| data_list: List[str], | |
| size: str = DEFAULT_SIZE, | |
| ) -> List[Dict[str, Any]]: | |
| results: List[Dict[str, Any]] = [] | |
| for idx, data in enumerate(data_list): | |
| try: | |
| self._validate_data(data) | |
| qr_url = self._build_qr_url(data, size) | |
| results.append({ | |
| "index": idx, | |
| "data": data, | |
| "qr_image_url": qr_url, | |
| "error": None, | |
| }) | |
| except QRGeneratorError as e: | |
| results.append({ | |
| "index": idx, | |
| "data": data, | |
| "qr_image_url": None, | |
| "error": str(e), | |
| }) | |
| return results | |
| def _validate_data(data: str) -> None: | |
| if not data or not isinstance(data, str): | |
| raise QRGeneratorError("Data must be a non-empty string") | |
| if len(data) > MAX_DATA_LENGTH: | |
| raise QRGeneratorError( | |
| f"Data exceeds max length of {MAX_DATA_LENGTH} characters" | |
| ) | |
| def _build_qr_url(data: str, size: str) -> str: | |
| encoded = urllib.parse.quote(data, safe="") | |
| return f"{QR_CODE_BASE_URL}?size={size}&data={encoded}" | |