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).map_or(false, |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    /// // 生产环境(默认)
298    /// let url = get_base_url(); // "https://api-version.nuwax.com"
299    ///
300    /// // 测试环境(需要设置环境变量)
301    /// std::env::set_var("NUWAX_CLI_ENV", "testing");
302    /// let url = get_base_url(); // "http://192.168.32.226:3000"
303    ///
304    /// // 自定义服务器地址(最高优先级)
305    /// std::env::set_var("NUWAX_API_BASE_URL", "http://localhost:8080");
306    /// let url = get_base_url(); // "http://localhost:8080"
307    /// ```
308    pub fn get_base_url() -> String {
309        // 优先检查自定义 API 服务器地址
310        if let Ok(custom_url) = std::env::var(NUWAX_API_BASE_URL_ENV) {
311            if is_valid_url(&custom_url) {
312                tracing::info!("Using custom API server: {}", custom_url);
313                return custom_url;
314            } else {
315                tracing::warn!(
316                    "Invalid NUWAX_API_BASE_URL: '{}'. Expected to start with http:// or https://. Falling back to environment mode.",
317                    custom_url
318                );
319            }
320        }
321
322        // 回退到原有逻辑
323        match Environment::from_env() {
324            Environment::Test => TESTING_BASE_URL.to_string(),
325            Environment::Production => PRODUCTION_BASE_URL.to_string(),
326        }
327    }
328
329    /// 获取当前环境的API基础URL(动态分配)
330    ///
331    /// 此函数是 get_base_url() 的别名,保持向后兼容
332    pub fn get_base_url_dynamic() -> String {
333        get_base_url()
334    }
335
336    /// 获取生产环境API基础URL(用于特殊场景)
337    pub const fn get_production_base_url() -> &'static str {
338        PRODUCTION_BASE_URL
339    }
340
341    /// 获取测试环境API基础URL(用于特殊场景)
342    pub const fn get_testing_base_url() -> &'static str {
343        TESTING_BASE_URL
344    }
345
346    /// API版本前缀
347    pub const VERSION_PREFIX: &str = "/api/v1";
348
349    /// API端点路径
350    pub mod endpoints {
351        /// 客户端注册端点
352        pub const CLIENT_REGISTER: &str = "/api/v1/clients/register";
353
354        /// 公告获取端点
355        pub const ANNOUNCEMENTS: &str = "/api/v1/clients/announcements";
356
357        /// Docker版本检查端点
358        pub const DOCKER_CHECK_VERSION: &str = "/api/v1/docker/checkVersion";
359
360        /// Docker版本列表更新端点
361        pub const DOCKER_UPDATE_VERSION_LIST: &str = "/api/v1/docker/updateVersionList";
362
363        /// Docker版本获取端点 (用于降级fallback)
364        pub const DOCKER_UPGRADE_VERSION_LATEST: &str = "/api/v1/docker/upgrade/versions/latest.json";
365
366        /// Docker版本JSON (OSS) - 生产环境
367        pub const DOCKER_VERSION_OSS_PROD: &str = "https://nuwa-packages.oss-rg-china-mainland.aliyuncs.com/docker-version/prod/latest.json";
368
369        /// Docker版本JSON (OSS) - 测试/发布环境
370        pub const DOCKER_VERSION_OSS_BETA: &str = "https://nuwa-packages.oss-rg-china-mainland.aliyuncs.com/docker-version/beta/latest.json";
371
372        /// Docker完整服务包下载端点
373        pub const DOCKER_DOWNLOAD_FULL: &str =
374            "/api/v1/clients/downloads/docker/services/full/latest";
375
376        /// 客户端自升级历史端点
377        pub const CLIENT_SELF_UPGRADE_HISTORY: &str = "/api/v1/clients/self-upgrade-history";
378
379        /// 服务升级历史端点(包含占位符)
380        pub const SERVICE_UPGRADE_HISTORY: &str =
381            "/api/v1/clients/services/{service_name}/upgrade-history";
382
383        /// 遥测数据上报端点
384        pub const TELEMETRY: &str = "/api/v1/clients/telemetry";
385
386        /// OpenAPI文档端点
387        pub const OPENAPI_DOCS: &str = "/api-docs/openapi.json";
388    }
389
390    /// HTTP相关常量
391    pub mod http {
392        /// 默认连接超时时间(秒)
393        pub const DEFAULT_TIMEOUT: u64 = 30;
394
395        /// 默认重试次数
396        pub const DEFAULT_RETRY_COUNT: u8 = 3;
397
398        /// User-Agent头
399        pub const USER_AGENT: &str = "nuwax-cli/1.0";
400    }
401
402    #[cfg(test)]
403    mod tests {
404        use super::*;
405
406        #[test]
407        fn test_get_base_url_production_default() {
408            unsafe {
409                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
410                std::env::remove_var("NUWAX_CLI_ENV");
411            }
412            assert_eq!(get_base_url(), PRODUCTION_BASE_URL);
413        }
414
415        #[test]
416        fn test_get_base_url_testing_env() {
417            unsafe {
418                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
419                std::env::set_var("NUWAX_CLI_ENV", "testing");
420            }
421            assert_eq!(get_base_url(), TESTING_BASE_URL);
422            unsafe {
423                std::env::remove_var("NUWAX_CLI_ENV");
424            }
425        }
426
427        #[test]
428        fn test_custom_url_overrides_env() {
429            unsafe {
430                std::env::set_var(NUWAX_API_BASE_URL_ENV, "http://custom.example.com:8080");
431                std::env::set_var("NUWAX_CLI_ENV", "testing");
432            }
433            assert_eq!(get_base_url(), "http://custom.example.com:8080");
434            unsafe {
435                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
436                std::env::remove_var("NUWAX_CLI_ENV");
437            }
438        }
439
440        #[test]
441        fn test_invalid_custom_url_falls_back() {
442            unsafe {
443                std::env::set_var(NUWAX_API_BASE_URL_ENV, "ftp://invalid.com");
444                std::env::set_var("NUWAX_CLI_ENV", "testing");
445            }
446            assert_eq!(get_base_url(), TESTING_BASE_URL);
447            unsafe {
448                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
449                std::env::remove_var("NUWAX_CLI_ENV");
450            }
451        }
452
453        #[test]
454        fn test_is_valid_url() {
455            assert!(is_valid_url("http://example.com"));
456            assert!(is_valid_url("https://example.com"));
457            assert!(is_valid_url("http://localhost:8080"));
458            assert!(is_valid_url("https://192.168.1.1:3000"));
459            assert!(!is_valid_url("ftp://example.com"));
460            assert!(!is_valid_url("example.com"));
461            assert!(!is_valid_url(""));
462        }
463
464        #[test]
465        fn test_empty_custom_url_falls_back() {
466            unsafe {
467                std::env::set_var(NUWAX_API_BASE_URL_ENV, "");
468                std::env::set_var("NUWAX_CLI_ENV", "testing");
469            }
470            assert_eq!(get_base_url(), TESTING_BASE_URL);
471            unsafe {
472                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
473                std::env::remove_var("NUWAX_CLI_ENV");
474            }
475        }
476
477        #[test]
478        fn test_custom_url_with_path() {
479            unsafe {
480                std::env::set_var(NUWAX_API_BASE_URL_ENV, "http://example.com/api/v1");
481            }
482            assert_eq!(get_base_url(), "http://example.com/api/v1");
483            unsafe {
484                std::env::remove_var(NUWAX_API_BASE_URL_ENV);
485            }
486        }
487    }
488}
489
490/// 备份相关常量
491pub mod backup {
492    use std::path::{Path, PathBuf};
493
494    /// 数据目录名
495    pub const DATA_DIR_NAME: &str = "data";
496
497    /// 备份目录名
498    pub const BACKUP_DIR_NAME: &str = "backups";
499
500    /// 备份文件前缀
501    pub const BACKUP_PREFIX: &str = "backup_";
502
503    /// 备份文件扩展名
504    pub const BACKUP_EXTENSION: &str = ".zip";
505
506    /// 最小有效ZIP文件大小(字节)
507    pub const MIN_ZIP_FILE_SIZE: u64 = 100;
508
509    /// 获取默认备份目录路径(跨平台)
510    pub fn get_backup_dir() -> PathBuf {
511        Path::new(".").join(DATA_DIR_NAME).join(BACKUP_DIR_NAME)
512    }
513
514    /// 获取默认备份存储目录(用于配置)
515    pub fn get_default_storage_dir() -> PathBuf {
516        Path::new(".").join(BACKUP_DIR_NAME)
517    }
518}
519
520/// 更新升级相关常量
521pub mod upgrade {
522    use std::path::{Path, PathBuf};
523
524    /// 数据目录名
525    pub const DATA_DIR_NAME: &str = "data";
526
527    /// 下载目录名
528    pub const DOWNLOAD_DIR_NAME: &str = "downloads";
529
530    /// 临时目录名
531    pub const TEMP_DIR_NAME: &str = "temp";
532
533    /// 默认更新包文件名
534    pub const DEFAULT_UPDATE_PACKAGE: &str = "update.zip";
535
536    /// 获取下载文件保存目录(跨平台)
537    pub fn get_download_dir() -> PathBuf {
538        Path::new(".").join(DATA_DIR_NAME).join(DOWNLOAD_DIR_NAME)
539    }
540
541    /// 获取临时解压目录(跨平台)
542    pub fn get_temp_extract_dir() -> PathBuf {
543        Path::new(".").join(DATA_DIR_NAME).join(TEMP_DIR_NAME)
544    }
545}
546
547/// 文件格式相关常量
548pub mod file_format {
549    /// ZIP文件扩展名
550    pub const ZIP_EXTENSION: &str = ".zip";
551
552    /// TOML配置文件扩展名
553    pub const TOML_EXTENSION: &str = ".toml";
554
555    /// 数据库文件扩展名
556    pub const DB_EXTENSION: &str = ".db";
557
558    /// ZIP文件魔术字节 - 本地文件头
559    pub const ZIP_MAGIC_LOCAL_HEADER: [u8; 4] = [0x50, 0x4B, 0x03, 0x04];
560
561    /// ZIP文件魔术字节 - 中央目录结束记录
562    pub const ZIP_MAGIC_CENTRAL_DIR_END: [u8; 4] = [0x50, 0x4B, 0x05, 0x06];
563
564    /// ZIP文件魔术字节 - 数据描述符
565    pub const ZIP_MAGIC_DATA_DESCRIPTOR: [u8; 4] = [0x50, 0x4B, 0x07, 0x08];
566
567    /// ZIP文件通用魔术字节前缀(PK)
568    pub const ZIP_MAGIC_PK_PREFIX: [u8; 2] = [0x50, 0x4B];
569}
570
571/// 超时时间常量(秒)
572pub mod timeout {
573    /// Docker服务停止等待超时时间
574    pub const SERVICE_STOP_TIMEOUT: u64 = 30;
575
576    /// Docker服务启动等待超时时间
577    pub const SERVICE_START_TIMEOUT: u64 = 60;
578
579    /// 升级部署时服务启动等待超时时间(更长,因为部署后启动需要更多时间)
580    pub const DEPLOY_START_TIMEOUT: u64 = 90;
581
582    /// Docker服务状态检查间隔时间
583    pub const SERVICE_CHECK_INTERVAL: u64 = 2;
584
585    /// Docker服务健康检查超时时间(用于启动后的健康检查)
586    pub const HEALTH_CHECK_TIMEOUT: u64 = 180;
587
588    /// Docker服务健康检查间隔时间
589    pub const HEALTH_CHECK_INTERVAL: u64 = 5;
590
591    /// 服务重启间隔等待时间
592    pub const RESTART_INTERVAL: u64 = 2;
593
594    /// 服务验证前等待时间(让服务稳定)
595    pub const SERVICE_VERIFY_WAIT: u64 = 5;
596}
597
598/// SQL 相关常量
599pub mod sql {
600    /// SQL 差异执行默认重试次数
601    pub const DEFAULT_RETRY_COUNT: u8 = 3;
602
603    /// MySQL 容器默认映射端口
604    pub const DEFAULT_MYSQL_CONTAINER_PORT: u16 = 13306;
605
606    /// MySQL 服务等待超时(秒)- 用于等待 MySQL 容器就绪
607    pub const MYSQL_READY_TIMEOUT: u64 = 60;
608
609    /// 其他服务启动等待超时(秒)- SQL 升级后等待 Java 等服务
610    pub const OTHER_SERVICES_TIMEOUT: u64 = 120;
611
612    /// 临时 SQL 目录名
613    pub const TEMP_SQL_DIR: &str = "temp_sql";
614
615    /// 旧版本 SQL 文件名
616    pub const OLD_SQL_FILE: &str = "init_mysql_old.sql";
617
618    /// 新版本 SQL 文件名
619    pub const NEW_SQL_FILE: &str = "init_mysql_new.sql";
620
621    /// 差异 SQL 文件名
622    pub const DIFF_SQL_FILE: &str = "upgrade_diff.sql";
623
624    /// 当前 SQL 文件路径
625    pub const CURRENT_SQL_PATH: &str = "docker/config/init_mysql.sql";
626
627    /// 关键升级文件列表(增量升级时必须强制更新)
628    /// 这些文件对于数据库升级至关重要,必须始终保持最新版本
629    pub const CRITICAL_UPGRADE_FILES: &[&str] = &[
630        "config/init_mysql.sql",
631        // 未来可以添加其他关键文件,例如:
632        // "config/schema.json",
633        // "config/migration_rules.yml",
634    ];
635
636    /// 目录清理最大重试次数
637    pub const MAX_CLEANUP_ATTEMPTS: usize = 3;
638}
639
640/// 网络相关常量
641pub mod network {
642    /// 本地回环地址
643    pub const LOCALHOST_IPV4: &str = "127.0.0.1";
644
645    /// 本地回环地址(IPv6)
646    pub const LOCALHOST_IPV6: &str = "::1";
647
648    /// 所有网络接口地址
649    pub const ALL_INTERFACES: &str = "0.0.0.0";
650
651    /// Docker端口映射格式示例
652    pub const PORT_MAPPING_EXAMPLES: [&str; 3] = ["8080:80", "127.0.0.1:8080:80", "8080:80/tcp"];
653}
654
655/// 日志和输出相关常量
656pub mod logging {
657    use std::path::{Path, PathBuf};
658
659    /// 默认日志级别
660    pub const DEFAULT_LOG_LEVEL: &str = "info";
661
662    /// 数据目录名
663    pub const DATA_DIR_NAME: &str = "data";
664
665    /// 日志目录名
666    pub const LOG_DIR_NAME: &str = "logs";
667
668    /// 获取日志文件保存目录(跨平台)
669    pub fn get_log_dir() -> PathBuf {
670        Path::new(".").join(DATA_DIR_NAME).join(LOG_DIR_NAME)
671    }
672}
673
674/// Cron任务相关常量
675pub mod cron {
676    /// 默认自动备份cron表达式(每天凌晨2点)
677    pub const DEFAULT_BACKUP_CRON: &str = "0 2 * * *";
678
679    /// Cron表达式字段数量
680    pub const CRON_FIELDS_COUNT: usize = 5;
681}
682
683/// 应用配置相关常量
684pub mod config {
685    use std::path::{Path, PathBuf};
686
687    /// 数据目录名
688    pub const DATA_DIR_NAME: &str = "data";
689
690    /// 配置文件名
691    pub const CONFIG_FILE_NAME: &str = "config.toml";
692
693    /// 数据库文件名
694    pub const DATABASE_FILE_NAME: &str = "duck_client.db";
695
696    /// 缓存目录名
697    pub const CACHE_DIR_NAME: &str = "cacheDuckData";
698
699    /// 下载目录名
700    pub const DOWNLOAD_DIR_NAME: &str = "download";
701
702    /// 获取默认配置文件路径(跨平台)
703    pub fn get_config_file_path() -> PathBuf {
704        Path::new(".").join(DATA_DIR_NAME).join(CONFIG_FILE_NAME)
705    }
706
707    /// 获取当前环境的配置文件路径
708    ///
709    /// 根据环境变量 NUWAX_CLI_ENV 返回对应的配置文件路径:
710    /// - Production: data/config.toml
711    /// - Testing: data/config-test.toml
712    pub fn get_config_file_path_for_env() -> PathBuf {
713        let config_file_name = match crate::environment::Environment::from_env() {
714            crate::environment::Environment::Test => "config-test.toml",
715            crate::environment::Environment::Production => CONFIG_FILE_NAME,
716        };
717        Path::new(".").join(DATA_DIR_NAME).join(config_file_name)
718    }
719
720    /// 获取环境特定的配置文件名
721    pub fn get_config_file_name_for_env() -> &'static str {
722        match crate::environment::Environment::from_env() {
723            crate::environment::Environment::Test => "config-test.toml",
724            crate::environment::Environment::Production => CONFIG_FILE_NAME,
725        }
726    }
727
728    /// 获取数据库文件路径(跨平台)
729    pub fn get_database_path() -> PathBuf {
730        Path::new(".").join(DATA_DIR_NAME).join(DATABASE_FILE_NAME)
731    }
732
733    /// 获取当前环境的数据库文件路径
734    ///
735    /// 根据环境变量 NUWAX_CLI_ENV 返回对应的数据库文件路径:
736    /// - Production: data/duck_client.db
737    /// - Testing: data/duck_client_test.db
738    pub fn get_database_path_for_env() -> PathBuf {
739        let db_file_name = match crate::environment::Environment::from_env() {
740            crate::environment::Environment::Test => "duck_client_test.db",
741            crate::environment::Environment::Production => DATABASE_FILE_NAME,
742        };
743        Path::new(".").join(DATA_DIR_NAME).join(db_file_name)
744    }
745
746    /// 获取默认缓存目录(跨平台)
747    pub fn get_default_cache_dir() -> PathBuf {
748        Path::new(".").join(CACHE_DIR_NAME)
749    }
750
751    /// 获取默认下载目录(跨平台)
752    pub fn get_default_download_dir() -> PathBuf {
753        get_default_cache_dir().join(DOWNLOAD_DIR_NAME)
754    }
755}
756
757/// 技术版本信息常量
758pub mod version {
759    /// 版本信息(仅技术版本,项目信息在 nuwax-cli 中定义)
760    pub mod version_info {
761        /// 核心库版本(自动同步)
762        pub const CORE_VERSION: &str = env!("CARGO_PKG_VERSION");
763
764        /// Docker 服务版本(默认,手动维护)
765        pub const DEFAULT_DOCKER_SERVICE_VERSION: &str = "0.0.1";
766
767        /// 最小支持的 Docker 版本
768        pub const MIN_DOCKER_VERSION: &str = "20.10.0";
769
770        /// 最小支持的 Docker Compose 版本
771        pub const MIN_COMPOSE_VERSION: &str = "2.0.0";
772
773        /// API 版本
774        pub const API_VERSION: &str = "v1";
775
776        /// 配置格式版本
777        pub const CONFIG_FORMAT_VERSION: &str = "1.0";
778
779        /// 数据库架构版本
780        pub const DATABASE_SCHEMA_VERSION: &str = "1.0";
781    }
782}
783
784/// 更新检查相关常量
785pub mod updates {
786    /// 默认检查频率
787    pub const DEFAULT_CHECK_FREQUENCY: &str = "daily";
788}