idconvert/backend/services/scan_service.py

42 lines
1.3 KiB
Python

from __future__ import annotations
import uuid
from typing import Optional, Tuple
from fastapi import UploadFile
from export.validator import ExportValidator
from export.scanner import IDExportScanner
from models.scan import ScanReport
# In-memory scan cache: session_id → (validated_data_dict, ScanReport)
# Replace with PocketBase/Redis when wiring auth
_scan_cache: dict = {}
class ScanService:
def __init__(self, validator: ExportValidator, scanner: IDExportScanner):
self.validator = validator
self.scanner = scanner
async def scan(self, file: UploadFile) -> ScanReport:
"""Validate and scan the uploaded idconvert_export.json."""
content = await file.read()
# Validate — raises FileValidationError on failure
data = self.validator.validate(content)
# Run lightweight scan for pre-conversion report
report = self.scanner.scan(data)
# Cache validated data dict and report by session ID
session_id = str(uuid.uuid4())
report.session_id = session_id
_scan_cache[session_id] = (data, report)
return report
def get_cached(self, session_id: str) -> Optional[Tuple[dict, ScanReport]]:
"""Return (data_dict, report) for the session, or None if expired/missing."""
return _scan_cache.get(session_id)