use std::collections::HashMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
use crate::connections::{
AuthScope, Connection, ConnectionAuth, ConnectionKind, OAuthProviderConfig,
};
pub use crate::connections::OAuthProviderConfig as ApiOAuthProviderConfig;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct ConnectionConfig {
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub secret_keys: Vec<String>,
#[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
pub extra_auth_params: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TokenResponse {
pub access_token: String,
pub token_type: String,
pub expires_at: Option<chrono::DateTime<chrono::Utc>>,
pub scopes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct OAuthCallbackResponse {
pub connected: bool,
pub scopes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct OAuthCallbackRequest {
pub code: String,
pub state: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct DiscoverOAuthRequest {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum McpProbeResponse {
Ok {
tool_count: usize,
tool_names: Vec<String>,
},
Error {
message: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct DiscoverOAuthResponse {
pub provider_config: OAuthProviderConfig,
pub suggested_scopes: Vec<String>,
pub supports_dcr: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct CreateConnectionRequest {
pub name: String,
pub auth_scope: AuthScope,
pub auth: ConnectionAuth,
#[serde(default)]
pub secrets: HashMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub oauth_client_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub oauth_client_secret: Option<String>,
#[serde(default)]
pub skill_content: Option<String>,
#[serde(default)]
pub kind: ConnectionKind,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UpdateConnectionRequest {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub auth: Option<ConnectionAuth>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct CreateConnectionResponse {
pub connection: Connection,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct AuthorizeConnectionRequest {
#[serde(default)]
pub extra_auth_params: HashMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub redirect_uri: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct AuthorizeConnectionResponse {
pub connection_id: Uuid,
pub auth_url: String,
pub setup_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum MySessionStatus {
Connected {
#[serde(default, skip_serializing_if = "Option::is_none")]
expires_at: Option<chrono::DateTime<chrono::Utc>>,
#[serde(default)]
scopes: Vec<String>,
},
NotConnected,
NotApplicable,
}