sa2kit 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/UniversalFileService-CEZRJ87g.d.mts +727 -0
  2. package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
  3. package/dist/api/index.d.mts +248 -0
  4. package/dist/api/index.d.ts +248 -0
  5. package/dist/api/index.js +294 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/index.mjs +290 -0
  8. package/dist/api/index.mjs.map +1 -0
  9. package/dist/auth/client/index.d.mts +52 -3
  10. package/dist/auth/client/index.d.ts +52 -3
  11. package/dist/auth/components/index.d.mts +149 -4
  12. package/dist/auth/components/index.d.ts +149 -4
  13. package/dist/auth/components/index.js +243 -9
  14. package/dist/auth/components/index.js.map +1 -1
  15. package/dist/auth/components/index.mjs +237 -4
  16. package/dist/auth/components/index.mjs.map +1 -1
  17. package/dist/auth/hooks/index.d.mts +31 -2
  18. package/dist/auth/hooks/index.d.ts +31 -2
  19. package/dist/auth/index.d.mts +5 -5
  20. package/dist/auth/index.d.ts +5 -5
  21. package/dist/auth/index.js +49 -17
  22. package/dist/auth/index.mjs +1 -1
  23. package/dist/auth/routes/index.d.mts +103 -5
  24. package/dist/auth/routes/index.d.ts +103 -5
  25. package/dist/auth/routes/index.js +37 -5
  26. package/dist/auth/routes/index.mjs +1 -1
  27. package/dist/chunk-42IJ7HEI.js +573 -0
  28. package/dist/chunk-42IJ7HEI.js.map +1 -0
  29. package/dist/chunk-7XLFSPDG.mjs +31 -0
  30. package/dist/chunk-7XLFSPDG.mjs.map +1 -0
  31. package/dist/chunk-GCVOKQZP.js +36 -0
  32. package/dist/chunk-GCVOKQZP.js.map +1 -0
  33. package/dist/chunk-IBLB7ARJ.mjs +560 -0
  34. package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
  35. package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
  36. package/dist/chunk-LX4XX6W7.js.map +1 -0
  37. package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
  38. package/dist/chunk-T5OZHYVM.mjs.map +1 -0
  39. package/dist/config/server/index.d.mts +1533 -0
  40. package/dist/config/server/index.d.ts +1533 -0
  41. package/dist/config/server/index.js +1177 -0
  42. package/dist/config/server/index.js.map +1 -0
  43. package/dist/config/server/index.mjs +1138 -0
  44. package/dist/config/server/index.mjs.map +1 -0
  45. package/dist/i18n/index.d.mts +2 -1
  46. package/dist/i18n/index.d.ts +2 -1
  47. package/dist/i18n/index.js +125 -61
  48. package/dist/i18n/index.js.map +1 -1
  49. package/dist/i18n/index.mjs +126 -62
  50. package/dist/i18n/index.mjs.map +1 -1
  51. package/dist/index.js +6 -6
  52. package/dist/index.mjs +1 -1
  53. package/dist/mmd/index.d.mts +346 -0
  54. package/dist/mmd/index.d.ts +346 -0
  55. package/dist/mmd/index.js +1535 -0
  56. package/dist/mmd/index.js.map +1 -0
  57. package/dist/mmd/index.mjs +1503 -0
  58. package/dist/mmd/index.mjs.map +1 -0
  59. package/dist/storage/index.d.mts +1 -0
  60. package/dist/storage/index.d.ts +1 -0
  61. package/dist/storage/index.js +9 -9
  62. package/dist/storage/index.mjs +1 -1
  63. package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
  64. package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
  65. package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
  66. package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
  67. package/dist/universalExport/index.js +17 -32
  68. package/dist/universalExport/index.js.map +1 -1
  69. package/dist/universalExport/index.mjs +2 -29
  70. package/dist/universalExport/index.mjs.map +1 -1
  71. package/dist/universalExport/server/index.d.mts +849 -8
  72. package/dist/universalExport/server/index.d.ts +849 -8
  73. package/dist/universalExport/server/index.js +1382 -2
  74. package/dist/universalExport/server/index.js.map +1 -1
  75. package/dist/universalExport/server/index.mjs +1355 -3
  76. package/dist/universalExport/server/index.mjs.map +1 -1
  77. package/dist/universalFile/index.d.mts +54 -3
  78. package/dist/universalFile/index.d.ts +54 -3
  79. package/dist/universalFile/index.js +272 -0
  80. package/dist/universalFile/index.js.map +1 -1
  81. package/dist/universalFile/index.mjs +267 -1
  82. package/dist/universalFile/index.mjs.map +1 -1
  83. package/dist/universalFile/server/index.d.mts +2541 -469
  84. package/dist/universalFile/server/index.d.ts +2541 -469
  85. package/dist/universalFile/server/index.js +830 -64
  86. package/dist/universalFile/server/index.js.map +1 -1
  87. package/dist/universalFile/server/index.mjs +803 -66
  88. package/dist/universalFile/server/index.mjs.map +1 -1
  89. package/package.json +47 -23
  90. package/dist/chunk-6FNUWAIV.js.map +0 -1
  91. package/dist/chunk-APY57REU.js +0 -300
  92. package/dist/chunk-APY57REU.js.map +0 -1
  93. package/dist/chunk-C64RY2OW.mjs +0 -295
  94. package/dist/chunk-C64RY2OW.mjs.map +0 -1
  95. package/dist/chunk-HXFFYNIF.mjs.map +0 -1
  96. package/dist/types-CoGG1rNV.d.mts +0 -258
  97. package/dist/types-CoGG1rNV.d.ts +0 -258
  98. package/dist/types-DW9qar-w.d.mts +0 -52
  99. package/dist/types-DW9qar-w.d.ts +0 -52
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/config/server/types.ts","../../../src/config/server/schema.ts","../../../src/config/server/engine.ts","../../../src/config/server/service.ts","../../../src/config/server/templates.ts","../../../src/config/server/factory.ts","../../../src/config/server/database-config.ts"],"names":["ConfigCategory","pgTable","text","jsonb","timestamp","sql","uniqueIndex","boolean","integer","index","eq","crypto","defaultLogger"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 配置系统类型定义\n * ConfigEngine V2 - 数据驱动的配置管理\n */\n\n// ==================== 基础类型 ====================\n\nexport type ConfigType = 'string' | 'number' | 'boolean' | 'json' | 'enum' | 'url' | 'email';\n\nexport type UiComponentType =\n | 'input'\n | 'textarea'\n | 'select'\n | 'switch'\n | 'slider'\n | 'color-picker';\n\nexport type ConfigStatus = 'active' | 'deprecated' | 'disabled';\n\nexport type ChangeType = 'create' | 'update' | 'delete';\n\n// ==================== 配置定义 ====================\n\n/**\n * 验证规则\n */\nexport interface ValidationRules {\n /** 最小值(数字) */\n min?: number;\n /** 最大值(数字) */\n max?: number;\n /** 最小长度(字符串) */\n minLength?: number;\n /** 最大长度(字符串) */\n maxLength?: number;\n /** 正则表达式 */\n pattern?: string;\n /** 是否为邮箱 */\n email?: boolean;\n /** 是否为 URL */\n url?: boolean;\n /** 自定义验证函数名 */\n custom?: string;\n}\n\n/**\n * UI 组件属性\n */\nexport interface UiProps {\n /** 占位符 */\n placeholder?: string;\n /** 帮助文本 */\n helpText?: string;\n /** 前缀 */\n prefix?: string;\n /** 后缀 */\n suffix?: string;\n /** 步长(数字输入) */\n step?: number;\n /** 行数(文本域) */\n rows?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 最大值(滑块) */\n max?: number;\n /** 最小值(滑块) */\n min?: number;\n}\n\n/**\n * 枚举选项\n */\nexport interface EnumOption {\n /** 显示标签 */\n label: string;\n /** 实际值 */\n value: any;\n /** 描述 */\n description?: string;\n /** 图标 */\n icon?: string;\n}\n\n/**\n * 配置定义(完整)\n */\nexport interface ConfigDefinition {\n // 基本信息\n id?: number;\n key: string;\n category: string;\n name: string;\n description?: string;\n\n // 类型和验证\n type: ConfigType;\n validationRules?: ValidationRules;\n\n // UI 配置\n uiComponent?: UiComponentType;\n uiProps?: UiProps;\n\n // 安全和权限\n isSensitive?: boolean;\n isRequired?: boolean;\n isReadonly?: boolean;\n requiredPermission?: string;\n\n // 默认值和选项\n defaultValue?: any;\n enumOptions?: EnumOption[];\n\n // 依赖和条件\n dependsOn?: string[];\n showIf?: Record<string, any>;\n\n // 分组和排序\n groupName?: string;\n sortOrder?: number;\n\n // 版本和状态\n version?: number;\n status?: ConfigStatus;\n\n // 标签\n tags?: string[];\n\n // 元数据\n createdAt?: Date | string;\n updatedAt?: Date | string;\n createdBy?: number;\n}\n\n/**\n * 配置定义(用于创建)\n */\nexport type ConfigDefinitionCreate = Omit<ConfigDefinition, 'id' | 'createdAt' | 'updatedAt'>;\n\n/**\n * 配置定义(用于更新)\n */\nexport type ConfigDefinitionUpdate = Partial<ConfigDefinitionCreate>;\n\n/**\n * 配置定义(带值)\n */\nexport interface ConfigDefinitionWithValue extends ConfigDefinition {\n value: any;\n displayValue?: any; // 用于敏感信息掩码\n}\n\n// ==================== 配置值 ====================\n\n/**\n * 配置值\n */\nexport interface ConfigValue {\n key: string;\n value: any;\n}\n\n// ==================== 配置历史 ====================\n\n/**\n * 配置变更历史\n */\nexport interface ConfigHistoryRecord {\n id?: number;\n configKey: string;\n oldValue?: string;\n newValue?: string;\n changeType: ChangeType;\n changedBy?: number;\n changedAt?: Date | string;\n reason?: string;\n ipAddress?: string;\n userAgent?: string;\n}\n\n/**\n * 配置历史(用于创建)\n */\nexport type ConfigHistoryCreate = Omit<ConfigHistoryRecord, 'id' | 'changedAt'>;\n\n// ==================== 验证结果 ====================\n\n/**\n * 验证结果\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// ==================== API 响应 ====================\n\n/**\n * API 成功响应\n */\nexport interface ApiSuccessResponse<T = any> {\n success: true;\n data: T;\n message?: string;\n}\n\n/**\n * API 错误响应\n */\nexport interface ApiErrorResponse {\n success: false;\n error: string;\n details?: any;\n}\n\n/**\n * API 响应(联合类型)\n */\nexport type ApiResponse<T = any> = ApiSuccessResponse<T> | ApiErrorResponse;\n\n// ==================== 配置分组 ====================\n\n/**\n * 配置分组(UI 展示用)\n */\nexport interface ConfigGroup {\n groupName: string;\n definitions: ConfigDefinitionWithValue[];\n}\n\n/**\n * 分类配置(UI 展示用)\n */\nexport interface CategoryConfigs {\n category: string;\n groups: ConfigGroup[];\n}\n\n// ==================== 批量操作 ====================\n\n/**\n * 批量注册配置定义\n */\nexport interface BatchRegisterRequest {\n definitions: ConfigDefinitionCreate[];\n}\n\n/**\n * 批量更新配置值\n */\nexport interface BatchUpdateValuesRequest {\n values: Array<{\n key: string;\n value: any;\n }>;\n}\n\n// ==================== 配置元数据 ====================\n\n/**\n * 配置元数据缓存\n */\nexport interface ConfigMetadataCache {\n category: string;\n type: ConfigType;\n isSensitive: boolean;\n isRequired: boolean;\n defaultDescription?: string;\n}\n\n// ==================== 配置分类和模板 ====================\n\n/**\n * 配置分类枚举\n */\nexport enum ConfigCategory {\n DATABASE = 'database',\n STORAGE = 'storage',\n AI_SERVICE = 'ai_service',\n EMAIL = 'email',\n SECURITY = 'security',\n SYSTEM = 'system',\n MOBILE = 'mobile',\n WECHAT = 'wechat',\n}\n\n/**\n * 配置项(用于模板)\n */\nexport interface ConfigItem {\n key: string;\n value: any;\n category: ConfigCategory;\n type: ConfigType;\n isRequired: boolean;\n isSensitive: boolean;\n description?: string;\n defaultValue?: any;\n group?: string; // 配置分组\n isGroupTemplate?: boolean; // 是否为组模板(可多次实例化)\n groupFields?: string[]; // 组内字段列表(用于多实例配置)\n}\n\n","/**\n * 配置管理模块 - Drizzle ORM Schema\n *\n * 包含4个核心表:\n * 1. system_configs - 系统配置值表\n * 2. config_metadata - 配置元数据表\n * 3. config_definitions - 配置定义表(ConfigEngine核心)\n * 4. config_history - 配置变更历史表\n */\n\nimport {\n pgTable,\n text,\n jsonb,\n timestamp,\n boolean,\n integer,\n uniqueIndex,\n index,\n} from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\n\n/**\n * 系统配置值表\n * 存储实际的配置键值对\n */\nexport const systemConfigs = pgTable(\n 'system_configs',\n {\n id: text().primaryKey().notNull(),\n key: text().notNull(),\n value: jsonb().notNull(),\n description: text(),\n createdAt: timestamp({ precision: 3, mode: 'string' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp({ precision: 3, mode: 'string' }).notNull(),\n },\n (table) => [\n uniqueIndex('system_configs_key_key').using(\n 'btree',\n table.key.asc().nullsLast().op('text_ops')\n ),\n ]\n);\n\n/**\n * 配置元数据表\n * 存储配置的类型、类别和验证规则等元数据\n */\nexport const configMetadata = pgTable('config_metadata', {\n key: text().primaryKey().notNull(),\n category: text().notNull(),\n type: text().default('string').notNull(),\n isSensitive: boolean().default(false).notNull(),\n isRequired: boolean().default(false).notNull(),\n defaultDescription: text(),\n createdAt: timestamp({ precision: 3, mode: 'string' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp({ precision: 3, mode: 'string' }).notNull(),\n});\n\n/**\n * 配置定义表(ConfigEngine 核心)\n * 数据驱动的配置管理系统核心表\n */\nexport const configDefinitions = pgTable(\n 'config_definitions',\n {\n id: integer().primaryKey().generatedAlwaysAsIdentity(),\n key: text().notNull(),\n category: text().notNull(),\n name: text().notNull(),\n description: text(),\n\n // 类型和验证\n type: text().notNull(), // string, number, boolean, json, enum, url, email\n validationRules: jsonb(), // 验证规则 JSON\n\n // UI 配置\n uiComponent: text().default('input'), // input, textarea, select, switch, slider\n uiProps: jsonb(), // UI 组件属性\n\n // 安全和权限\n isSensitive: boolean().default(false).notNull(),\n isRequired: boolean().default(false).notNull(),\n isReadonly: boolean().default(false).notNull(),\n requiredPermission: text(),\n\n // 默认值和选项\n defaultValue: text(),\n enumOptions: jsonb(), // 枚举选项\n\n // 依赖和条件\n dependsOn: text().array(), // 依赖的配置项\n showIf: jsonb(), // 显示条件\n\n // 分组和排序\n groupName: text(),\n sortOrder: integer().default(0).notNull(),\n\n // 版本和状态\n version: integer().default(1).notNull(),\n status: text().default('active').notNull(), // active, deprecated, disabled\n\n // 标签\n tags: text().array(),\n\n // 元数据\n createdAt: timestamp({ precision: 3, mode: 'string' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp({ precision: 3, mode: 'string' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n createdBy: integer(),\n },\n (table) => [\n uniqueIndex('config_definitions_key_key').using(\n 'btree',\n table.key.asc().nullsLast().op('text_ops')\n ),\n index('config_definitions_category_idx').using(\n 'btree',\n table.category.asc().nullsLast().op('text_ops')\n ),\n index('config_definitions_status_idx').using(\n 'btree',\n table.status.asc().nullsLast().op('text_ops')\n ),\n ]\n);\n\n/**\n * 配置变更历史表\n * 记录所有配置的变更历史,用于审计和回滚\n */\nexport const configHistory = pgTable(\n 'config_history',\n {\n id: integer().primaryKey().generatedAlwaysAsIdentity(),\n configKey: text().notNull(),\n oldValue: text(),\n newValue: text(),\n changeType: text().notNull(), // create, update, delete\n changedBy: integer(),\n changedAt: timestamp({ precision: 3, mode: 'string' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n reason: text(),\n ipAddress: text(),\n userAgent: text(),\n },\n (table) => [\n index('config_history_key_idx').using(\n 'btree',\n table.configKey.asc().nullsLast().op('text_ops')\n ),\n index('config_history_date_idx').using(\n 'btree',\n table.changedAt.asc().nullsLast().op('timestamp_ops')\n ),\n ]\n);\n\n","/**\n * ConfigEngine V2 - 数据驱动的配置管理引擎\n *\n * 核心功能:\n * 1. 从数据库加载配置定义\n * 2. 配置值的验证和管理\n * 3. 配置变更历史记录\n * 4. 敏感信息加密/解密\n *\n * 使用方法:\n * ```typescript\n * import { ConfigEngine } from 'sa2kit/config/server';\n *\n * const engine = new ConfigEngine(db);\n * await engine.initialize();\n *\n * // 获取配置值\n * const value = await engine.getValue('config_key');\n *\n * // 设置配置值\n * await engine.setValue('config_key', 'new_value', userId);\n * ```\n */\n\nimport * as crypto from 'crypto';\nimport { eq } from 'drizzle-orm';\nimport type {\n ConfigDefinition,\n ConfigDefinitionCreate,\n ConfigDefinitionWithValue,\n ValidationResult,\n ValidationRules,\n ConfigHistoryCreate,\n ConfigType,\n} from './types';\n\n// 数据库表类型 - 需要从外部传入或注入\ninterface SystemConfig {\n id: string;\n key: string;\n value: any;\n description?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ConfigDefinitionRow {\n id: number;\n key: string;\n category: string;\n name: string;\n description?: string | null;\n type: string;\n validationRules?: any;\n uiComponent?: string | null;\n uiProps?: any;\n isSensitive: boolean;\n isRequired: boolean;\n isReadonly: boolean;\n requiredPermission?: string | null;\n defaultValue?: string | null;\n enumOptions?: any;\n dependsOn?: string[] | null;\n showIf?: any;\n groupName?: string | null;\n sortOrder: number;\n version: number;\n status: string;\n tags?: string[] | null;\n createdAt: string;\n updatedAt: string;\n createdBy?: number | null;\n}\n\n/**\n * 数据库接口(使用Drizzle ORM)\n * 使用 any 类型以避免复杂的类型推导\n */\nexport type DatabaseClient = any;\n\n/**\n * 数据库表定义\n */\nexport interface DatabaseTables {\n systemConfigs: any;\n configDefinitions?: any;\n configMetadata?: any;\n configHistory: any;\n}\n\n/**\n * 日志接口\n */\nexport interface Logger {\n info: (message: string, ...args: any[]) => void;\n warn: (message: string, ...args: any[]) => void;\n error: (message: string, ...args: any[]) => void;\n}\n\n/**\n * ConfigEngine 配置选项\n */\nexport interface ConfigEngineOptions {\n /** 数据库客户端 */\n db: DatabaseClient;\n /** 数据库表定义 */\n tables: DatabaseTables;\n /** 加密密钥 */\n encryptionKey?: string;\n /** 日志记录器 */\n logger?: Logger;\n}\n\n/**\n * 默认日志记录器\n */\nconst defaultLogger: Logger = {\n info: (message: string, ...args: any[]) => console.log(`[ConfigEngine] ${message}`, ...args),\n warn: (message: string, ...args: any[]) => console.warn(`[ConfigEngine] ${message}`, ...args),\n error: (message: string, ...args: any[]) => console.error(`[ConfigEngine] ${message}`, ...args),\n};\n\n/**\n * 配置引擎类\n */\nexport class ConfigEngine {\n private definitionsCache = new Map<string, ConfigDefinition>();\n private encryptionKey: string;\n private initialized = false;\n private db: DatabaseClient;\n private tables: DatabaseTables;\n private logger: Logger;\n\n constructor(options: ConfigEngineOptions) {\n this.db = options.db;\n this.tables = options.tables;\n this.logger = options.logger || defaultLogger;\n\n // 使用环境变量作为加密密钥\n this.encryptionKey = options.encryptionKey || process.env.CONFIG_ENCRYPTION_KEY || 'default-config-key-2024';\n\n if (this.encryptionKey === 'default-config-key-2024') {\n this.logger.warn('⚠️ 使用默认加密密钥,生产环境请设置 CONFIG_ENCRYPTION_KEY 环境变量');\n }\n }\n\n /**\n * 初始化配置引擎\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n await this.loadDefinitions();\n this.initialized = true;\n this.logger.info('✅ ConfigEngine 初始化成功');\n } catch (error) {\n this.logger.error('❌ ConfigEngine 初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 从数据库加载所有配置定义到缓存\n */\n async loadDefinitions(): Promise<void> {\n try {\n const definitions = await this.db\n .select()\n .from(this.tables.configDefinitions)\n .where(eq(this.tables.configDefinitions.status, 'active'));\n\n this.definitionsCache.clear();\n\n (definitions as ConfigDefinitionRow[]).forEach((def) => {\n const definition: ConfigDefinition = {\n id: def.id,\n key: def.key,\n category: def.category,\n name: def.name,\n description: def.description || undefined,\n type: def.type as ConfigType,\n validationRules: def.validationRules\n ? JSON.parse(JSON.stringify(def.validationRules))\n : undefined,\n uiComponent: def.uiComponent as any,\n uiProps: def.uiProps ? JSON.parse(JSON.stringify(def.uiProps)) : undefined,\n isSensitive: def.isSensitive,\n isRequired: def.isRequired,\n isReadonly: def.isReadonly,\n requiredPermission: def.requiredPermission || undefined,\n defaultValue: def.defaultValue || undefined,\n enumOptions: def.enumOptions ? JSON.parse(JSON.stringify(def.enumOptions)) : undefined,\n dependsOn: def.dependsOn || undefined,\n showIf: def.showIf ? JSON.parse(JSON.stringify(def.showIf)) : undefined,\n groupName: def.groupName || undefined,\n sortOrder: def.sortOrder,\n version: def.version,\n status: def.status as any,\n tags: def.tags || undefined,\n createdAt: def.createdAt,\n updatedAt: def.updatedAt,\n createdBy: def.createdBy || undefined,\n };\n\n this.definitionsCache.set(def.key, definition);\n });\n\n this.logger.info(`✅ 已加载 ${definitions.length} 个配置定义`);\n } catch (error) {\n this.logger.error('❌ 加载配置定义失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取单个配置定义\n */\n getDefinition(key: string): ConfigDefinition | undefined {\n return this.definitionsCache.get(key);\n }\n\n /**\n * 获取所有配置定义\n */\n getAllDefinitions(): ConfigDefinition[] {\n return Array.from(this.definitionsCache.values());\n }\n\n /**\n * 获取指定分类的配置定义\n */\n getDefinitionsByCategory(category: string): ConfigDefinition[] {\n return this.getAllDefinitions()\n .filter((def) => def.category === category)\n .sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0));\n }\n\n /**\n * 验证配置值\n */\n async validate(key: string, value: any): Promise<ValidationResult> {\n const definition = this.getDefinition(key);\n\n if (!definition) {\n return {\n valid: false,\n errors: ['配置定义不存在'],\n };\n }\n\n const errors: string[] = [];\n\n // 必填验证\n if (definition.isRequired && (value === null || value === undefined || value === '')) {\n errors.push('此配置项为必填');\n return { valid: false, errors };\n }\n\n // 空值跳过后续验证\n if (value === null || value === undefined || value === '') {\n return { valid: true, errors: [] };\n }\n\n // 类型验证\n const typeError = this.validateType(value, definition.type);\n if (typeError) {\n errors.push(typeError);\n }\n\n // 规则验证\n if (definition.validationRules && typeError === null) {\n const ruleErrors = this.validateRules(value, definition.validationRules);\n errors.push(...ruleErrors);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * 获取配置的完整数据(定义 + 值)\n */\n async getConfigsWithValues(category?: string): Promise<ConfigDefinitionWithValue[]> {\n // 确保已初始化\n if (!this.initialized) {\n await this.initialize();\n }\n\n // 获取定义\n const definitions = category\n ? this.getDefinitionsByCategory(category)\n : this.getAllDefinitions();\n\n // 获取所有配置值\n const configValues = await this.db.select().from(this.tables.systemConfigs);\n const valueMap = new Map((configValues as SystemConfig[]).map((v) => [v.key, v.value]));\n\n // 合并定义和值\n const result: ConfigDefinitionWithValue[] = definitions.map((def) => {\n let value = valueMap.get(def.key) ?? def.defaultValue;\n let displayValue = value;\n\n // 解密敏感配置\n if (def.isSensitive && value && typeof value === 'string') {\n try {\n value = this.decrypt(value);\n // 掩码显示\n displayValue = this.maskValue(value);\n } catch (error) {\n this.logger.warn(`解密配置 ${def.key} 失败:`, error);\n }\n }\n\n return {\n ...def,\n value,\n displayValue,\n };\n });\n\n return result;\n }\n\n /**\n * 获取单个配置值\n */\n async getValue(key: string): Promise<any> {\n const definition = this.getDefinition(key);\n if (!definition) {\n return undefined;\n }\n\n const configs = await this.db\n .select()\n .from(this.tables.systemConfigs)\n .where(eq(this.tables.systemConfigs.key, key))\n .limit(1);\n\n if (configs.length === 0) {\n return definition.defaultValue;\n }\n\n let value = (configs[0] as SystemConfig).value;\n\n // 解密敏感配置\n if (definition.isSensitive && value && typeof value === 'string') {\n try {\n value = this.decrypt(value);\n } catch (error) {\n this.logger.warn(`解密配置 ${key} 失败:`, error);\n }\n }\n\n return value;\n }\n\n /**\n * 设置配置值\n */\n async setValue(\n key: string,\n value: any,\n userId: number = 0,\n options?: {\n reason?: string;\n ipAddress?: string;\n userAgent?: string;\n }\n ): Promise<void> {\n // 验证配置值\n const validation = await this.validate(key, value);\n if (!validation.valid) {\n throw new Error(`配置验证失败: ${validation.errors.join(', ')}`);\n }\n\n const definition = this.getDefinition(key);\n if (!definition) {\n throw new Error('配置定义不存在');\n }\n\n // 获取旧值(用于历史记录)\n const oldConfigs = await this.db\n .select()\n .from(this.tables.systemConfigs)\n .where(eq(this.tables.systemConfigs.key, key))\n .limit(1);\n\n const oldValue = oldConfigs.length > 0 ? (oldConfigs[0] as SystemConfig).value : undefined;\n\n // 加密敏感配置\n let finalValue = value;\n if (definition.isSensitive && value) {\n finalValue = this.encrypt(String(value));\n }\n\n // 保存配置值\n if (oldConfigs.length > 0) {\n await this.db\n .update(this.tables.systemConfigs)\n .set({\n value: finalValue,\n updatedAt: new Date().toISOString(),\n })\n .where(eq(this.tables.systemConfigs.key, key));\n } else {\n // 生成 ID\n const id = crypto.randomUUID();\n await this.db.insert(this.tables.systemConfigs).values({\n id,\n key,\n value: finalValue,\n description: definition.description,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n\n // 记录历史\n await this.recordHistory({\n configKey: key,\n oldValue: oldValue ? JSON.stringify(oldValue) : undefined,\n newValue: JSON.stringify(value),\n changeType: oldValue ? 'update' : 'create',\n changedBy: userId,\n reason: options?.reason,\n ipAddress: options?.ipAddress,\n userAgent: options?.userAgent,\n });\n\n this.logger.info(`✅ 配置已${oldValue ? '更新' : '创建'}: ${key}`);\n }\n\n /**\n * 批量设置配置值\n */\n async setValues(\n values: Array<{ key: string; value: any }>,\n userId: number = 0,\n options?: {\n reason?: string;\n ipAddress?: string;\n userAgent?: string;\n }\n ): Promise<void> {\n for (const item of values) {\n await this.setValue(item.key, item.value, userId, options);\n }\n }\n\n /**\n * 注册新配置定义\n */\n async registerDefinition(definition: ConfigDefinitionCreate, userId: number = 0): Promise<void> {\n try {\n await this.db.insert(this.tables.configDefinitions).values({\n key: definition.key,\n category: definition.category,\n name: definition.name,\n description: definition.description,\n type: definition.type,\n validationRules: definition.validationRules\n ? JSON.stringify(definition.validationRules)\n : null,\n uiComponent: definition.uiComponent || 'input',\n uiProps: definition.uiProps ? JSON.stringify(definition.uiProps) : null,\n isSensitive: definition.isSensitive || false,\n isRequired: definition.isRequired || false,\n isReadonly: definition.isReadonly || false,\n requiredPermission: definition.requiredPermission,\n defaultValue: definition.defaultValue,\n enumOptions: definition.enumOptions ? JSON.stringify(definition.enumOptions) : null,\n dependsOn: definition.dependsOn,\n showIf: definition.showIf ? JSON.stringify(definition.showIf) : null,\n groupName: definition.groupName,\n sortOrder: definition.sortOrder || 0,\n version: definition.version || 1,\n status: definition.status || 'active',\n tags: definition.tags,\n createdBy: userId,\n updatedAt: new Date().toISOString(),\n });\n\n // 重新加载定义缓存\n await this.loadDefinitions();\n\n this.logger.info(`✅ 注册新配置定义: ${definition.key}`);\n } catch (error) {\n this.logger.error(`❌ 注册配置定义失败:`, error);\n throw error;\n }\n }\n\n /**\n * 批量注册配置定义\n */\n async registerDefinitions(\n definitions: ConfigDefinitionCreate[],\n userId: number = 0\n ): Promise<void> {\n for (const definition of definitions) {\n await this.registerDefinition(definition, userId);\n }\n }\n\n /**\n * 记录配置变更历史\n */\n private async recordHistory(record: ConfigHistoryCreate): Promise<void> {\n try {\n await this.db.insert(this.tables.configHistory).values({\n ...record,\n changedAt: new Date().toISOString(),\n });\n } catch (error) {\n this.logger.error('❌ 记录配置历史失败:', error);\n // 不抛出错误,避免影响主流程\n }\n }\n\n /**\n * 获取配置变更历史\n */\n async getHistory(key: string, limit: number = 50): Promise<any[]> {\n try {\n const history = await this.db\n .select()\n .from(this.tables.configHistory)\n .where(eq(this.tables.configHistory.configKey, key))\n .orderBy(this.tables.configHistory.changedAt)\n .limit(limit);\n\n return history;\n } catch (error) {\n this.logger.error('❌ 获取配置历史失败:', error);\n return [];\n }\n }\n\n // ==================== 私有辅助方法 ====================\n\n /**\n * 类型验证\n */\n private validateType(value: any, type: ConfigType): string | null {\n switch (type) {\n case 'string':\n return typeof value === 'string' ? null : '值必须是字符串';\n\n case 'number':\n return typeof value === 'number' && !isNaN(value) ? null : '值必须是数字';\n\n case 'boolean':\n return typeof value === 'boolean' ? null : '值必须是布尔值';\n\n case 'json':\n try {\n if (typeof value === 'string') {\n JSON.parse(value);\n }\n return null;\n } catch {\n return '值必须是有效的 JSON';\n }\n\n case 'url':\n try {\n new URL(value);\n return null;\n } catch {\n return '值必须是有效的 URL';\n }\n\n case 'email':\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value) ? null : '值必须是有效的邮箱地址';\n\n case 'enum':\n return null; // 枚举验证在规则验证中处理\n\n default:\n return null;\n }\n }\n\n /**\n * 规则验证\n */\n private validateRules(value: any, rules: ValidationRules): string[] {\n const errors: string[] = [];\n\n if (rules.min !== undefined && value < rules.min) {\n errors.push(`值不能小于 ${rules.min}`);\n }\n\n if (rules.max !== undefined && value > rules.max) {\n errors.push(`值不能大于 ${rules.max}`);\n }\n\n if (rules.minLength !== undefined && String(value).length < rules.minLength) {\n errors.push(`长度不能小于 ${rules.minLength}`);\n }\n\n if (rules.maxLength !== undefined && String(value).length > rules.maxLength) {\n errors.push(`长度不能大于 ${rules.maxLength}`);\n }\n\n if (rules.pattern && !new RegExp(rules.pattern).test(String(value))) {\n errors.push('值不符合要求的格式');\n }\n\n return errors;\n }\n\n /**\n * 加密\n */\n private encrypt(value: string): string {\n const algorithm = 'aes-256-cbc';\n const key = crypto.scryptSync(this.encryptionKey, 'salt', 32);\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(algorithm, key, iv);\n let encrypted = cipher.update(value, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n return iv.toString('hex') + ':' + encrypted;\n }\n\n /**\n * 解密\n */\n private decrypt(encrypted: string): string {\n const algorithm = 'aes-256-cbc';\n const key = crypto.scryptSync(this.encryptionKey, 'salt', 32);\n const parts = encrypted.split(':');\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new Error('无效的加密数据格式');\n }\n const [ivHex, encryptedData] = parts;\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = crypto.createDecipheriv(algorithm, key, iv);\n let decrypted = decipher.update(encryptedData, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n }\n\n /**\n * 掩码显示敏感值\n */\n private maskValue(value: string): string {\n if (!value) return '';\n const len = value.length;\n if (len <= 8) {\n return '*'.repeat(len);\n }\n return value.substring(0, 4) + '*'.repeat(len - 8) + value.substring(len - 4);\n }\n}\n\n","/**\n * ConfigService - 简化的配置管理服务\n *\n * 提供更简单的API来管理配置,封装ConfigEngine的复杂性\n *\n * 使用方法:\n * ```typescript\n * import { ConfigService } from 'sa2kit/config/server';\n * import { ConfigCategory, ConfigType } from 'sa2kit/config/server';\n *\n * const service = new ConfigService({ db, tables });\n *\n * // 获取配置\n * const apiKey = await service.getConfig('api_key', 'default-key');\n *\n * // 设置配置\n * await service.setConfig('api_key', 'new-key');\n *\n * // 获取分类下的所有配置\n * const storageConfigs = await service.getConfigsByCategory(ConfigCategory.STORAGE);\n * ```\n */\n\nimport crypto from 'crypto';\nimport { eq } from 'drizzle-orm';\nimport { ConfigEngine, type DatabaseClient, type DatabaseTables, type Logger } from './engine';\nimport { ConfigCategory, type ConfigType, type ConfigItem } from './types';\n\n/**\n * 配置模板(用于初始化默认配置)\n */\nexport type ConfigTemplates = Record<string, ConfigItem[]>;\n\n/**\n * ConfigService 配置选项\n */\nexport interface ConfigServiceOptions {\n /** 数据库客户端 */\n db: DatabaseClient;\n /** 数据库表定义 */\n tables: DatabaseTables;\n /** 加密密钥 */\n encryptionKey?: string;\n /** 日志记录器 */\n logger?: Logger;\n /** 配置模板 */\n templates?: ConfigTemplates;\n}\n\n/**\n * 默认日志记录器\n */\nconst defaultLogger: Logger = {\n info: (message: string, ...args: any[]) => console.log(`[ConfigService] ${message}`, ...args),\n warn: (message: string, ...args: any[]) => console.warn(`[ConfigService] ${message}`, ...args),\n error: (message: string, ...args: any[]) => console.error(`[ConfigService] ${message}`, ...args),\n};\n\n/**\n * 配置管理服务类\n */\nexport class ConfigService {\n private configCache: Map<string, any> = new Map();\n private metadataCache: Map<\n string,\n {\n category: string;\n type: ConfigType;\n isSensitive: boolean;\n isRequired: boolean;\n defaultDescription?: string;\n }\n > = new Map();\n private encryptionKey: string;\n private db: DatabaseClient;\n private tables: DatabaseTables;\n private logger: Logger;\n private templates: ConfigTemplates;\n\n constructor(options: ConfigServiceOptions) {\n this.db = options.db;\n this.tables = options.tables;\n this.logger = options.logger || defaultLogger;\n this.templates = options.templates || {};\n\n // 使用环境变量或默认密钥作为加密密钥\n this.encryptionKey = options.encryptionKey || process.env.CONFIG_ENCRYPTION_KEY || 'default-config-key-2024';\n\n // 初始化时加载配置和元数据\n this.loadConfigsFromDatabase();\n this.loadMetadataFromDatabase();\n }\n\n // 从数据库加载元数据\n private async loadMetadataFromDatabase() {\n if (!this.tables.configMetadata) {\n this.logger.info('配置元数据表未提供,跳过元数据加载');\n return;\n }\n\n try {\n const metadata = await this.db.select().from(this.tables.configMetadata);\n metadata.forEach((meta: any) => {\n this.metadataCache.set(meta.key, {\n category: meta.category,\n type: meta.type as ConfigType,\n isSensitive: meta.isSensitive,\n isRequired: meta.isRequired,\n defaultDescription: meta.defaultDescription || undefined,\n });\n });\n this.logger.info(`已加载 ${metadata.length} 条配置元数据`);\n } catch (error) {\n // 如果表不存在,使用模板作为后备\n this.logger.warn(\n '配置元数据表不存在,使用模板数据',\n error instanceof Error ? error.message : String(error)\n );\n // 不抛出错误,继续使用模板\n }\n }\n\n // 从数据库加载配置到缓存\n private async loadConfigsFromDatabase(): Promise<void> {\n try {\n const configs = await this.db.select().from(this.tables.systemConfigs);\n\n configs.forEach((config: any) => {\n let value = config.value;\n\n // 如果是敏感配置,解密\n if (this.isSensitiveConfig(config.key)) {\n try {\n value = this.decrypt(config.value as string);\n this.logger.info(`✅ 成功解密配置: ${config.key}`);\n } catch (error) {\n this.logger.error(`❌ 解密配置失败: ${config.key}`, error);\n // 跳过该配置,不加入缓存\n return;\n }\n }\n\n this.configCache.set(config.key, value);\n });\n\n this.logger.info(`已加载 ${configs.length} 个配置项`);\n } catch (error) {\n this.logger.error('加载配置失败', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n // 获取配置值\n public async getConfig(key: string, defaultValue?: any): Promise<any> {\n if (!key) {\n return defaultValue;\n }\n\n // 优先从环境变量获取\n const envValue = process.env[key.toUpperCase()];\n if (envValue !== undefined) {\n return this.parseValue(envValue, this.getConfigType(key));\n }\n\n // 从缓存获取\n if (this.configCache.has(key)) {\n return this.configCache.get(key);\n }\n\n // 从数据库获取\n try {\n const [config] = await this.db\n .select()\n .from(this.tables.systemConfigs)\n .where(eq(this.tables.systemConfigs.key, key))\n .limit(1);\n\n if (config) {\n let value = config.value;\n\n if (this.isSensitiveConfig(key)) {\n try {\n value = this.decrypt(config.value as string);\n this.logger.info(`✅ 成功解密配置: ${key}, 长度: ${value?.length}`);\n } catch (error) {\n this.logger.error(`❌ 解密配置失败: ${key}`, error);\n throw new Error(`配置 ${key} 解密失败`);\n }\n }\n\n this.configCache.set(key, value);\n return value;\n }\n } catch (error) {\n this.logger.error(\n `获取配置 ${key} 失败`,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n return defaultValue;\n }\n\n // 设置配置值\n public async setConfig(key: string, value: any, description?: string): Promise<void> {\n try {\n const category = this.getConfigCategory(key);\n const type = this.getConfigType(key);\n const isSensitive = this.isSensitiveConfig(key);\n\n // 验证配置值\n const validatedValue = this.validateValue(value, type);\n\n // 敏感配置需要加密\n const storageValue = isSensitive ? this.encrypt(validatedValue) : validatedValue;\n\n // 保存到数据库\n const existing = await this.db\n .select()\n .from(this.tables.systemConfigs)\n .where(eq(this.tables.systemConfigs.key, key))\n .limit(1);\n\n if (existing.length > 0) {\n await this.db\n .update(this.tables.systemConfigs)\n .set({\n value: storageValue,\n description: description || this.getConfigDescription(key),\n updatedAt: new Date().toISOString(),\n })\n .where(eq(this.tables.systemConfigs.key, key));\n } else {\n await this.db.insert(this.tables.systemConfigs).values({\n id: crypto.randomBytes(16).toString('hex'),\n key,\n value: storageValue,\n description: description || this.getConfigDescription(key),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n\n // 更新缓存\n this.configCache.set(key, validatedValue);\n\n this.logger.info(`配置 ${key} 已更新`);\n } catch (error) {\n this.logger.error(\n `设置配置 ${key} 失败`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw error;\n }\n }\n\n // 获取分类下的所有配置\n public async getConfigsByCategory(category: ConfigCategory): Promise<Record<string, any>> {\n const configs: Record<string, any> = {};\n const template = this.templates[category] || [];\n\n for (const item of template) {\n configs[item.key] = await this.getConfig(item.key, item.defaultValue);\n }\n\n return configs;\n }\n\n // 批量设置配置\n public async setConfigs(configs: Record<string, any>): Promise<void> {\n for (const [key, value] of Object.entries(configs)) {\n await this.setConfig(key, value);\n }\n }\n\n // 删除配置\n public async deleteConfig(key: string): Promise<void> {\n try {\n await this.db.delete(this.tables.systemConfigs).where(eq(this.tables.systemConfigs.key, key));\n\n this.configCache.delete(key);\n this.logger.info(`配置 ${key} 已删除`);\n } catch (error) {\n this.logger.error(\n `删除配置 ${key} 失败`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw error;\n }\n }\n\n // 获取所有配置(用于管理界面)\n public async getAllConfigs(): Promise<Record<string, any>> {\n const allConfigs: Record<string, any> = {};\n\n // 先获取数据库中所有实际存在的配置\n const dbConfigs = await this.db.select().from(this.tables.systemConfigs);\n const dbConfigKeys = new Set(dbConfigs.map((c: any) => c.key));\n\n for (const [category, items] of Object.entries(this.templates)) {\n allConfigs[category] = {};\n\n for (const item of items) {\n // 只显示数据库中实际存在的配置\n if (dbConfigKeys.has(item.key)) {\n const value = await this.getConfig(item.key, item.defaultValue);\n allConfigs[category][item.key] = {\n ...item,\n value: item.isSensitive ? '' : value, // 敏感信息隐藏\n isStored: true, // 标记为已存储\n };\n }\n }\n }\n\n return allConfigs;\n }\n\n // 刷新配置缓存\n public async refreshCache(): Promise<void> {\n this.configCache.clear();\n await this.loadConfigsFromDatabase();\n }\n\n // 配置验证\n public validateConfig(key: string, value: any): boolean {\n const type = this.getConfigType(key);\n const isRequired = this.isRequiredConfig(key);\n\n if (isRequired && (value === undefined || value === null || value === '')) {\n throw new Error(`配置 ${key} 是必需的`);\n }\n\n try {\n this.validateValue(value, type);\n return true;\n } catch (error: any) {\n throw new Error(`配置 ${key} 值无效: ${error.message}`);\n }\n }\n\n // 私有方法:加密\n private encrypt(text: string): string {\n const algorithm = 'aes-256-cbc';\n const key = crypto.scryptSync(this.encryptionKey, 'salt', 32);\n const iv = crypto.randomBytes(16);\n\n const cipher = crypto.createCipheriv(algorithm, key, iv);\n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n return iv.toString('hex') + ':' + encrypted;\n }\n\n // 私有方法:解密\n private decrypt(encryptedText: string): string {\n const algorithm = 'aes-256-cbc';\n const key = crypto.scryptSync(this.encryptionKey, 'salt', 32);\n\n const parts = encryptedText.split(':');\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new Error('无效的加密数据格式');\n }\n\n const iv = Buffer.from(parts[0], 'hex');\n const encrypted = parts[1];\n\n const decipher = crypto.createDecipheriv(algorithm, key, iv);\n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n\n // 私有方法:解析值类型\n private parseValue(value: string, type: ConfigType): any {\n switch (type) {\n case 'number':\n return parseInt(value);\n case 'boolean':\n return value.toLowerCase() === 'true';\n case 'json':\n return JSON.parse(value);\n default:\n return value;\n }\n }\n\n // 私有方法:验证值\n private validateValue(value: any, type: ConfigType): any {\n switch (type) {\n case 'string':\n return String(value);\n case 'number':\n const num = Number(value);\n if (isNaN(num)) throw new Error('值必须是数字');\n return num;\n case 'boolean':\n return Boolean(value);\n case 'json':\n if (typeof value === 'string') {\n return JSON.parse(value);\n }\n return value;\n default:\n return value;\n }\n }\n\n // 私有方法:获取配置类型\n private getConfigType(key: string): ConfigType {\n const metadata = this.metadataCache.get(key);\n return metadata?.type || 'string';\n }\n\n // 私有方法:获取配置分类\n private getConfigCategory(key: string): ConfigCategory {\n const metadata = this.metadataCache.get(key);\n return (metadata?.category as ConfigCategory) || ConfigCategory.SYSTEM;\n }\n\n // 私有方法:检查是否为敏感配置\n private isSensitiveConfig(key: string): boolean {\n const metadata = this.metadataCache.get(key);\n return metadata?.isSensitive || false;\n }\n\n // 私有方法:检查是否为必需配置\n private isRequiredConfig(key: string): boolean {\n const metadata = this.metadataCache.get(key);\n return metadata?.isRequired || false;\n }\n\n // 私有方法:获取配置描述\n private getConfigDescription(key: string): string {\n const metadata = this.metadataCache.get(key);\n return metadata?.defaultDescription || '';\n }\n\n // 新增方法:创建或更新配置元数据\n public async setConfigMetadata(\n key: string,\n category: string,\n type: ConfigType = 'string',\n options: {\n isSensitive?: boolean;\n isRequired?: boolean;\n defaultDescription?: string;\n } = {}\n ): Promise<void> {\n if (!this.tables.configMetadata) {\n this.logger.warn('配置元数据表未提供,跳过元数据设置');\n return;\n }\n\n try {\n const now = new Date().toISOString();\n const existing = await this.db\n .select()\n .from(this.tables.configMetadata)\n .where(eq(this.tables.configMetadata.key, key))\n .limit(1);\n\n if (existing.length > 0) {\n await this.db\n .update(this.tables.configMetadata)\n .set({\n category,\n type,\n isSensitive: options.isSensitive ?? false,\n isRequired: options.isRequired ?? false,\n defaultDescription: options.defaultDescription,\n updatedAt: now,\n })\n .where(eq(this.tables.configMetadata.key, key));\n } else {\n await this.db.insert(this.tables.configMetadata).values({\n key,\n category,\n type,\n isSensitive: options.isSensitive ?? false,\n isRequired: options.isRequired ?? false,\n defaultDescription: options.defaultDescription,\n createdAt: now,\n updatedAt: now,\n });\n }\n\n // 更新缓存\n this.metadataCache.set(key, {\n category,\n type,\n isSensitive: options.isSensitive ?? false,\n isRequired: options.isRequired ?? false,\n defaultDescription: options.defaultDescription,\n });\n\n this.logger.info(`配置元数据 ${key} 已更新`);\n } catch (error) {\n this.logger.error(\n `设置配置元数据 ${key} 失败`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw error;\n }\n }\n}\n\n/**\n * 创建ConfigService实例的工厂函数\n */\nexport function createConfigService(options: ConfigServiceOptions): ConfigService {\n return new ConfigService(options);\n}\n\n","/**\n * 配置模板\n *\n * 提供常用的配置项模板,可用于初始化默认配置\n */\n\nimport { ConfigCategory, type ConfigType, type ConfigItem } from './types';\n\n/**\n * 配置模板类型\n */\nexport type ConfigTemplates = Record<string, ConfigItem[]>;\n\n/**\n * 默认配置模板\n *\n * 包含常见的配置项,可作为参考或直接使用\n */\nexport const DEFAULT_CONFIG_TEMPLATES: ConfigTemplates = {\n // 数据库相关的业务配置(非连接配置)\n [ConfigCategory.DATABASE]: [\n {\n key: 'database_pool_size',\n value: 10,\n category: ConfigCategory.DATABASE,\n type: 'number',\n isRequired: false,\n isSensitive: false,\n description: '数据库连接池大小',\n defaultValue: 10,\n group: '连接池配置',\n },\n {\n key: 'database_query_timeout',\n value: 30000,\n category: ConfigCategory.DATABASE,\n type: 'number',\n isRequired: false,\n isSensitive: false,\n description: '数据库查询超时时间(毫秒)',\n defaultValue: 30000,\n group: '连接池配置',\n },\n {\n key: 'enable_query_logging',\n value: false,\n category: ConfigCategory.DATABASE,\n type: 'boolean',\n isRequired: false,\n isSensitive: false,\n description: '启用数据库查询日志',\n defaultValue: false,\n group: '连接池配置',\n },\n ],\n\n // 存储配置\n [ConfigCategory.STORAGE]: [\n {\n key: 'storage_type',\n value: 'local',\n category: ConfigCategory.STORAGE,\n type: 'string',\n isRequired: true,\n isSensitive: false,\n description: '存储类型(local/aliyun-oss/aws-s3)',\n defaultValue: 'local',\n group: '基础配置',\n },\n {\n key: 'upload_max_size',\n value: 10485760,\n category: ConfigCategory.STORAGE,\n type: 'number',\n isRequired: false,\n isSensitive: false,\n description: '最大上传文件大小(字节)',\n defaultValue: 10485760,\n group: '上传配置',\n },\n ],\n\n // 安全配置\n [ConfigCategory.SECURITY]: [\n {\n key: 'jwt_secret',\n value: '',\n category: ConfigCategory.SECURITY,\n type: 'string',\n isRequired: true,\n isSensitive: true,\n description: 'JWT签名密钥',\n },\n {\n key: 'jwt_expires_in',\n value: '7d',\n category: ConfigCategory.SECURITY,\n type: 'string',\n isRequired: true,\n isSensitive: false,\n description: 'JWT过期时间',\n defaultValue: '7d',\n },\n {\n key: 'enable_rate_limiting',\n value: true,\n category: ConfigCategory.SECURITY,\n type: 'boolean',\n isRequired: false,\n isSensitive: false,\n description: '启用API速率限制',\n defaultValue: true,\n },\n ],\n\n // 系统配置\n [ConfigCategory.SYSTEM]: [\n {\n key: 'app_name',\n value: 'My App',\n category: ConfigCategory.SYSTEM,\n type: 'string',\n isRequired: true,\n isSensitive: false,\n description: '应用名称',\n defaultValue: 'My App',\n },\n {\n key: 'maintenance_mode',\n value: false,\n category: ConfigCategory.SYSTEM,\n type: 'boolean',\n isRequired: false,\n isSensitive: false,\n description: '维护模式',\n defaultValue: false,\n },\n {\n key: 'log_level',\n value: 'info',\n category: ConfigCategory.SYSTEM,\n type: 'string',\n isRequired: false,\n isSensitive: false,\n description: '日志级别',\n defaultValue: 'info',\n },\n ],\n};\n\n/**\n * 创建自定义配置模板\n *\n * @param templates 配置模板\n * @returns 合并后的配置模板\n */\nexport function createConfigTemplates(templates: Partial<ConfigTemplates>): ConfigTemplates {\n const filteredTemplates: ConfigTemplates = { ...DEFAULT_CONFIG_TEMPLATES };\n\n Object.keys(templates).forEach((key) => {\n const value = templates[key];\n if (value !== undefined) {\n filteredTemplates[key] = value;\n }\n });\n\n return filteredTemplates;\n}\n\n","/**\n * 配置服务工厂函数\n *\n * 提供便捷的工厂函数来创建 ConfigService 和 ConfigEngine 实例\n */\n\nimport { ConfigService, type ConfigServiceOptions } from './service';\nimport { ConfigEngine, type ConfigEngineOptions } from './engine';\n\n/**\n * 创建 ConfigService 实例的工厂函数\n */\nexport function createConfigService(options: ConfigServiceOptions): ConfigService {\n return new ConfigService(options);\n}\n\n/**\n * 创建 ConfigEngine 实例的工厂函数\n */\nexport function createConfigEngine(options: ConfigEngineOptions): ConfigEngine {\n return new ConfigEngine(options);\n}\n\n/**\n * 创建全局单例的 ConfigService 工厂\n *\n * @example\n * ```typescript\n * const getConfigService = createGlobalConfigService({\n * db,\n * tables: { systemConfigs, configMetadata, configHistory }\n * });\n *\n * // 在任何地方使用\n * const service = getConfigService();\n * ```\n */\nexport function createGlobalConfigService(options: ConfigServiceOptions): () => ConfigService {\n let instance: ConfigService | null = null;\n\n return () => {\n if (!instance) {\n instance = new ConfigService(options);\n }\n return instance;\n };\n}\n\n/**\n * 创建全局单例的 ConfigEngine 工厂\n *\n * @example\n * ```typescript\n * const getConfigEngine = createGlobalConfigEngine({\n * db,\n * tables: { systemConfigs, configDefinitions, configHistory }\n * });\n *\n * // 在任何地方使用\n * const engine = getConfigEngine();\n * await engine.initialize();\n * ```\n */\nexport function createGlobalConfigEngine(options: ConfigEngineOptions): () => ConfigEngine {\n let instance: ConfigEngine | null = null;\n let isInitializing = false;\n\n return () => {\n if (!instance) {\n instance = new ConfigEngine(options);\n\n // 自动初始化(仅一次)\n if (!isInitializing) {\n isInitializing = true;\n instance.initialize().catch((error) => {\n console.error('[ConfigEngine] 初始化失败:', error);\n });\n }\n }\n return instance;\n };\n}\n\n\n\n\n\n\n\n\n","/**\n * 数据库连接配置管理\n *\n * 注意:这些配置应该从环境变量读取,不存储在数据库中\n * 因为它们是连接数据库本身所需的基础配置\n */\n\nexport interface DatabaseConnectionConfig {\n host: string;\n port: number;\n database: string;\n username: string;\n password: string;\n ssl?: boolean;\n poolSize?: number;\n queryTimeout?: number;\n}\n\nexport interface RedisConnectionConfig {\n host: string;\n port: number;\n password?: string;\n database?: number;\n keyPrefix?: string;\n}\n\n/**\n * 从环境变量解析数据库连接配置\n */\nexport function getDatabaseConfig(): DatabaseConnectionConfig {\n const databaseUrl = process.env.DATABASE_URL;\n\n if (databaseUrl) {\n // 解析 DATABASE_URL\n const url = new URL(databaseUrl);\n return {\n host: url.hostname,\n port: parseInt(url.port) || 5432,\n database: url.pathname.slice(1), // 移除开头的 /\n username: url.username,\n password: url.password,\n ssl: url.searchParams.get('sslmode') === 'require',\n poolSize: parseInt(process.env.DB_POOL_SIZE || '10'),\n queryTimeout: parseInt(process.env.DB_QUERY_TIMEOUT || '30000'),\n };\n }\n\n // 兜底:从单独的环境变量读取\n return {\n host: process.env.DB_HOST || process.env.POSTGRES_HOST || 'localhost',\n port: parseInt(process.env.DB_PORT || process.env.POSTGRES_PORT || '5432'),\n database: process.env.DB_NAME || process.env.POSTGRES_DB || 'lyricnote',\n username: process.env.DB_USER || process.env.POSTGRES_USER || 'lyricnote',\n password: process.env.DB_PASSWORD || process.env.POSTGRES_PASSWORD || '',\n ssl: process.env.DB_SSL === 'true',\n poolSize: parseInt(process.env.DB_POOL_SIZE || '10'),\n queryTimeout: parseInt(process.env.DB_QUERY_TIMEOUT || '30000'),\n };\n}\n\n/**\n * 从环境变量解析 Redis 连接配置\n */\nexport function getRedisConfig(): RedisConnectionConfig {\n const redisUrl = process.env.REDIS_URL;\n\n if (redisUrl) {\n const url = new URL(redisUrl);\n return {\n host: url.hostname,\n port: parseInt(url.port) || 6379,\n password: url.password || undefined,\n database: parseInt(url.pathname.slice(1)) || 0,\n keyPrefix: process.env.REDIS_KEY_PREFIX || 'lyricnote:',\n };\n }\n\n return {\n host: process.env.REDIS_HOST || 'localhost',\n port: parseInt(process.env.REDIS_PORT || '6379'),\n password: process.env.REDIS_PASSWORD || undefined,\n database: parseInt(process.env.REDIS_DB || '0'),\n keyPrefix: process.env.REDIS_KEY_PREFIX || 'lyricnote:',\n };\n}\n\n/**\n * 生成数据库连接 URL\n */\nexport function buildDatabaseUrl(config: DatabaseConnectionConfig): string {\n const { host, port, database, username, password, ssl } = config;\n let url = `postgresql://${username}:${password}@${host}:${port}/${database}`;\n\n if (ssl) {\n url += '?sslmode=require';\n }\n\n return url;\n}\n\n/**\n * 生成 Redis 连接 URL\n */\nexport function buildRedisUrl(config: RedisConnectionConfig): string {\n const { host, port, password, database } = config;\n let url = `redis://`;\n\n if (password) {\n url += `:${password}@`;\n }\n\n url += `${host}:${port}`;\n\n if (database && database !== 0) {\n url += `/${database}`;\n }\n\n return url;\n}\n\n/**\n * 验证数据库连接配置\n */\nexport function validateDatabaseConfig(config: DatabaseConnectionConfig): string[] {\n const errors: string[] = [];\n\n if (!config.host) errors.push('数据库主机地址不能为空');\n if (!config.port || config.port < 1 || config.port > 65535) errors.push('数据库端口号无效');\n if (!config.database) errors.push('数据库名不能为空');\n if (!config.username) errors.push('数据库用户名不能为空');\n if (!config.password) errors.push('数据库密码不能为空');\n\n return errors;\n}\n\n/**\n * 显示数据库连接配置(用于管理界面只读显示)\n * 敏感信息会被掩码处理\n */\nexport function getDatabaseConfigForDisplay(): Record<string, any> {\n const config = getDatabaseConfig();\n\n return {\n // 只显示非敏感信息\n host: config.host,\n port: config.port,\n database: config.database,\n username: config.username,\n password: config.password ? '***' : '',\n ssl: config.ssl || false,\n poolSize: config.poolSize,\n queryTimeout: config.queryTimeout,\n // 连接状态\n connectionString: `postgresql://${config.username}:***@${config.host}:${config.port}/${config.database}`,\n source: process.env.DATABASE_URL ? 'DATABASE_URL' : 'Environment Variables',\n };\n}\n\n\n\n\n\n\n\n\n"]}