55 lines
1.8 KiB
Python
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
|