admin_config/
database_config.rs

1//! 数据库配置模块
2//!
3//! 提供多种数据库的连接配置,包括:
4//! - MongoDB(文档数据库)
5//! - MySQL(关系型数据库)
6//! - PostgreSQL(关系型数据库)
7//! - SQLite(嵌入式数据库)
8//! - Redis(缓存数据库)
9//! - Neo4j(图数据库)
10//! - Qdrant(向量数据库)
11//! - SeekDB(多模型数据库)
12
13use serde::{Deserialize, Serialize};
14
15/// 数据库连接 URL 转换 trait
16///
17/// 用于将配置对象转换为标准连接字符串
18pub trait ToConnectionUrl {
19    /// 生成数据库连接 URL
20    fn to_connection_url(&self) -> String;
21}
22
23/// 数据库配置集合
24///
25/// 包含所有支持的数据库配置
26#[derive(Debug, Clone, Serialize, Deserialize, Default)]
27pub struct DatabaseConfig {
28    /// MongoDB 配置
29    #[serde(default)]
30    pub mongodb: MongoDbConfig,
31    /// MySQL 配置
32    #[serde(default)]
33    pub mysql: MySqlConfig,
34    /// PostgreSQL 配置
35    #[serde(default)]
36    pub postgresql: PostgreSqlConfig,
37    /// SQLite 配置
38    #[serde(default)]
39    pub sqlite: SqliteConfig,
40    /// Qdrant 配置
41    #[serde(default)]
42    pub qdrant: QdrantConfig,
43    /// SeekDB 配置
44    #[serde(default)]
45    pub seekdb: SeekDbConfig,
46    /// Neo4j 图数据库配置
47    #[serde(default)]
48    pub neo4j: Neo4jConfig,
49}
50
51/// MongoDB 数据库配置
52///
53/// # 示例
54///
55/// ```rust
56/// use admin_config::{MongoDbConfig, ToConnectionUrl};
57///
58/// let config = MongoDbConfig {
59///     host: "localhost".to_string(),
60///     port: 27017,
61///     database: "mydb".to_string(),
62///     username: "admin".to_string(),
63///     password: "password".to_string(),
64///     max_pool_size: 10,
65///     connect_timeout: 10,
66/// };
67///
68/// let url = config.to_connection_url();
69/// assert!(url.contains("mongodb://"));
70/// ```
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct MongoDbConfig {
73    /// 主机地址
74    pub host: String,
75    /// 端口
76    pub port: u16,
77    /// 数据库名
78    pub database: String,
79    /// 用户名
80    pub username: String,
81    /// 密码
82    pub password: String,
83    /// 最大连接池大小
84    pub max_pool_size: u32,
85    /// 连接超时时间(秒)
86    pub connect_timeout: u64,
87}
88
89impl Default for MongoDbConfig {
90    fn default() -> Self {
91        Self {
92            host: "localhost".to_string(),
93            port: 27017,
94            database: String::new(),
95            username: String::new(),
96            password: String::new(),
97            max_pool_size: 10,
98            connect_timeout: 10,
99        }
100    }
101}
102
103impl ToConnectionUrl for MongoDbConfig {
104    fn to_connection_url(&self) -> String {
105        if self.username.is_empty() {
106            format!("mongodb://{}:{}/{}", self.host, self.port, self.database)
107        } else {
108            format!(
109                "mongodb://{}:{}@{}:{}/{}",
110                self.username, self.password, self.host, self.port, self.database
111            )
112        }
113    }
114}
115
116/// MySQL 数据库配置
117///
118/// # 示例
119///
120/// ```rust
121/// use admin_config::{MySqlConfig, ToConnectionUrl};
122///
123/// let config = MySqlConfig::default();
124/// assert_eq!(config.port, 3306);
125/// ```
126#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct MySqlConfig {
128    /// 主机地址
129    pub host: String,
130    /// 端口
131    pub port: u16,
132    /// 数据库名
133    pub database: String,
134    /// 用户名
135    pub username: String,
136    /// 密码
137    pub password: String,
138    /// 最大连接池大小
139    pub max_pool_size: u32,
140    /// 连接超时时间(秒)
141    pub connect_timeout: u64,
142}
143
144impl Default for MySqlConfig {
145    fn default() -> Self {
146        Self {
147            host: "localhost".to_string(),
148            port: 3306,
149            database: String::new(),
150            username: String::new(),
151            password: String::new(),
152            max_pool_size: 10,
153            connect_timeout: 10,
154        }
155    }
156}
157
158impl ToConnectionUrl for MySqlConfig {
159    fn to_connection_url(&self) -> String {
160        let mut url = "mysql://".to_string();
161
162        if !self.username.is_empty() && !self.password.is_empty() {
163            url.push_str(&format!("{}:{}@", self.username, self.password));
164        } else if !self.username.is_empty() {
165            url.push_str(&format!("{}@", self.username));
166        }
167
168        url.push_str(&format!("{}:{}", self.host, self.port));
169
170        if !self.database.is_empty() {
171            url.push_str(&format!("/{}", self.database));
172        }
173
174        url
175    }
176}
177
178/// PostgreSQL 数据库配置
179///
180/// # 示例
181///
182/// ```rust
183/// use admin_config::{PostgreSqlConfig, ToConnectionUrl};
184///
185/// let config = PostgreSqlConfig::default();
186/// assert_eq!(config.port, 5432);
187/// ```
188#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct PostgreSqlConfig {
190    /// 主机地址
191    pub host: String,
192    /// 端口
193    pub port: u16,
194    /// 数据库名
195    pub database: String,
196    /// 用户名
197    pub username: String,
198    /// 密码
199    pub password: String,
200    /// 最大连接池大小
201    pub max_pool_size: u32,
202    /// 连接超时时间(秒)
203    pub connect_timeout: u64,
204}
205
206impl Default for PostgreSqlConfig {
207    fn default() -> Self {
208        Self {
209            host: "localhost".to_string(),
210            port: 5432,
211            database: String::new(),
212            username: String::new(),
213            password: String::new(),
214            max_pool_size: 10,
215            connect_timeout: 10,
216        }
217    }
218}
219
220impl ToConnectionUrl for PostgreSqlConfig {
221    fn to_connection_url(&self) -> String {
222        let mut url = "postgresql://".to_string();
223
224        if !self.username.is_empty() && !self.password.is_empty() {
225            url.push_str(&format!("{}:{}@", self.username, self.password));
226        } else if !self.username.is_empty() {
227            url.push_str(&format!("{}@", self.username));
228        }
229
230        url.push_str(&format!("{}:{}", self.host, self.port));
231
232        if !self.database.is_empty() {
233            url.push_str(&format!("/{}", self.database));
234        }
235
236        url
237    }
238}
239
240/// SQLite 数据库配置
241///
242/// # 示例
243///
244/// ```rust
245/// use admin_config::{SqliteConfig, ToConnectionUrl};
246///
247/// let config = SqliteConfig::default();
248/// assert_eq!(config.path, "./data.db");
249/// ```
250#[derive(Debug, Clone, Serialize, Deserialize)]
251pub struct SqliteConfig {
252    /// 数据库文件路径
253    pub path: String,
254    /// 最大连接池大小
255    pub max_pool_size: u32,
256}
257
258impl Default for SqliteConfig {
259    fn default() -> Self {
260        Self {
261            path: "./data.db".to_string(),
262            max_pool_size: 10,
263        }
264    }
265}
266
267impl ToConnectionUrl for SqliteConfig {
268    fn to_connection_url(&self) -> String {
269        format!("sqlite://{}", self.path)
270    }
271}
272
273/// Qdrant 向量数据库配置
274///
275/// # 示例
276///
277/// ```rust
278/// use admin_config::{QdrantConfig, ToConnectionUrl};
279///
280/// let config = QdrantConfig::default();
281/// assert_eq!(config.port, 6333);
282/// ```
283#[derive(Debug, Clone, Serialize, Deserialize)]
284pub struct QdrantConfig {
285    /// 主机地址
286    pub host: String,
287    /// 端口
288    pub port: u16,
289    /// API Key
290    pub api_key: Option<String>,
291    /// 是否使用 HTTPS
292    pub use_https: bool,
293}
294
295impl Default for QdrantConfig {
296    fn default() -> Self {
297        Self {
298            host: "localhost".to_string(),
299            port: 6333,
300            api_key: None,
301            use_https: false,
302        }
303    }
304}
305
306impl ToConnectionUrl for QdrantConfig {
307    fn to_connection_url(&self) -> String {
308        let protocol = if self.use_https { "https" } else { "http" };
309        format!("{}://{}:{}", protocol, self.host, self.port)
310    }
311}
312
313/// SeekDB 多模型数据库配置
314///
315/// # 示例
316///
317/// ```rust
318/// use admin_config::{SeekDbConfig, ToConnectionUrl};
319///
320/// let config = SeekDbConfig::default();
321/// assert_eq!(config.port, 2881);
322/// ```
323#[derive(Debug, Clone, Serialize, Deserialize)]
324pub struct SeekDbConfig {
325    /// 主机地址
326    pub host: String,
327    /// 端口
328    pub port: u16,
329    /// 数据库名
330    pub database: String,
331    /// 用户名
332    pub username: String,
333    /// 密码
334    pub password: String,
335}
336
337impl Default for SeekDbConfig {
338    fn default() -> Self {
339        Self {
340            host: "localhost".to_string(),
341            port: 2881,
342            database: String::new(),
343            username: String::new(),
344            password: String::new(),
345        }
346    }
347}
348
349impl ToConnectionUrl for SeekDbConfig {
350    fn to_connection_url(&self) -> String {
351        if self.username.is_empty() {
352            format!("mysql://{}:{}/{}", self.host, self.port, self.database)
353        } else {
354            format!(
355                "mysql://{}:{}@{}:{}/{}",
356                self.username, self.password, self.host, self.port, self.database
357            )
358        }
359    }
360}
361
362/// Neo4j 图数据库配置
363///
364/// # 示例
365///
366/// ```rust
367/// use admin_config::{Neo4jConfig, ToConnectionUrl};
368///
369/// let config = Neo4jConfig::default();
370/// assert_eq!(config.port, 7687);
371/// assert_eq!(config.database, "neo4j");
372/// ```
373#[derive(Debug, Clone, Serialize, Deserialize)]
374pub struct Neo4jConfig {
375    /// 主机地址
376    pub host: String,
377    /// 端口
378    pub port: u16,
379    /// 数据库名
380    pub database: String,
381    /// 用户名
382    pub username: String,
383    /// 密码
384    pub password: String,
385    /// 是否使用加密连接
386    pub use_encryption: bool,
387    /// 最大连接池大小
388    pub max_pool_size: u32,
389    /// 连接超时时间(秒)
390    pub connect_timeout: u64,
391}
392
393impl Default for Neo4jConfig {
394    fn default() -> Self {
395        Self {
396            host: "localhost".to_string(),
397            port: 7687,
398            database: "neo4j".to_string(),
399            username: String::new(),
400            password: String::new(),
401            use_encryption: false,
402            max_pool_size: 10,
403            connect_timeout: 10,
404        }
405    }
406}
407
408impl ToConnectionUrl for Neo4jConfig {
409    fn to_connection_url(&self) -> String {
410        let protocol = if self.use_encryption { "neo4j+s" } else { "neo4j" };
411
412        if self.username.is_empty() {
413            format!("{}://{}:{}", protocol, self.host, self.port)
414        } else {
415            format!(
416                "{}://{}:{}@{}:{}",
417                protocol, self.username, self.password, self.host, self.port
418            )
419        }
420    }
421}