#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(dead_code)]
pub enum LogLevel {
Info,
Success,
Warn,
Error
}
#[derive(Debug, Clone)]
pub struct LogEntry {
pub level: LogLevel,
pub text: String
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AccountInfo {
pub login: String,
pub account_id: i64,
pub balance: String,
pub status: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct ServerSummary {
pub id: i32,
pub name: String,
pub status: String,
pub cpu: i32,
pub ram_mb: i32,
pub disk_gb: i32,
pub ip: String,
pub location: String
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct DatabaseSummary {
pub id: i32,
pub name: String,
pub status: String,
pub engine: String,
pub size_mb: i64,
#[serde(default)]
pub disk_used_mb: i64,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub location: String,
#[serde(default)]
pub port: i32,
#[serde(default)]
pub public_ip: String,
#[serde(default)]
pub local_ip: String,
#[serde(default)]
pub preset_id: i32,
#[serde(default)]
pub hash_type: String,
#[serde(default)]
pub local_only: bool,
#[serde(default)]
pub config: Vec<(String, String)>
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct S3Summary {
pub id: i32,
pub name: String,
pub region: String,
pub size_kb: i64,
pub object_count: i64
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct K8sSummary {
pub id: i32,
pub name: String,
pub status: String,
pub version: String,
pub cpu: i32,
pub ram_mb: i32,
pub disk_gb: i32
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ProjectSummary {
pub id: i32,
pub name: String,
pub server_count: i32,
pub database_count: i32,
pub bucket_count: i32,
pub cluster_count: i32,
pub balancer_count: i32,
pub dedicated_count: i32,
pub app_count: i32
}
impl ProjectSummary {
#[must_use]
pub const fn resource_count(&self) -> i32 {
self.server_count
+ self.database_count
+ self.bucket_count
+ self.cluster_count
+ self.balancer_count
+ self.dedicated_count
+ self.app_count
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct BalancerSummary {
pub id: i32,
pub name: String,
pub status: String,
pub ip: String,
pub location: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct RegistrySummary {
pub id: i32,
pub name: String,
pub disk_used: i64,
pub disk_size: i64
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct DomainSummary {
pub id: i32,
pub name: String,
pub status: String,
pub auto_prolong: bool
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct FirewallSummary {
pub id: String,
pub name: String,
pub policy: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct FloatingIpSummary {
pub id: String,
pub ip: String,
pub status: String,
pub server_name: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct ImageSummary {
pub id: String,
pub name: String,
pub size_mb: i64,
pub status: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct NetworkDriveSummary {
pub id: String,
pub name: String,
pub size_gb: i64,
pub status: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct VpcSummary {
pub id: String,
pub name: String,
pub subnet: String,
pub location: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct DedicatedServerSummary {
pub id: i32,
pub name: String,
pub status: String,
pub cpu: String,
pub ram: String,
pub disk: String,
pub ip: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct MailSummary {
pub name: String,
pub owner: String,
pub comment: String
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AppSummary {
pub id: i32,
pub name: String,
pub status: String,
pub ip: String,
pub location: String,
pub app_type: String,
pub framework: String,
pub language: String,
pub branch: String,
pub commit: String,
pub auto_deploy: bool,
pub comment: String,
pub domains: Vec<String>,
#[serde(default)]
pub repository: String,
#[serde(default)]
pub repo_url: String,
#[serde(default)]
pub repo_private: bool,
#[serde(default)]
pub provider: String,
#[serde(default)]
pub env_version: String,
#[serde(default)]
pub env_count: usize,
#[serde(default)]
pub preset_id: i64,
#[serde(default)]
pub index_dir: String,
#[serde(default)]
pub build_cmd: String,
#[serde(default)]
pub run_cmd: String,
#[serde(default)]
pub cfg_cpu: i64,
#[serde(default)]
pub cfg_ram_mb: i64,
#[serde(default)]
pub cfg_bandwidth: i64,
#[serde(default)]
pub cfg_freq: String,
#[serde(default)]
pub cfg_disk_type: String,
#[serde(default)]
pub disk_used_mb: i64,
#[serde(default)]
pub disk_size_mb: i64,
#[serde(default)]
pub started_at: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct AiAgentSummary {
pub id: i32,
pub name: String,
pub status: String,
pub tokens_used: i64,
pub tokens_total: i64
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[allow(dead_code)]
pub struct KnowledgeBaseSummary {
pub id: i32,
pub name: String,
pub document_count: i32,
pub status: String
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct DashboardData {
pub account: AccountInfo,
pub servers: Vec<ServerSummary>,
pub databases: Vec<DatabaseSummary>,
pub s3_storages: Vec<S3Summary>,
pub k8s_clusters: Vec<K8sSummary>,
pub projects: Vec<ProjectSummary>,
pub balancers: Vec<BalancerSummary>,
pub registries: Vec<RegistrySummary>,
pub domains: Vec<DomainSummary>,
pub firewalls: Vec<FirewallSummary>,
pub floating_ips: Vec<FloatingIpSummary>,
pub images: Vec<ImageSummary>,
pub network_drives: Vec<NetworkDriveSummary>,
pub vpcs: Vec<VpcSummary>,
pub dedicated_servers: Vec<DedicatedServerSummary>,
pub mails: Vec<MailSummary>,
pub apps: Vec<AppSummary>,
pub ai_agents: Vec<AiAgentSummary>,
pub knowledge_bases: Vec<KnowledgeBaseSummary>,
pub ssh_keys: Vec<String>,
pub finances: Vec<String>,
pub error_message: Option<String>,
pub status_message: Option<String>,
pub load_errors: Vec<String>
}
impl DashboardData {
#[must_use]
pub fn from_app(app: &super::App) -> Self {
Self {
account: app.account.clone(),
servers: app.servers.clone(),
databases: app.databases.clone(),
s3_storages: app.s3_storages.clone(),
k8s_clusters: app.k8s_clusters.clone(),
projects: app.projects.clone(),
balancers: app.balancers.clone(),
registries: app.registries.clone(),
domains: app.domains.clone(),
firewalls: app.firewalls.clone(),
floating_ips: app.floating_ips.clone(),
images: app.images.clone(),
network_drives: app.network_drives.clone(),
vpcs: app.vpcs.clone(),
dedicated_servers: app.dedicated_servers.clone(),
mails: app.mails.clone(),
apps: app.apps.clone(),
ai_agents: app.ai_agents.clone(),
knowledge_bases: app.knowledge_bases.clone(),
ssh_keys: app.ssh_keys.clone(),
finances: app.finances.clone(),
error_message: None,
status_message: None,
load_errors: Vec::new()
}
}
}