Files
pixiv/backend/config/config-manager.js
T

214 lines
5.4 KiB
JavaScript

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