42 lines
1.3 KiB
Python
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)
|