"""Router Conversations (médical, RGPD) : rapatriement chiffré, lecture, export, purge.""" from __future__ import annotations from fastapi import APIRouter from fastapi.responses import JSONResponse from pydantic import BaseModel from kazeia_central.core.context import Ctx from . import service as svc class _Collect(BaseModel): profile_id: str | None = None since: int | None = None until: int | None = None class _Purge(BaseModel): session_id: str | None = None profile_id: str | None = None before: int | None = None def make_router(ctx: Ctx) -> APIRouter: r = APIRouter(prefix="/api/conversations", tags=["conversations"]) g, now = ctx.guard, ctx.now_ms @r.post("/{serial}/collect") def collect(serial: str, body: _Collect): return g(lambda: svc.collect(ctx.adb, ctx.store, serial, profile_id=body.profile_id, since=body.since, until=body.until, now=now(), actor=ctx.operator)) @r.get("/{serial}") def sessions(serial: str): return g(lambda: svc.sessions(ctx.store, serial)) @r.get("/{serial}/{session_id}") def session_turns(serial: str, session_id: str): return g(lambda: svc.session_turns(ctx.store, serial, session_id)) @r.get("/{serial}/{session_id}/export") def export_session(serial: str, session_id: str): data = g(lambda: svc.export_session(ctx.store, serial, session_id)) return JSONResponse(data, headers={ "content-disposition": f'attachment; filename="conv_{serial}_{session_id}.json"'}) @r.post("/{serial}/purge") def purge(serial: str, body: _Purge): return g(lambda: svc.purge(ctx.store, serial, session_id=body.session_id, profile_id=body.profile_id, before=body.before, now=now(), actor=ctx.operator)) return r