mirror of
https://github.com/Blah-IM/Weblah.git
synced 2025-05-01 08:41:08 +00:00
feat: profile store
This commit is contained in:
parent
2771381a13
commit
71a7a3c76e
2 changed files with 57 additions and 1 deletions
|
@ -1,7 +1,7 @@
|
||||||
import { BlahKeyPair, BlahPublicKey, type EncodedBlahKeyPair } from '@blah-im/core/crypto';
|
import { BlahKeyPair, BlahPublicKey, type EncodedBlahKeyPair } from '@blah-im/core/crypto';
|
||||||
import { openDB, type DBSchema, type IDBPDatabase } from 'idb';
|
import { openDB, type DBSchema, type IDBPDatabase } from 'idb';
|
||||||
|
|
||||||
const IDB_NAME = 'blah-accounts';
|
const IDB_NAME = 'weblah-accounts';
|
||||||
const IDB_OBJECT_STORE_NAME = 'accounts';
|
const IDB_OBJECT_STORE_NAME = 'accounts';
|
||||||
|
|
||||||
type SavedObject = {
|
type SavedObject = {
|
||||||
|
|
56
src/lib/profileStore.ts
Normal file
56
src/lib/profileStore.ts
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
import type { BlahProfile } from '@blah-im/core/identity';
|
||||||
|
import { openDB, type DBSchema, type IDBPDatabase } from 'idb';
|
||||||
|
|
||||||
|
const IDB_NAME = 'weblah-profiles';
|
||||||
|
const IDB_OBJECT_STORE_NAME = 'profiles';
|
||||||
|
|
||||||
|
const PROFILE_MAX_AGE = 1000 * 60 * 60 * 24 * 30; // 30 days
|
||||||
|
|
||||||
|
interface ProfileStoreDB extends DBSchema {
|
||||||
|
[IDB_OBJECT_STORE_NAME]: {
|
||||||
|
key: string;
|
||||||
|
value: BlahProfile & { idKeyId: string; lastUpdatedAt: Date };
|
||||||
|
indexes: { id_urls: string };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ProfileStore {
|
||||||
|
private db: IDBPDatabase<ProfileStoreDB>;
|
||||||
|
|
||||||
|
private constructor(db: IDBPDatabase<ProfileStoreDB>) {
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async open(): Promise<ProfileStore> {
|
||||||
|
const db = await openDB<ProfileStoreDB>(IDB_NAME, 1, {
|
||||||
|
upgrade(db) {
|
||||||
|
if (!db.objectStoreNames.contains(IDB_OBJECT_STORE_NAME)) {
|
||||||
|
const store = db.createObjectStore(IDB_OBJECT_STORE_NAME, { keyPath: 'idKeyId' });
|
||||||
|
store.createIndex('id_urls', 'id_urls', { multiEntry: true, unique: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const store = new ProfileStore(db);
|
||||||
|
await store.removeOldProfiles();
|
||||||
|
return store;
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateProfile(idKeyId: string, profile: BlahProfile): Promise<void> {
|
||||||
|
await this.db.put(IDB_OBJECT_STORE_NAME, { idKeyId, ...profile, lastUpdatedAt: new Date() });
|
||||||
|
}
|
||||||
|
|
||||||
|
async getProfile(idKeyId: string): Promise<BlahProfile | undefined> {
|
||||||
|
return await this.db.get(IDB_OBJECT_STORE_NAME, idKeyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getProfileByIdUrl(idUrl: string): Promise<BlahProfile | undefined> {
|
||||||
|
return await this.db.getFromIndex(IDB_OBJECT_STORE_NAME, 'id_urls', idUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeOldProfiles(): Promise<void> {
|
||||||
|
const now = new Date();
|
||||||
|
const cutoff = new Date(now.getTime() - PROFILE_MAX_AGE);
|
||||||
|
await this.db.delete(IDB_OBJECT_STORE_NAME, IDBKeyRange.upperBound(cutoff));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue