use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionConfig {
#[serde(default)]
pub host: Option<String>,
#[serde(default)]
pub port: Option<u16>,
#[serde(default)]
pub protocol: Option<String>,
#[serde(default)]
pub base_path: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedResponse<T> {
pub data: Vec<T>,
#[serde(default)]
pub links: Option<PaginationLinks>,
#[serde(default)]
pub meta: Option<PaginationMeta>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginationLinks {
pub first: Option<String>,
pub last: Option<String>,
pub prev: Option<String>,
pub next: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginationMeta {
pub current_page: u32,
pub from: Option<u32>,
pub last_page: u32,
#[serde(default)]
pub links: Option<Vec<serde_json::Value>>, pub path: Option<String>,
pub per_page: u32,
pub to: Option<u32>,
pub total: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceResponse<T> {
pub data: T,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Peer {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub connection: Option<ConnectionConfig>,
#[serde(default)]
pub protocol: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub authentication: Option<String>,
#[serde(default)]
pub tags: Option<Vec<String>>,
#[serde(default)]
pub timeout_secs: Option<u32>,
#[serde(default)]
pub max_retries: Option<u32>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Target {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub connection: Option<ConnectionConfig>,
#[serde(default)]
pub protocol: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub authentication: Option<String>,
#[serde(default)]
pub tags: Option<Vec<String>>,
#[serde(default)]
pub timeout_secs: Option<u32>,
#[serde(default)]
pub max_retries: Option<u32>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Gateway {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub enabled: Option<bool>,
#[serde(default)]
pub pipelines_path: Option<String>,
#[serde(default)]
pub transforms_path: Option<String>,
#[serde(default)]
pub jwks_cache_duration_hours: Option<u32>,
#[serde(default)]
pub management_enabled: Option<bool>,
#[serde(default)]
pub management_base_path: Option<String>,
#[serde(default)]
pub management_network_id: Option<String>,
#[serde(default)]
pub dns: Option<Vec<String>>,
#[serde(default)]
pub settings: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthorizedByInfo {
pub id: String,
pub name: String,
pub email: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Service {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Endpoint {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub service_id: Option<String>,
#[serde(default)]
pub peer_ref: Option<String>,
#[serde(default)]
pub connection: Option<ConnectionConfig>,
#[serde(default)]
pub authentication: Option<String>,
#[serde(default)]
pub path: Option<String>,
#[serde(default)]
pub methods: Option<Vec<String>>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub options: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Backend {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub service_id: Option<String>,
#[serde(default)]
pub target_ref: Option<String>,
#[serde(default)]
pub connection: Option<ConnectionConfig>,
#[serde(default)]
pub authentication: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub timeout_seconds: Option<u32>,
#[serde(default)]
pub max_retries: Option<u32>,
#[serde(default)]
pub options: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Pipeline {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub description: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub networks: Option<Vec<String>>,
#[serde(default)]
pub endpoints: Option<serde_json::Value>,
#[serde(default)]
pub backends: Option<serde_json::Value>,
#[serde(default)]
pub middleware: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Middleware {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub middleware_type: String,
#[serde(default)]
pub authentication: Option<String>,
#[serde(default)]
pub options: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transform {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: String,
#[serde(default)]
pub options: Option<TransformOptions>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransformOptions {
pub instructions: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PolicyRules(pub Vec<String>);
impl PolicyRules {
pub fn new(rules: Vec<String>) -> Self {
PolicyRules(rules)
}
pub fn rules(&self) -> &[String] {
&self.0
}
pub fn into_inner(self) -> Vec<String> {
self.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Rule {
#[serde(rename = "type")]
pub resource_type: String,
pub id: String,
pub code: String,
#[serde(default)]
pub name: Option<String>,
pub rule_type: String,
pub team_id: String,
pub gateway_id: String,
#[serde(default)]
pub weight: Option<u32>,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub options: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Policy {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub enabled: u32,
pub team_id: String,
pub gateway_id: String,
#[serde(default)]
pub rules: Option<PolicyRules>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Network {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
pub enable_wireguard: bool,
#[serde(default)]
pub interface: Option<String>,
#[serde(default, alias = "http")]
pub tcp_config: Option<TcpConfig>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TcpConfig {
pub bind_address: Option<String>,
pub bind_port: Option<u16>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Runbeam {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: String,
pub name: String,
pub team_id: String,
pub gateway_id: Option<String>,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub cloud_api_base_url: Option<String>,
#[serde(default)]
pub poll_interval_secs: Option<u32>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Authentication {
#[serde(rename = "type")]
pub resource_type: String,
#[serde(default)]
pub id: Option<String>,
pub code: Option<String>,
pub name: String,
pub team_id: Option<String>,
pub gateway_id: Option<String>,
pub method: String,
#[serde(default)]
pub options: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GatewayConfiguration {
pub gateway: Gateway,
#[serde(default)]
pub peers: Vec<Peer>,
#[serde(default)]
pub targets: Vec<Target>,
#[serde(default)]
pub services: Vec<Service>,
#[serde(default)]
pub endpoints: Vec<Endpoint>,
#[serde(default)]
pub backends: Vec<Backend>,
#[serde(default)]
pub pipelines: Vec<Pipeline>,
#[serde(default)]
pub middlewares: Vec<Middleware>,
#[serde(default)]
pub transforms: Vec<Transform>,
#[serde(default)]
pub policies: Vec<Policy>,
#[serde(default)]
pub rules: Vec<Rule>,
#[serde(default)]
pub networks: Vec<Network>,
#[serde(default)]
pub runbeam: Option<Runbeam>,
#[serde(default)]
pub authentications: Vec<Authentication>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Change {
pub id: String,
#[serde(default)]
pub status: Option<String>,
#[serde(rename = "type")]
pub resource_type: String,
pub gateway_id: String,
#[serde(default)]
pub pipeline_id: Option<String>,
#[serde(default)]
pub toml_config: Option<String>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
pub created_at: String,
#[serde(default)]
pub acknowledged_at: Option<String>,
#[serde(default)]
pub applied_at: Option<String>,
#[serde(default)]
pub failed_at: Option<String>,
#[serde(default)]
pub error_message: Option<String>,
#[serde(default)]
pub error_details: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BaseUrlResponse {
pub base_url: String,
#[serde(default)]
pub changes_path: Option<String>,
#[serde(default)]
pub full_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcknowledgeChangesRequest {
pub change_ids: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangeFailedRequest {
pub error: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcknowledgeChangesResponse {
pub acknowledged: Vec<String>,
pub failed: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangeStatusResponse {
pub success: bool,
pub message: String,
}
pub type ChangeAppliedResponse = ChangeStatusResponse;
pub type ChangeFailedResponse = ChangeStatusResponse;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeshTokenRequest {
pub mesh_id: String,
pub destination_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeshTokenResponse {
pub token: String,
pub expires_at: String,
pub mesh_id: String,
}