use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TicketType {
Impersonation,
AgentAccess,
WebhookAppAccess,
ApiAuthAccess,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AgentSessionIdentifier {
Static,
Signin,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct CreateSessionTicketRequest {
pub ticket_type: TicketType,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_session_identifier: Option<AgentSessionIdentifier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actor_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub webhook_app_slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_auth_app_slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_in: Option<u64>,
}
impl CreateSessionTicketRequest {
pub fn impersonation(user_id: impl Into<String>) -> Self {
Self {
ticket_type: TicketType::Impersonation,
user_id: Some(user_id.into()),
agent_ids: None,
agent_session_identifier: None,
actor_id: None,
webhook_app_slug: None,
api_auth_app_slug: None,
expires_in: None,
}
}
pub fn agent_access(agent_ids: Vec<String>, actor_id: impl Into<String>) -> Self {
Self {
ticket_type: TicketType::AgentAccess,
user_id: None,
agent_ids: Some(agent_ids),
agent_session_identifier: Some(AgentSessionIdentifier::Static),
actor_id: Some(actor_id.into()),
webhook_app_slug: None,
api_auth_app_slug: None,
expires_in: None,
}
}
pub fn webhook_app_access(webhook_app_slug: impl Into<String>) -> Self {
Self {
ticket_type: TicketType::WebhookAppAccess,
user_id: None,
agent_ids: None,
agent_session_identifier: None,
actor_id: None,
webhook_app_slug: Some(webhook_app_slug.into()),
api_auth_app_slug: None,
expires_in: None,
}
}
pub fn api_auth_access(api_auth_app_slug: impl Into<String>) -> Self {
Self {
ticket_type: TicketType::ApiAuthAccess,
user_id: None,
agent_ids: None,
agent_session_identifier: None,
actor_id: None,
webhook_app_slug: None,
api_auth_app_slug: Some(api_auth_app_slug.into()),
expires_in: None,
}
}
pub fn agent_access_signin(agent_ids: Vec<String>) -> Self {
Self {
ticket_type: TicketType::AgentAccess,
user_id: None,
agent_ids: Some(agent_ids),
agent_session_identifier: Some(AgentSessionIdentifier::Signin),
actor_id: None,
webhook_app_slug: None,
api_auth_app_slug: None,
expires_in: None,
}
}
pub fn expires_in(mut self, expires_in: u64) -> Self {
self.expires_in = Some(expires_in);
self
}
pub fn agent_session_identifier(mut self, mode: AgentSessionIdentifier) -> Self {
self.agent_session_identifier = Some(mode);
self
}
pub fn actor_id(mut self, actor_id: impl Into<String>) -> Self {
self.actor_id = Some(actor_id.into());
self
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SessionTicketResponse {
pub ticket: String,
pub expires_at: i64,
}