use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Vault {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub archived_at: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CreateVaultParams {
pub display_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Credential {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vault_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub archived_at: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CreateCredentialParams {
pub display_name: String,
pub auth: serde_json::Value,
}
impl CreateCredentialParams {
pub fn static_bearer(
display_name: impl Into<String>,
mcp_server_url: impl Into<String>,
token: impl Into<String>,
) -> Self {
Self {
display_name: display_name.into(),
auth: serde_json::json!({
"type": "static_bearer",
"mcp_server_url": mcp_server_url.into(),
"token": token.into(),
}),
}
}
pub fn mcp_oauth(
display_name: impl Into<String>,
mcp_server_url: impl Into<String>,
access_token: impl Into<String>,
expires_at: impl Into<String>,
refresh: Option<serde_json::Value>,
) -> Self {
let mut auth = serde_json::json!({
"type": "mcp_oauth",
"mcp_server_url": mcp_server_url.into(),
"access_token": access_token.into(),
"expires_at": expires_at.into(),
});
if let Some(refresh_config) = refresh {
auth.as_object_mut().unwrap().insert("refresh".to_string(), refresh_config);
}
Self { display_name: display_name.into(), auth }
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UpdateCredentialParams {
pub auth: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CredentialValidation {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credential_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vault_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub validated_at: Option<String>,
#[serde(default)]
pub has_refresh_token: bool,
pub status: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp_probe: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub refresh: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct VaultListResponse<T> {
pub data: Vec<T>,
}