const fs = require('fs').promises const path = require('path') const { defaultLogger } = require('../utils/logger'); // 创建logger实例 const logger = defaultLogger.child('ConfigManager'); /** * 配置管理器 * 负责自动生成和管理用户配置文件 */ class ConfigManager { constructor() { // 检测是否在pkg打包环境中运行 const isPkg = process.pkg !== undefined; if (isPkg) { // 在打包环境中,使用可执行文件所在目录 this.configDir = path.join(process.cwd(), 'data', 'user-config.json') } else { // 在开发环境中,使用相对路径 this.configDir = path.join(__dirname, 'user-config.json') } // 确保配置目录存在 this.ensureConfigDir() this.defaultConfig = { downloadDir: "./downloads", fileStructure: "artist/artwork", namingPattern: "{artist_name}/{artwork_id}_{title}", maxFileSize: 0, allowedExtensions: [".jpg", ".png", ".gif", ".webp"], autoMigration: false, migrationRules: [], lastUpdated: new Date().toISOString() } } /** * 确保配置目录存在 */ ensureConfigDir() { try { const configDirPath = path.dirname(this.configDir) if (!require('fs').existsSync(configDirPath)) { require('fs').mkdirSync(configDirPath, { recursive: true }) logger.info('配置目录创建成功') } } catch (error) { logger.error('创建配置目录失败:', error) } } /** * 初始化配置文件 * 如果配置文件不存在,则创建默认配置 */ async initialize() { try { // 检查配置文件是否存在 await fs.access(this.configDir) logger.info('用户配置文件已存在') } catch (error) { // 配置文件不存在,创建默认配置 logger.info('创建默认用户配置文件...') await this.createDefaultConfig() } } /** * 创建默认配置文件 */ async createDefaultConfig() { try { // 确保配置目录存在 const configDirPath = path.dirname(this.configDir) await fs.mkdir(configDirPath, { recursive: true }) // 检查目录是否创建成功 try { await fs.access(configDirPath) logger.info('配置目录确认存在') } catch (accessError) { logger.error('配置目录访问失败:', accessError) throw new Error(`无法访问配置目录: ${configDirPath}`) } // 写入默认配置 const configContent = JSON.stringify(this.defaultConfig, null, 2) await fs.writeFile(this.configDir, configContent, 'utf8') // 验证文件是否写入成功 try { await fs.access(this.configDir) logger.info('默认配置文件创建成功') } catch (verifyError) { logger.error('配置文件验证失败:', verifyError) throw new Error('配置文件创建后无法访问') } } catch (error) { logger.error('创建默认配置文件失败:', error) throw error } } /** * 读取配置文件 */ async readConfig() { try { // 首先检查文件是否存在 const exists = await this.configExists() if (!exists) { logger.info('配置文件不存在,创建默认配置...') await this.createDefaultConfig() } const configData = await fs.readFile(this.configDir, 'utf8') const config = JSON.parse(configData) // 合并默认配置,确保所有必要的字段都存在 return { ...this.defaultConfig, ...config } } catch (error) { logger.error('读取配置文件失败:', error) logger.info('使用默认配置...') // 如果读取失败,尝试创建默认配置 try { await this.createDefaultConfig() return { ...this.defaultConfig } } catch (createError) { logger.error('创建默认配置也失败:', createError) // 最后返回内存中的默认配置 return { ...this.defaultConfig } } } } /** * 保存配置文件 */ async saveConfig(config) { try { // 添加更新时间 const configToSave = { ...config, lastUpdated: new Date().toISOString() } await fs.writeFile( this.configDir, JSON.stringify(configToSave, null, 2), 'utf8' ) logger.info('配置文件保存成功') return true } catch (error) { logger.error('保存配置文件失败:', error) throw error } } /** * 更新配置 */ async updateConfig(updates) { try { const currentConfig = await this.readConfig() const newConfig = { ...currentConfig, ...updates } await this.saveConfig(newConfig) return newConfig } catch (error) { logger.error('更新配置失败:', error) throw error } } /** * 重置为默认配置 */ async resetToDefault() { try { await this.saveConfig(this.defaultConfig) logger.info('配置已重置为默认值') return this.defaultConfig } catch (error) { logger.error('重置配置失败:', error) throw error } } /** * 获取配置文件路径 */ getConfigPath() { return this.configDir } /** * 检查配置文件是否存在 */ async configExists() { try { await fs.access(this.configDir) return true } catch (error) { return false } } } module.exports = ConfigManager