fix d1设备管理

This commit is contained in:
mtvpls
2026-01-30 17:00:05 +08:00
parent cbc52adc0e
commit ca18aef7c4

View File

@@ -33,9 +33,12 @@ import { DatabaseAdapter } from './d1-adapter';
*/
export class D1Storage implements IStorage {
private db: DatabaseAdapter;
public adapter: RedisHashAdapter;
constructor(adapter: DatabaseAdapter) {
this.db = adapter;
// 创建 Redis Hash 兼容适配器用于设备管理
this.adapter = new RedisHashAdapter(adapter);
}
// ==================== 播放记录 ====================
@@ -1478,3 +1481,97 @@ export class D1Storage implements IStorage {
}
}
}
/**
* Redis Hash 兼容适配器
* 用于支持设备管理功能refresh token 存储)
*
* 使用 global_config 表模拟 Redis Hash 操作
* key 格式user_tokens:{username}:{tokenId}
*/
class RedisHashAdapter {
constructor(private db: DatabaseAdapter) {}
/**
* 设置 Hash 字段
* Redis: HSET key field value
* D1: INSERT/UPDATE global_config
*/
async hSet(hashKey: string, field: string, value: string): Promise<void> {
const key = `${hashKey}:${field}`;
await this.db
.prepare(`
INSERT INTO global_config (key, value, updated_at)
VALUES (?, ?, ?)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
`)
.bind(key, value, Date.now())
.run();
}
/**
* 获取 Hash 字段
* Redis: HGET key field
* D1: SELECT from global_config
*/
async hGet(hashKey: string, field: string): Promise<string | null> {
const key = `${hashKey}:${field}`;
const result = await this.db
.prepare('SELECT value FROM global_config WHERE key = ?')
.bind(key)
.first();
return result ? (result.value as string) : null;
}
/**
* 获取 Hash 所有字段
* Redis: HGETALL key
* D1: SELECT all matching keys
*/
async hGetAll(hashKey: string): Promise<Record<string, string>> {
const prefix = `${hashKey}:`;
const results = await this.db
.prepare('SELECT key, value FROM global_config WHERE key LIKE ?')
.bind(`${prefix}%`)
.all();
const hash: Record<string, string> = {};
if (results && results.results) {
for (const row of results.results) {
const fullKey = row.key as string;
const field = fullKey.substring(prefix.length);
hash[field] = row.value as string;
}
}
return hash;
}
/**
* 删除 Hash 字段
* Redis: HDEL key field
* D1: DELETE from global_config
*/
async hDel(hashKey: string, field: string): Promise<void> {
const key = `${hashKey}:${field}`;
await this.db
.prepare('DELETE FROM global_config WHERE key = ?')
.bind(key)
.run();
}
/**
* 删除整个 Hash
* Redis: DEL key
* D1: DELETE all matching keys
*/
async del(hashKey: string): Promise<void> {
const prefix = `${hashKey}:`;
await this.db
.prepare('DELETE FROM global_config WHERE key LIKE ?')
.bind(`${prefix}%`)
.run();
}
}