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 @staticmethod 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" ) @staticmethod 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}"