Skip to main content

client_core/
constants.rs

1/// Docker相关路径常量
2pub mod docker {
3    use std::path::{Path, PathBuf};
4
5    /// docker-compose.yml文件名
6    pub const COMPOSE_FILE_NAME: &str = "docker-compose.yml";
7
8    /// Docker工作目录名
9    pub const DOCKER_DIR_NAME: &str = "docker";
10
11    /// 环境变量文件名
12    pub const ENV_FILE_NAME: &str = ".env";
13
14    /// Docker镜像目录名
15    pub const IMAGES_DIR_NAME: &str = "images";
16
17    /// 数据目录名
18    pub const DATA_DIR_NAME: &str = "data";
19
20    /// 应用程序目录名
21    pub const APP_DIR_NAME: &str = "app";
22
23    /// 配置目录名
24    pub const CONFIG_DIR_NAME: &str = "config";
25
26    /// 上传目录名
27    pub const UPLOAD_DIR_NAME: &str = "upload";
28
29    /// 备份目录名
30    pub const BACKUPS_DIR_NAME: &str = "backups";
31
32    /// 日志目录名
33    pub const LOGS_DIR_NAME: &str = "logs";
34
35    /// 服务数据目录结构
36    pub mod data_dirs {
37        /// MySQL数据目录
38        pub const MYSQL_DATA_DIR: &str = "data/mysql";
39
40        /// Redis数据目录
41        pub const REDIS_DATA_DIR: &str = "data/redis";
42
43        /// Milvus数据目录
44        pub const MILVUS_DATA_DIR: &str = "data/milvus";
45
46        /// Milvus数据存储目录
47        pub const MILVUS_DATA_STORAGE_DIR: &str = "data/milvus/data";
48
49        /// Milvus etcd数据目录
50        pub const MILVUS_ETCD_DATA_DIR: &str = "data/milvus/etcd";
51    }
52
53    /// 服务日志目录结构
54    pub mod log_dirs {
55        /// Agent日志目录
56        pub const AGENT_LOG_DIR: &str = "logs/agent";
57
58        /// MySQL日志目录
59        pub const MYSQL_LOG_DIR: &str = "logs/mysql";
60
61        /// Redis日志目录
62        pub const REDIS_LOG_DIR: &str = "logs/redis";
63
64        /// Milvus日志目录
65        pub const MILVUS_LOG_DIR: &str = "logs/milvus";
66    }
67
68    /// 服务端口相关常量
69    pub mod ports {
70        /// 默认frontend服务端口
71        pub const DEFAULT_FRONTEND_PORT: u16 = 80;
72
73        /// 默认backend服务端口
74        pub const DEFAULT_BACKEND_PORT: u16 = 8080;
75
76        /// 默认backend调试端口
77        pub const DEFAULT_BACKEND_DEBUG_PORT: u16 = 5005;
78
79        /// 默认MySQL端口
80        pub const DEFAULT_MYSQL_PORT: u16 = 3306;
81
82        /// 默认Redis端口
83        pub const DEFAULT_REDIS_PORT: u16 = 6379;
84
85        /// 默认Milvus端口
86        pub const DEFAULT_MILVUS_PORT: u16 = 19530;
87
88        /// 默认Milvus管理端口
89        pub const DEFAULT_MILVUS_MANAGEMENT_PORT: u16 = 9091;
90
91        /// 默认etcd端口
92        pub const DEFAULT_ETCD_PORT: u16 = 2379;
93
94        /// 默认MinIO API端口
95        pub const DEFAULT_MINIO_API_PORT: u16 = 9000;
96
97        /// 默认MinIO控制台端口
98        pub const DEFAULT_MINIO_CONSOLE_PORT: u16 = 9001;
99
100        /// 默认日志平台端口
101        pub const DEFAULT_LOG_PLATFORM_PORT: u16 = 8097;
102
103        /// 默认Quickwit端口
104        pub const DEFAULT_QUICKWIT_PORT: u16 = 7280;
105
106        /// 默认Quickwit管理端口
107        pub const DEFAULT_QUICKWIT_ADMIN_PORT: u16 = 7281;
108
109        /// 默认视频分析主服务端口
110        pub const DEFAULT_VIDEO_ANALYSIS_MASTER_PORT: u16 = 8989;
111
112        /// 默认MCP代理端口
113        pub const DEFAULT_MCP_PROXY_PORT: u16 = 8020;
114    }
115
116    /// 环境变量名称常量
117    pub mod env_vars {
118        /// Frontend服务主机端口环境变量
119        pub const FRONTEND_HOST_PORT: &str = "FRONTEND_HOST_PORT";
120
121        /// Backend应用端口环境变量
122        pub const APP_PORT: &str = "APP_PORT";
123
124        /// Backend调试端口环境变量
125        pub const APP_DEBUG_PORT: &str = "APP_DEBUG_PORT";
126
127        /// MySQL端口环境变量
128        pub const MYSQL_PORT: &str = "MYSQL_PORT";
129
130        /// Redis端口环境变量
131        pub const REDIS_PORT: &str = "REDIS_PORT";
132
133        /// Milvus端口环境变量
134        pub const MILVUS_PORT: &str = "MILVUS_PORT";
135
136        /// 日志平台主机端口环境变量
137        pub const LOG_PLATFORM_HOST_PORT: &str = "LOG_PLATFORM_HOST_PORT";
138
139        /// 视频分析主服务主机端口环境变量
140        pub const VIDEO_ANALYSIS_MASTER_HOST_PORT: &str = "VIDEO_ANALYSIS_MASTER_HOST_PORT";
141
142        /// 主应用端口环境变量(视频分析)
143        pub const MASTER_APP_PORT: &str = "MASTER_APP_PORT";
144    }
145
146    /// Docker socket路径(跨平台支持)
147    /// Unix/Linux/macOS: /var/run/docker.sock
148    /// Windows: \\.\pipe\docker_engine
149    #[cfg(unix)]
150    pub const DOCKER_SOCKET_PATH: &str = "/var/run/docker.sock";
151
152    #[cfg(windows)]
153    pub const DOCKER_SOCKET_PATH: &str = r"\\.\pipe\docker_engine";
154
155    /// 获取默认的docker-compose.yml文件路径(跨平台)
156    pub fn get_compose_file_path() -> PathBuf {
157        Path::new(".").join(DOCKER_DIR_NAME).join(COMPOSE_FILE_NAME)
158    }
159
160    /// 获取Docker工作目录路径(跨平台)
161    pub fn get_docker_work_dir() -> PathBuf {
162        Path::new(".").join(DOCKER_DIR_NAME)
163    }
164
165    /// 获取默认compose文件路径的字符串表示(用于向后兼容)
166    pub fn get_compose_file_path_str() -> String {
167        get_compose_file_path().to_string_lossy().to_string()
168    }
169
170    /// 获取环境变量文件路径(跨平台)
171    pub fn get_env_file_path() -> PathBuf {
172        Path::new(".").join(DOCKER_DIR_NAME).join(ENV_FILE_NAME)
173    }
174
175    /// 获取环境变量文件路径的字符串表示(用于向后兼容)
176    pub fn get_env_file_path_str() -> String {
177        get_env_file_path().to_string_lossy().to_string()
178    }
179
180    /// 获取Docker镜像目录路径(跨平台)
181    pub fn get_images_dir_path() -> PathBuf {
182        Path::new(".").join(DOCKER_DIR_NAME).join(IMAGES_DIR_NAME)
183    }
184
185    /// 获取数据目录路径(跨平台)
186    pub fn get_data_dir_path() -> PathBuf {
187        Path::new(".").join(DOCKER_DIR_NAME).join(DATA_DIR_NAME)
188    }
189
190    /// 获取应用程序目录路径(跨平台)
191    pub fn get_app_dir_path() -> PathBuf {
192        Path::new(".").join(DOCKER_DIR_NAME).join(APP_DIR_NAME)
193    }
194
195    /// 获取配置目录路径(跨平台)
196    pub fn get_config_dir_path() -> PathBuf {
197        Path::new(".").join(DOCKER_DIR_NAME).join(CONFIG_DIR_NAME)
198    }
199
200    /// 获取上传目录路径(跨平台)
201    pub fn get_upload_dir_path() -> PathBuf {
202        Path::new(".").join(DOCKER_DIR_NAME).join(UPLOAD_DIR_NAME)
203    }
204
205    /// 获取备份目录路径(跨平台)
206    pub fn get_backups_dir_path() -> PathBuf {
207        Path::new(".").join(DOCKER_DIR_NAME).join(BACKUPS_DIR_NAME)
208    }
209
210    /// 获取日志目录路径(跨平台)
211    pub fn get_logs_dir_path() -> PathBuf {
212        Path::new(".").join(DOCKER_DIR_NAME).join(LOGS_DIR_NAME)
213    }
214
215    /// 获取所有必需的Docker服务目录列表
216    pub fn get_all_required_directories() -> Vec<&'static str> {
217        vec![
218            DATA_DIR_NAME,
219            APP_DIR_NAME,
220            data_dirs::MYSQL_DATA_DIR,
221            data_dirs::REDIS_DATA_DIR,
222            data_dirs::MILVUS_DATA_DIR,
223            data_dirs::MILVUS_DATA_STORAGE_DIR,
224            data_dirs::MILVUS_ETCD_DATA_DIR,
225            LOGS_DIR_NAME,
226            log_dirs::AGENT_LOG_DIR,
227            log_dirs::MYSQL_LOG_DIR,
228            log_dirs::REDIS_LOG_DIR,
229            log_dirs::MILVUS_LOG_DIR,
230            UPLOAD_DIR_NAME,
231            CONFIG_DIR_NAME,
232            BACKUPS_DIR_NAME,
233        ]
234    }
235
236    /// 升级时需要保留的目录列表(不会被删除或覆盖)
237    ///
238    /// 这些目录包含用户数据或运行时生成的重要文件,在升级过程中必须保护:
239    /// - `upload`: 用户上传的文件
240    /// - `project_workspace`: 项目工作空间
241    /// - `project_zips`: 项目压缩包
242    /// - `project_nginx`: Nginx配置
243    /// - `project_init`: 项目初始化文件
244    /// - `uv_cache`: UV缓存目录
245    /// - `data`: 数据库和持久化数据
246    pub const EXCLUDE_DIRS: [&str; 8] = [
247        "upload",
248        "project_workspace",
249        "computer-project-workspace",
250        "project_zips",
251        "project_nginx",
252        "project_init",
253        "uv_cache",
254        "data",
255    ];
256}
257
258/// API服务相关常量
259pub mod api {
260    use crate::environment::Environment;
261    use url::Url;
262
263    /// 环境变量名称:自定义 API 服务器地址
264    pub const NUWAX_API_BASE_URL_ENV: &str = "NUWAX_API_BASE_URL";
265
266    /// Docker版本JSON URL环境变量(最高优先级,允许自定义docker版本JSON地址)
267    pub const NUWAX_API_DOCKER_VERSION_URL_ENV: &str = "NUWAX_API_DOCKER_VERSION_URL";
268
269    /// 生产环境API服务器地址
270    const PRODUCTION_BASE_URL: &str = "https://api-version.nuwax.com";
271
272    /// 测试环境API服务器地址
273    const TESTING_BASE_URL: &str = "http://192.168.32.226:3000";
274
275    /// 验证 URL 格式是否有效(使用 url crate)
276    fn is_valid_url(url: &str) -> bool {
277        Url::parse(url).is_ok_and(|parsed_url| {
278            // 确保是 http 或 https 协议
279            matches!(parsed_url.scheme(), "http" | "https")
280        })
281    }
282
283    /// 获取当前环境的API基础URL
284    ///
285    /// 优先级顺序:
286    /// 1. NUWAX_API_BASE_URL 环境变量(最高优先级,允许自定义服务器地址)
287    /// 2. NUWAX_CLI_ENV=test/testing → TESTING_BASE_URL
288    /// 3. 默认 → PRODUCTION_BASE_URL
289    ///
290    /// 当使用自定义 URL 时,会记录 info 级别日志。
291    /// 如果自定义 URL 格式无效,会记录 warn 级别日志并回退到原有逻辑。
292    ///
293    /// # Examples
294    /// ```
295    /// use client_core::constants::api::get_base_url;
296    ///
297    /// // 获取当前配置的 base URL
298    /// let url = get_base_url();
299    /// println!("API Base URL: {}", url);
300    /// ```
301    pub fn get_base_url() -> String {
302        // 优先检查自定义 API 服务器地址
303        if let Ok(custom_url) = std::env::var(NUWAX_API_BASE_URL_ENV) {
304            if is_valid_url(&custom_url) {
305                tracing::info!("Using custom API server: {}", custom_url);
306                return custom_url;
307            } else {
308                tracing::warn!(
309                    "Invalid NUWAX_API_BASE_URL: '{}'. Expected to start with http:// or https://. Falling back to environment mode.",
310                    custom_url
311                );
312            }
313        }
314
315        // 回退到原有逻辑
316        match Environment::from_env() {
317            Environment::Test => TESTING_BASE_URL.to_string(),
318            Environment::Production => PRODUCTION_BASE_URL.to_string(),
319        }
320    }
321
322    /// 获取当前环境的API基础URL(动态分配)
323    ///
324    /// 此函数是 get_base_url() 的别名,保持向后兼容
325    pub fn get_base_url_dynamic() -> String {
326        get_base_url()
327    }
328
329    /// 获取生产环境API基础URL(用于特殊场景)
330    pub const fn get_production_base_url() -> &'static str {
331        PRODUCTION_BASE_URL
332    }
333
334    /// 获取测试环境API基础URL(用于特殊场景)
335    pub const fn get_testing_base_url() -> &'static str {
336        TESTING_BASE_URL
337    }
338
339    /// API版本前缀
340    pub const VERSION_PREFIX: &str = "/api/v1";
341
342    /// API端点路径
343    pub mod endpoints {
344        /// 客户端注册端点
345        pub const CLIENT_REGISTER: &str = "/api/v1/clients/register";
346
347        /// 公告获取端点
348        pub const ANNOUNCEMENTS: &str = "/api/v1/clients/announcements";
349
350        /// Docker版本检查端点
351        pub const DOCKER_CHECK_VERSION: &str = "/api/v1/docker/checkVersion";
352
353        /// Docker版本列表更新端点
354        pub const DOCKER_UPDATE_VERSION_LIST: &str = "/api/v1/docker/updateVersionList";
355
356        /// Docker版本获取端点 (用于降级fallback)
357        pub const DOCKER_UPGRADE_VERSION_LATEST: &str =
358            "/api/v1/docker/upgrade/versions/latest.json";
359
360        /// Docker版本JSON (OSS) - 生产环境
361        pub const DOCKER_VERSION_OSS_PROD: &str = "https://nuwa-packages.oss-rg-china-mainland.aliyuncs.com/docker-version/prod/latest.json";
362
363        /// Docker版本JSON (OSS) - 测试/发布环境
364        pub const DOCKER_VERSION_OSS_BETA: &str = "https://nuwa-packages.oss-rg-china-mainland.aliyuncs.com/docker-version/beta/latest.json";
365
366        /// Docker完整服务包下载端点
367        pub const DOCKER_DOWNLOAD_FULL: &str =
368            "/api/v1/clients/downloads/docker/services/full/latest";
369
370        /// 客户端自升级历史端点
371        pub const CLIENT_SELF_UPGRADE_HISTORY: &str = "/api/v1/clients/self-upgrade-history";
372
373        /// 服务升级历史端点(包含占位符)
374        pub const SERVICE_UPGRADE_HISTORY: &str =
375            "/api/v1/clients/services/{service_name}/upgrade-history";
376
377        /// 遥测数据上报端点
378        pub const TELEMETRY: &str = "/api/v1/clients/telemetry";
379
380        /// OpenAPI文档端点
381        pub const OPENAPI_DOCS: &str = "/api-docs/openapi.json";
382    }
383
384    /// HTTP相关常量
385    pub mod http {
386        /// 默认连接超时时间(秒)
387        pub const DEFAULT_TIMEOUT: u64 = 30;
388
389        /// 默认重试次数
390        pub const DEFAULT_RETRY_COUNT: u8 = 3;
391
392        /// User-Agent头
393        pub const USER_AGENT: &str = "nuwax-cli/1.0";
394    }
395
396    #[cfg(test)]
397    mod tests {
398        use super::*;
399
400        #[test]
401        fn test_get_base_url_production_default() {
402            unsafe {
403                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
404                std::env::remove_var("NUWAX_CLI_ENV");
405            }
406            assert_eq!(get_base_url(), PRODUCTION_BASE_URL);
407        }
408
409        #[test]
410        fn test_get_base_url_testing_env() {
411            unsafe {
412                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
413                std::env::set_var("NUWAX_CLI_ENV", "testing");
414            }
415            assert_eq!(get_base_url(), TESTING_BASE_URL);
416            unsafe {
417                std::env::remove_var("NUWAX_CLI_ENV");
418            }
419        }
420
421        #[test]
422        fn test_is_valid_url() {
423            assert!(is_valid_url("http://example.com"));
424            assert!(is_valid_url("https://example.com"));
425            assert!(is_valid_url("http://localhost:8080"));
426            assert!(is_valid_url("https://192.168.1.1:3000"));
427            assert!(!is_valid_url("ftp://example.com"));
428            assert!(!is_valid_url("example.com"));
429            assert!(!is_valid_url(""));
430        }
431    }
432}
433
434/// 备份相关常量
435pub mod backup {
436    use std::path::{Path, PathBuf};
437
438    /// 数据目录名
439    pub const DATA_DIR_NAME: &str = "data";
440
441    /// 备份目录名
442    pub const BACKUP_DIR_NAME: &str = "backups";
443
444    /// 备份文件前缀
445    pub const BACKUP_PREFIX: &str = "backup_";
446
447    /// 备份文件扩展名
448    pub const BACKUP_EXTENSION: &str = ".zip";
449
450    /// 最小有效ZIP文件大小(字节)
451    pub const MIN_ZIP_FILE_SIZE: u64 = 100;
452
453    /// 获取默认备份目录路径(跨平台)
454    pub fn get_backup_dir() -> PathBuf {
455        Path::new(".").join(DATA_DIR_NAME).join(BACKUP_DIR_NAME)
456    }
457
458    /// 获取默认备份存储目录(用于配置)
459    pub fn get_default_storage_dir() -> PathBuf {
460        Path::new(".").join(BACKUP_DIR_NAME)
461    }
462}
463
464/// 更新升级相关常量
465pub mod upgrade {
466    use std::path::{Path, PathBuf};
467
468    /// 数据目录名
469    pub const DATA_DIR_NAME: &str = "data";
470
471    /// 下载目录名
472    pub const DOWNLOAD_DIR_NAME: &str = "downloads";
473
474    /// 临时目录名
475    pub const TEMP_DIR_NAME: &str = "temp";
476
477    /// 默认更新包文件名
478    pub const DEFAULT_UPDATE_PACKAGE: &str = "update.zip";
479
480    /// 获取下载文件保存目录(跨平台)
481    pub fn get_download_dir() -> PathBuf {
482        Path::new(".").join(DATA_DIR_NAME).join(DOWNLOAD_DIR_NAME)
483    }
484
485    /// 获取临时解压目录(跨平台)
486    pub fn get_temp_extract_dir() -> PathBuf {
487        Path::new(".").join(DATA_DIR_NAME).join(TEMP_DIR_NAME)
488    }
489}
490
491/// 文件格式相关常量
492pub mod file_format {
493    /// ZIP文件扩展名
494    pub const ZIP_EXTENSION: &str = ".zip";
495
496    /// TOML配置文件扩展名
497    pub const TOML_EXTENSION: &str = ".toml";
498
499    /// 数据库文件扩展名
500    pub const DB_EXTENSION: &str = ".db";
501
502    /// ZIP文件魔术字节 - 本地文件头
503    pub const ZIP_MAGIC_LOCAL_HEADER: [u8; 4] = [0x50, 0x4B, 0x03, 0x04];
504
505    /// ZIP文件魔术字节 - 中央目录结束记录
506    pub const ZIP_MAGIC_CENTRAL_DIR_END: [u8; 4] = [0x50, 0x4B, 0x05, 0x06];
507
508    /// ZIP文件魔术字节 - 数据描述符
509    pub const ZIP_MAGIC_DATA_DESCRIPTOR: [u8; 4] = [0x50, 0x4B, 0x07, 0x08];
510
511    /// ZIP文件通用魔术字节前缀(PK)
512    pub const ZIP_MAGIC_PK_PREFIX: [u8; 2] = [0x50, 0x4B];
513}
514
515/// 超时时间常量(秒)
516pub mod timeout {
517    /// Docker服务停止等待超时时间
518    pub const SERVICE_STOP_TIMEOUT: u64 = 30;
519
520    /// Docker服务启动等待超时时间
521    pub const SERVICE_START_TIMEOUT: u64 = 60;
522
523    /// 升级部署时服务启动等待超时时间(更长,因为部署后启动需要更多时间)
524    pub const DEPLOY_START_TIMEOUT: u64 = 90;
525
526    /// Docker服务状态检查间隔时间
527    pub const SERVICE_CHECK_INTERVAL: u64 = 2;
528
529    /// Docker服务健康检查超时时间(用于启动后的健康检查)
530    pub const HEALTH_CHECK_TIMEOUT: u64 = 180;
531
532    /// Docker服务健康检查间隔时间
533    pub const HEALTH_CHECK_INTERVAL: u64 = 5;
534
535    /// 服务重启间隔等待时间
536    pub const RESTART_INTERVAL: u64 = 2;
537
538    /// 服务验证前等待时间(让服务稳定)
539    pub const SERVICE_VERIFY_WAIT: u64 = 5;
540}
541
542/// SQL 相关常量
543pub mod sql {
544    /// SQL 差异执行默认重试次数
545    pub const DEFAULT_RETRY_COUNT: u8 = 3;
546
547    /// MySQL 容器默认映射端口
548    pub const DEFAULT_MYSQL_CONTAINER_PORT: u16 = 13306;
549
550    /// MySQL 服务等待超时(秒)- 用于等待 MySQL 容器就绪
551    pub const MYSQL_READY_TIMEOUT: u64 = 60;
552
553    /// 其他服务启动等待超时(秒)- SQL 升级后等待 Java 等服务
554    pub const OTHER_SERVICES_TIMEOUT: u64 = 120;
555
556    /// 临时 SQL 目录名
557    pub const TEMP_SQL_DIR: &str = "temp_sql";
558
559    /// 旧版本 SQL 文件名
560    pub const OLD_SQL_FILE: &str = "init_mysql_old.sql";
561
562    /// 新版本 SQL 文件名
563    pub const NEW_SQL_FILE: &str = "init_mysql_new.sql";
564
565    /// 差异 SQL 文件名
566    pub const DIFF_SQL_FILE: &str = "upgrade_diff.sql";
567
568    /// 当前 SQL 文件路径
569    pub const CURRENT_SQL_PATH: &str = "docker/config/init_mysql.sql";
570
571    /// 关键升级文件列表(增量升级时必须强制更新)
572    /// 这些文件对于数据库升级至关重要,必须始终保持最新版本
573    pub const CRITICAL_UPGRADE_FILES: &[&str] = &[
574        "config/init_mysql.sql",
575        // 未来可以添加其他关键文件,例如:
576        // "config/schema.json",
577        // "config/migration_rules.yml",
578    ];
579
580    /// 目录清理最大重试次数
581    pub const MAX_CLEANUP_ATTEMPTS: usize = 3;
582}
583
584/// 网络相关常量
585pub mod network {
586    /// 本地回环地址
587    pub const LOCALHOST_IPV4: &str = "127.0.0.1";
588
589    /// 本地回环地址(IPv6)
590    pub const LOCALHOST_IPV6: &str = "::1";
591
592    /// 所有网络接口地址
593    pub const ALL_INTERFACES: &str = "0.0.0.0";
594
595    /// Docker端口映射格式示例
596    pub const PORT_MAPPING_EXAMPLES: [&str; 3] = ["8080:80", "127.0.0.1:8080:80", "8080:80/tcp"];
597}
598
599/// 日志和输出相关常量
600pub mod logging {
601    use std::path::{Path, PathBuf};
602
603    /// 默认日志级别
604    pub const DEFAULT_LOG_LEVEL: &str = "info";
605
606    /// 数据目录名
607    pub const DATA_DIR_NAME: &str = "data";
608
609    /// 日志目录名
610    pub const LOG_DIR_NAME: &str = "logs";
611
612    /// 获取日志文件保存目录(跨平台)
613    pub fn get_log_dir() -> PathBuf {
614        Path::new(".").join(DATA_DIR_NAME).join(LOG_DIR_NAME)
615    }
616}
617
618/// Cron任务相关常量
619pub mod cron {
620    /// 默认自动备份cron表达式(每天凌晨2点)
621    pub const DEFAULT_BACKUP_CRON: &str = "0 2 * * *";
622
623    /// Cron表达式字段数量
624    pub const CRON_FIELDS_COUNT: usize = 5;
625}
626
627/// 应用配置相关常量
628pub mod config {
629    use std::path::{Path, PathBuf};
630
631    /// 数据目录名
632    pub const DATA_DIR_NAME: &str = "data";
633
634    /// 配置文件名
635    pub const CONFIG_FILE_NAME: &str = "config.toml";
636
637    /// 数据库文件名
638    pub const DATABASE_FILE_NAME: &str = "duck_client.db";
639
640    /// 缓存目录名
641    pub const CACHE_DIR_NAME: &str = "cacheDuckData";
642
643    /// 下载目录名
644    pub const DOWNLOAD_DIR_NAME: &str = "download";
645
646    /// 获取默认配置文件路径(跨平台)
647    pub fn get_config_file_path() -> PathBuf {
648        Path::new(".").join(DATA_DIR_NAME).join(CONFIG_FILE_NAME)
649    }
650
651    /// 获取当前环境的配置文件路径
652    ///
653    /// 根据环境变量 NUWAX_CLI_ENV 返回对应的配置文件路径:
654    /// - Production: data/config.toml
655    /// - Testing: data/config-test.toml
656    pub fn get_config_file_path_for_env() -> PathBuf {
657        let config_file_name = match crate::environment::Environment::from_env() {
658            crate::environment::Environment::Test => "config-test.toml",
659            crate::environment::Environment::Production => CONFIG_FILE_NAME,
660        };
661        Path::new(".").join(DATA_DIR_NAME).join(config_file_name)
662    }
663
664    /// 获取环境特定的配置文件名
665    pub fn get_config_file_name_for_env() -> &'static str {
666        match crate::environment::Environment::from_env() {
667            crate::environment::Environment::Test => "config-test.toml",
668            crate::environment::Environment::Production => CONFIG_FILE_NAME,
669        }
670    }
671
672    /// 获取数据库文件路径(跨平台)
673    pub fn get_database_path() -> PathBuf {
674        Path::new(".").join(DATA_DIR_NAME).join(DATABASE_FILE_NAME)
675    }
676
677    /// 获取当前环境的数据库文件路径
678    ///
679    /// 根据环境变量 NUWAX_CLI_ENV 返回对应的数据库文件路径:
680    /// - Production: data/duck_client.db
681    /// - Testing: data/duck_client_test.db
682    pub fn get_database_path_for_env() -> PathBuf {
683        let db_file_name = match crate::environment::Environment::from_env() {
684            crate::environment::Environment::Test => "duck_client_test.db",
685            crate::environment::Environment::Production => DATABASE_FILE_NAME,
686        };
687        Path::new(".").join(DATA_DIR_NAME).join(db_file_name)
688    }
689
690    /// 获取默认缓存目录(跨平台)
691    pub fn get_default_cache_dir() -> PathBuf {
692        Path::new(".").join(CACHE_DIR_NAME)
693    }
694
695    /// 获取默认下载目录(跨平台)
696    pub fn get_default_download_dir() -> PathBuf {
697        get_default_cache_dir().join(DOWNLOAD_DIR_NAME)
698    }
699}
700
701/// 技术版本信息常量
702pub mod version {
703    /// 版本信息(仅技术版本,项目信息在 nuwax-cli 中定义)
704    pub mod version_info {
705        /// 核心库版本(自动同步)
706        pub const CORE_VERSION: &str = env!("CARGO_PKG_VERSION");
707
708        /// Docker 服务版本(默认,手动维护)
709        pub const DEFAULT_DOCKER_SERVICE_VERSION: &str = "0.0.1";
710
711        /// 最小支持的 Docker 版本
712        pub const MIN_DOCKER_VERSION: &str = "20.10.0";
713
714        /// 最小支持的 Docker Compose 版本
715        pub const MIN_COMPOSE_VERSION: &str = "2.0.0";
716
717        /// API 版本
718        pub const API_VERSION: &str = "v1";
719
720        /// 配置格式版本
721        pub const CONFIG_FORMAT_VERSION: &str = "1.0";
722
723        /// 数据库架构版本
724        pub const DATABASE_SCHEMA_VERSION: &str = "1.0";
725    }
726}
727
728/// 更新检查相关常量
729pub mod updates {
730    /// 默认检查频率
731    pub const DEFAULT_CHECK_FREQUENCY: &str = "daily";
732}