71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
import Datastore from '@seald-io/nedb'
|
|
import { join } from 'path'
|
|
import { existsSync, mkdirSync } from 'fs'
|
|
|
|
// 数据目录:生产环境使用 /app/db,开发环境使用项目根目录下的 db
|
|
const dataDir = process.env.NODE_ENV === 'production'
|
|
? '/app/db'
|
|
: join(process.cwd(), 'db')
|
|
|
|
// 确保 db 目录存在
|
|
if (!existsSync(dataDir)) {
|
|
mkdirSync(dataDir, { recursive: true })
|
|
}
|
|
|
|
console.log('[Database] 数据目录:', dataDir)
|
|
|
|
// 创建数据库实例
|
|
const users = new Datastore({
|
|
filename: join(dataDir, 'users.db'),
|
|
autoload: true
|
|
})
|
|
|
|
const images = new Datastore({
|
|
filename: join(dataDir, 'images.db'),
|
|
autoload: true
|
|
})
|
|
|
|
const apikeys = new Datastore({
|
|
filename: join(dataDir, 'apikeys.db'),
|
|
autoload: true
|
|
})
|
|
|
|
const settings = new Datastore({
|
|
filename: join(dataDir, 'settings.db'),
|
|
autoload: true
|
|
})
|
|
|
|
// 内容审核任务表
|
|
const moderationTasks = new Datastore({
|
|
filename: join(dataDir, 'moderation_tasks.db'),
|
|
autoload: true
|
|
})
|
|
|
|
// IP 黑名单表
|
|
const ipBlacklist = new Datastore({
|
|
filename: join(dataDir, 'ip_blacklist.db'),
|
|
autoload: true
|
|
})
|
|
|
|
// Promise 化数据库操作
|
|
const promisify = (db) => ({
|
|
findOne: (query) => db.findOneAsync(query),
|
|
find: (query) => db.findAsync(query),
|
|
insert: (doc) => db.insertAsync(doc),
|
|
update: (query, update, options = {}) => db.updateAsync(query, update, options),
|
|
remove: (query, options = {}) => db.removeAsync(query, options),
|
|
count: (query) => db.countAsync(query),
|
|
ensureIndex: (options) => db.ensureIndexAsync(options)
|
|
})
|
|
|
|
export const db = {
|
|
users: promisify(users),
|
|
images: promisify(images),
|
|
apikeys: promisify(apikeys),
|
|
settings: promisify(settings),
|
|
moderationTasks: promisify(moderationTasks),
|
|
ipBlacklist: promisify(ipBlacklist)
|
|
}
|
|
|
|
export default db
|