portkey/
models.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Server {
7    pub id: Uuid,
8    pub name: String,
9    pub host: String,
10    pub port: u16,
11    pub username: String,
12    pub password: String,
13    pub description: Option<String>,
14    pub created_at: DateTime<Utc>,
15    pub updated_at: DateTime<Utc>,
16    pub tags: Vec<String>,
17}
18
19impl Server {
20    pub fn new(
21        name: String,
22        host: String,
23        port: u16,
24        username: String,
25        password: String,
26        description: Option<String>,
27    ) -> Self {
28        let now = Utc::now();
29        Self {
30            id: Uuid::new_v4(),
31            name,
32            host,
33            port,
34            username,
35            password,
36            description,
37            created_at: now,
38            updated_at: now,
39            tags: Vec::new(),
40        }
41    }
42
43    pub fn ssh_command(&self) -> String {
44        format!("ssh {}@{} -p {}", self.username, self.host, self.port)
45    }
46
47    pub fn update_fields(
48        &mut self,
49        name: String,
50        host: String,
51        port: u16,
52        username: String,
53        password: String,
54        description: Option<String>,
55    ) {
56        self.name = name;
57        self.host = host;
58        self.port = port;
59        self.username = username;
60        self.password = password;
61        self.description = description;
62        self.updated_at = Utc::now();
63    }
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct VaultData {
68    pub servers: Vec<Server>,
69    pub version: String,
70}
71
72impl VaultData {
73    pub fn new() -> Self {
74        Self {
75            servers: Vec::new(),
76            version: "1.0.0".to_string(),
77        }
78    }
79
80    pub fn add_server(&mut self, server: Server) {
81        self.servers.push(server);
82    }
83
84    pub fn remove_server(&mut self, id: &Uuid) -> bool {
85        let len = self.servers.len();
86        self.servers.retain(|s| &s.id != id);
87        self.servers.len() != len
88    }
89
90    pub fn find_server(&self, id: &Uuid) -> Option<&Server> {
91        self.servers.iter().find(|s| &s.id == id)
92    }
93
94    pub fn list_servers(&self) -> &Vec<Server> {
95        &self.servers
96    }
97
98    pub fn replace_server(&mut self, server: Server) -> bool {
99        if let Some(pos) = self.servers.iter().position(|s| s.id == server.id) {
100            self.servers[pos] = server;
101            true
102        } else {
103            false
104        }
105    }
106}