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}