use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "ts-export", derive(ts_rs::TS), ts(export))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AdminAuditResult {
Ok,
Error,
Denied,
}
impl AdminAuditResult {
pub fn as_str(self) -> &'static str {
match self {
AdminAuditResult::Ok => "ok",
AdminAuditResult::Error => "error",
AdminAuditResult::Denied => "denied",
}
}
pub fn from_str(s: &str) -> Self {
match s {
"ok" => AdminAuditResult::Ok,
"denied" => AdminAuditResult::Denied,
_ => AdminAuditResult::Error,
}
}
}
#[cfg_attr(feature = "ts-export", derive(ts_rs::TS), ts(export))]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AdminAuditRow {
pub microapp_id: String,
pub method: String,
pub capability: String,
pub args_hash: String,
pub started_at_ms: u64,
pub result: AdminAuditResult,
pub duration_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<String>,
}
#[cfg_attr(feature = "ts-export", derive(ts_rs::TS), ts(export))]
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct AuditTailFilter {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub microapp_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub result: Option<AdminAuditResult>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub since_ms: Option<u64>,
#[serde(default)]
pub limit: usize,
#[serde(default)]
pub offset: usize,
}
#[cfg_attr(feature = "ts-export", derive(ts_rs::TS), ts(export))]
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct AuditTailPage {
pub entries: Vec<AdminAuditRow>,
pub total: u64,
pub has_more: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_offset: Option<usize>,
}