generated from coulomb/repo-seed
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
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() |