import asyncio import base64 import uuid from concurrent.futures import ProcessPoolExecutor from datetime import datetime, timedelta from typing import Dict import aioboto3 from arq.connections import RedisSettings from fastapi import HTTPException, status, Query, Depends from sqlalchemy.ext.asyncio import AsyncSession from .models import Metadata, Document, Thread, Message # Global executor for CPU tasks cpu_pool = ProcessPoolExecutor(max_workers=4) # Redis redis_settings = RedisSettings.from_dsn("redis://localhost") # S3 async def get_s3_client(): return aioboto3.Session().client( 's3', endpoint_url='http://localhost:9000', # From env aws_access_key_id='minioadmin', aws_secret_access_key='minioadmin' ) # Routing Engine def route_document(metadata: Metadata) -> str: rules = { "Finanzamt-München-I": "Steuerfestsetzung-Team-B", "Gericht-Berlin": "Zivilabteilung" } return rules.get(metadata.authority_id, "Fallback-Team") # Rate Limiting async def rate_limit(user_id: str, redis, limit: int = 10, window: int = 60): key = f"rate_limit:{user_id}" current = await redis.get(key) if current is None: await redis.setex(key, window, 1) return True count = int(current) if count >= limit: raise HTTPException(status_code=429, detail="Rate limit exceeded") await redis.incr(key) return True # Validate Encrypted Payload (CPU-bound) def validate_encrypted_payload(payload_b64: str) -> bool: payload_bytes = base64.b64decode(payload_b64) return payload_bytes.startswith(b'\x00\x01') # Demo check # GDPR Reaper async def reaper(db: AsyncSession): stmt = delete(Document).where(Document.retention_date < datetime.now()) await db.execute(stmt) await db.commit()