llm-ready-data / app /services /qr_generator_service.py
Code-API's picture
feat: add qr code genartor api
a8962d7
Raw
History Blame Contribute Delete
1.7 kB
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}"