188 lines
4.9 KiB
TypeScript
188 lines
4.9 KiB
TypeScript
/* 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<PlayRecord | null> {
|
||
const key = generateStorageKey(source, id);
|
||
return this.storage.getPlayRecord(userName, key);
|
||
}
|
||
|
||
async savePlayRecord(
|
||
userName: string,
|
||
source: string,
|
||
id: string,
|
||
record: PlayRecord
|
||
): Promise<void> {
|
||
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<void> {
|
||
const key = generateStorageKey(source, id);
|
||
await this.storage.deletePlayRecord(userName, key);
|
||
}
|
||
|
||
// 收藏相关方法
|
||
async getFavorite(
|
||
userName: string,
|
||
source: string,
|
||
id: string
|
||
): Promise<Favorite | null> {
|
||
const key = generateStorageKey(source, id);
|
||
return this.storage.getFavorite(userName, key);
|
||
}
|
||
|
||
async saveFavorite(
|
||
userName: string,
|
||
source: string,
|
||
id: string,
|
||
favorite: Favorite
|
||
): Promise<void> {
|
||
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<void> {
|
||
const key = generateStorageKey(source, id);
|
||
await this.storage.deleteFavorite(userName, key);
|
||
}
|
||
|
||
async isFavorited(
|
||
userName: string,
|
||
source: string,
|
||
id: string
|
||
): Promise<boolean> {
|
||
const favorite = await this.getFavorite(userName, source, id);
|
||
return favorite !== null;
|
||
}
|
||
|
||
// ---------- 用户相关 ----------
|
||
async registerUser(userName: string, password: string): Promise<void> {
|
||
await this.storage.registerUser(userName, password);
|
||
}
|
||
|
||
async verifyUser(userName: string, password: string): Promise<boolean> {
|
||
return this.storage.verifyUser(userName, password);
|
||
}
|
||
|
||
// 检查用户是否已存在
|
||
async checkUserExist(userName: string): Promise<boolean> {
|
||
return this.storage.checkUserExist(userName);
|
||
}
|
||
|
||
// ---------- 搜索历史 ----------
|
||
async getSearchHistory(userName: string): Promise<string[]> {
|
||
return this.storage.getSearchHistory(userName);
|
||
}
|
||
|
||
async addSearchHistory(userName: string, keyword: string): Promise<void> {
|
||
await this.storage.addSearchHistory(userName, keyword);
|
||
}
|
||
|
||
async deleteSearchHistory(userName: string, keyword?: string): Promise<void> {
|
||
await this.storage.deleteSearchHistory(userName, keyword);
|
||
}
|
||
|
||
// 获取全部用户名
|
||
async getAllUsers(): Promise<string[]> {
|
||
if (typeof (this.storage as any).getAllUsers === 'function') {
|
||
return (this.storage as any).getAllUsers();
|
||
}
|
||
return [];
|
||
}
|
||
|
||
// ---------- 管理员配置 ----------
|
||
async getAdminConfig(): Promise<AdminConfig | null> {
|
||
if (typeof (this.storage as any).getAdminConfig === 'function') {
|
||
return (this.storage as any).getAdminConfig();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
async saveAdminConfig(config: AdminConfig): Promise<void> {
|
||
if (typeof (this.storage as any).setAdminConfig === 'function') {
|
||
await (this.storage as any).setAdminConfig(config);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 导出默认实例
|
||
export const db = new DbManager();
|