use std::sync::Arc;
use axum::Json;
use axum::extract::{Extension, Path};
use axum::response::Response;
use serde_json::Value as JsonValue;
use tokio_util::sync::CancellationToken;
use tracing::field::Empty;
use uuid::Uuid;
use toolkit_security::SecurityContext;
use crate::api::rest::handlers::sessions::{identity_from_ctx, reject_body_identity};
use crate::domain::error::Result;
use crate::domain::retention::RetentionPolicy;
use crate::domain::service::intelligence_service::IntelligenceService;
#[derive(Debug, serde::Deserialize)]
pub struct PatchRetentionPolicyBody {
#[serde(flatten)]
pub policy: RetentionPolicy,
pub tenant_id: Option<JsonValue>,
pub user_id: Option<JsonValue>,
}
#[tracing::instrument(
skip(svc, ctx),
fields(
request_id = Empty,
session_id = %session_id,
),
)]
pub async fn summarize_session(
Extension(ctx): Extension<SecurityContext>,
Extension(svc): Extension<Arc<IntelligenceService>>,
Path(session_id): Path<Uuid>,
) -> Result<Response> {
let identity = identity_from_ctx(&ctx)?;
let cancel = CancellationToken::new();
let event_stream = svc.summarize_session(&identity, session_id, cancel).await?;
Ok(crate::api::rest::sse_delta_stream_response(event_stream))
}
#[tracing::instrument(skip(svc, ctx), fields(session_id = %session_id))]
pub async fn get_retention_policy(
Extension(ctx): Extension<SecurityContext>,
Extension(svc): Extension<Arc<IntelligenceService>>,
Path(session_id): Path<Uuid>,
) -> Result<Json<RetentionPolicy>> {
let identity = identity_from_ctx(&ctx)?;
let policy = svc
.get_effective_retention_policy(&identity, session_id)
.await?;
Ok(Json(policy))
}
#[tracing::instrument(skip(svc, ctx, body), fields(session_id = %session_id))]
pub async fn patch_retention_policy(
Extension(ctx): Extension<SecurityContext>,
Extension(svc): Extension<Arc<IntelligenceService>>,
Path(session_id): Path<Uuid>,
Json(body): Json<PatchRetentionPolicyBody>,
) -> Result<Json<RetentionPolicy>> {
reject_body_identity(&body.tenant_id, &body.user_id)?;
let identity = identity_from_ctx(&ctx)?;
let updated = svc
.update_session_retention_policy(&identity, session_id, body.policy)
.await?;
Ok(Json(updated))
}
#[cfg(test)]
#[path = "intelligence_tests.rs"]
mod intelligence_tests;