/* eslint-disable no-console, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ import { AdminConfig } from './admin.types'; import { D1Storage } from './d1.db'; import { RedisStorage } from './redis.db'; import { Favorite, IStorage, PlayRecord } from './types'; import { UpstashRedisStorage } from './upstash.db'; // storage type 常量: 'localstorage' | 'redis' | 'd1' | 'upstash',默认 'localstorage' const STORAGE_TYPE = (process.env.NEXT_PUBLIC_STORAGE_TYPE as | 'localstorage' | 'redis' | 'd1' | 'upstash' | undefined) || 'localstorage'; // 创建存储实例 function createStorage(): IStorage { switch (STORAGE_TYPE) { case 'redis': return new RedisStorage(); case 'upstash': return new UpstashRedisStorage(); case 'd1': return new D1Storage(); case 'localstorage': default: // 默认返回内存实现,保证本地开发可用 return null as unknown as IStorage; } } // 单例存储实例 let storageInstance: IStorage | null = null; export function getStorage(): IStorage { if (!storageInstance) { storageInstance = createStorage(); } return storageInstance; } // 工具函数:生成存储key export function generateStorageKey(source: string, id: string): string { return `${source}+${id}`; } // 导出便捷方法 export class DbManager { private storage: IStorage; constructor() { this.storage = getStorage(); } // 播放记录相关方法 async getPlayRecord( userName: string, source: string, id: string ): Promise { const key = generateStorageKey(source, id); return this.storage.getPlayRecord(userName, key); } async savePlayRecord( userName: string, source: string, id: string, record: PlayRecord ): Promise { const key = generateStorageKey(source, id); await this.storage.setPlayRecord(userName, key, record); } async getAllPlayRecords(userName: string): Promise<{ [key: string]: PlayRecord; }> { return this.storage.getAllPlayRecords(userName); } async deletePlayRecord( userName: string, source: string, id: string ): Promise { const key = generateStorageKey(source, id); await this.storage.deletePlayRecord(userName, key); } // 收藏相关方法 async getFavorite( userName: string, source: string, id: string ): Promise { const key = generateStorageKey(source, id); return this.storage.getFavorite(userName, key); } async saveFavorite( userName: string, source: string, id: string, favorite: Favorite ): Promise { const key = generateStorageKey(source, id); await this.storage.setFavorite(userName, key, favorite); } async getAllFavorites( userName: string ): Promise<{ [key: string]: Favorite }> { return this.storage.getAllFavorites(userName); } async deleteFavorite( userName: string, source: string, id: string ): Promise { const key = generateStorageKey(source, id); await this.storage.deleteFavorite(userName, key); } async isFavorited( userName: string, source: string, id: string ): Promise { const favorite = await this.getFavorite(userName, source, id); return favorite !== null; } // ---------- 用户相关 ---------- async registerUser(userName: string, password: string): Promise { await this.storage.registerUser(userName, password); } async verifyUser(userName: string, password: string): Promise { return this.storage.verifyUser(userName, password); } // 检查用户是否已存在 async checkUserExist(userName: string): Promise { return this.storage.checkUserExist(userName); } // ---------- 搜索历史 ---------- async getSearchHistory(userName: string): Promise { return this.storage.getSearchHistory(userName); } async addSearchHistory(userName: string, keyword: string): Promise { await this.storage.addSearchHistory(userName, keyword); } async deleteSearchHistory(userName: string, keyword?: string): Promise { await this.storage.deleteSearchHistory(userName, keyword); } // 获取全部用户名 async getAllUsers(): Promise { if (typeof (this.storage as any).getAllUsers === 'function') { return (this.storage as any).getAllUsers(); } return []; } // ---------- 管理员配置 ---------- async getAdminConfig(): Promise { if (typeof (this.storage as any).getAdminConfig === 'function') { return (this.storage as any).getAdminConfig(); } return null; } async saveAdminConfig(config: AdminConfig): Promise { if (typeof (this.storage as any).setAdminConfig === 'function') { await (this.storage as any).setAdminConfig(config); } } } // 导出默认实例 export const db = new DbManager();