tftsr-devops_investigation/src-tauri/src/mcp/models.rs
Shaun Arman a970f171a8 fix(mcp): add env encryption to store layer
- Add env_config field to McpServer, CreateMcpServerRequest, UpdateMcpServerRequest
- Encrypt env_config using encrypt_token() on create/update
- Decrypt env_config in get_server_env_config() helper function
- Handle clearing env_config with empty string
- Add comprehensive tests:
  - test_env_config_encrypted_at_rest()
  - test_update_env_config()
  - test_clear_env_config_with_empty_string()
  - test_env_config_none_preserves_existing()

All tests passing. Follows same encryption pattern as auth_value.
2026-06-01 08:22:29 -05:00

92 lines
2.9 KiB
Rust

use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpServer {
pub id: String,
pub name: String,
pub url: String,
pub transport_type: String,
pub transport_config: String,
pub auth_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_value: Option<String>,
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_discovered_at: Option<String>,
pub discovery_status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub discovery_error: Option<String>,
pub created_at: String,
pub updated_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub env_config: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpTool {
pub id: String,
pub server_id: String,
pub name: String,
pub tool_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub parameters: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpResource {
pub id: String,
pub server_id: String,
pub uri: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpServerStatus {
pub server_id: String,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
pub tool_count: usize,
pub resource_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_discovered_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateMcpServerRequest {
pub name: String,
pub url: String,
pub transport_type: String,
pub transport_config: String,
pub auth_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_value: Option<String>,
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub env_config: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateMcpServerRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transport_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transport_config: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env_config: Option<String>,
}