tandem-server 0.6.8

HTTP server for Tandem engine APIs
use axum::http::StatusCode;
use tandem_types::TenantContext;

use super::tenant_matches;

fn tenant_actor_id(tenant_context: &TenantContext) -> Option<&str> {
    tenant_context
        .actor_id
        .as_deref()
        .map(str::trim)
        .filter(|actor_id| !actor_id.is_empty())
}

pub(super) fn session_visible_to_actor(
    request_tenant: &TenantContext,
    session_tenant: &TenantContext,
) -> bool {
    if !tenant_matches(request_tenant, session_tenant) {
        return false;
    }
    if session_tenant.is_local_implicit() {
        return true;
    }
    matches!(
        (
            tenant_actor_id(request_tenant),
            tenant_actor_id(session_tenant)
        ),
        (Some(request_actor), Some(session_actor)) if request_actor == session_actor
    )
}

pub(super) fn ensure_same_session_actor(
    request_tenant: &TenantContext,
    session_tenant: &TenantContext,
) -> Result<(), StatusCode> {
    if session_visible_to_actor(request_tenant, session_tenant) {
        Ok(())
    } else {
        Err(StatusCode::NOT_FOUND)
    }
}