Kazeia-central/kazeia_central/features/medical/conversations/router.py

55 lines
1.8 KiB
Python

"""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