Merge branch 'feat-create-user-store' into 'main'
Create a UserStore class See merge request soapbox-pub/ditto!184
This commit is contained in:
commit
7e053fbeea
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"id": "5f2236e745f47116ee8d869658ebc732a8a35fdeb30a876f46c8c0fef9ae0309",
|
||||||
|
"pubkey": "32b8276794dec3934fd7ddd2a97b5ee10ecef493441a55e83d838ccd98c58b7a",
|
||||||
|
"created_at": 1713966213,
|
||||||
|
"kind": 0,
|
||||||
|
"tags": [],
|
||||||
|
"content": "{\"name\":\"black\",\"about\":\"\",\"nip05\":\"\"}",
|
||||||
|
"sig": "bab454ca68332663c4c17591eb8ea993f78be7787da9e0c5ed140b21059e9fe3c12a5998fcefa94b1129934f798a649bac222b6051a9ea1ce8a01f9620c825e0"
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"id": "4aa67b0b7829d555a42b1f57f8033e6f0cda87a63b5bf5a0d5e10fbb9e7ab107",
|
||||||
|
"pubkey": "32b8276794dec3934fd7ddd2a97b5ee10ecef493441a55e83d838ccd98c58b7a",
|
||||||
|
"created_at": 1713997559,
|
||||||
|
"kind": 10000,
|
||||||
|
"tags": [
|
||||||
|
[
|
||||||
|
"p",
|
||||||
|
"2894578b2c8570825f48dc647e746e690f83f92d19446b3051f59cd0196a7991"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"content": "",
|
||||||
|
"sig": "9fa697cf5353cc82a7d1b3304c3d41e51e30547035a4c8fb25d3f5c9f378d43a30935b523c0a9671a2c61d36eff530f3f3fcfbb77440589649e5f2aa306df039"
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
import userBlack from '~/fixtures/events/kind-0-black.json' with { type: 'json' };
|
||||||
|
import userMe from '~/fixtures/events/event-0-makes-repost-with-quote-repost.json' with { type: 'json' };
|
||||||
|
import blockEvent from '~/fixtures/events/kind-10000-black-blocks-user-me.json' with { type: 'json' };
|
||||||
|
import event1authorUserMe from '~/fixtures/events/event-1-quote-repost-will-be-reposted.json' with { type: 'json' };
|
||||||
|
import { NCache } from 'jsr:@nostrify/nostrify';
|
||||||
|
import { UserStore } from '@/storages/UserStore.ts';
|
||||||
|
import { assertEquals } from '@/deps-test.ts';
|
||||||
|
|
||||||
|
Deno.test('query events of users that are not blocked', async () => {
|
||||||
|
const userBlackCopy = structuredClone(userBlack);
|
||||||
|
const userMeCopy = structuredClone(userMe);
|
||||||
|
const blockEventCopy = structuredClone(blockEvent);
|
||||||
|
const event1authorUserMeCopy = structuredClone(event1authorUserMe);
|
||||||
|
|
||||||
|
const db = new NCache({ max: 100 });
|
||||||
|
|
||||||
|
const store = new UserStore(userBlackCopy.pubkey, db);
|
||||||
|
|
||||||
|
await store.event(blockEventCopy);
|
||||||
|
await store.event(userBlackCopy);
|
||||||
|
await store.event(userMeCopy);
|
||||||
|
await store.event(event1authorUserMeCopy);
|
||||||
|
|
||||||
|
assertEquals(await store.query([{ kinds: [1] }], { limit: 1 }), []);
|
||||||
|
});
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { NostrEvent, NostrFilter, NStore } from '@nostrify/nostrify';
|
||||||
|
import { DittoEvent } from '@/interfaces/DittoEvent.ts';
|
||||||
|
import { getTagSet } from '@/tags.ts';
|
||||||
|
|
||||||
|
export class UserStore implements NStore {
|
||||||
|
private store: NStore;
|
||||||
|
private pubkey: string;
|
||||||
|
|
||||||
|
constructor(pubkey: string, store: NStore) {
|
||||||
|
this.pubkey = pubkey;
|
||||||
|
this.store = store;
|
||||||
|
}
|
||||||
|
|
||||||
|
async event(event: NostrEvent, opts?: { signal?: AbortSignal }): Promise<void> {
|
||||||
|
return await this.store.event(event, opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query events that `pubkey` did not block
|
||||||
|
* https://github.com/nostr-protocol/nips/blob/master/51.md#standard-lists
|
||||||
|
*/
|
||||||
|
async query(filters: NostrFilter[], opts: { signal?: AbortSignal; limit?: number } = {}): Promise<DittoEvent[]> {
|
||||||
|
const allEvents = await this.store.query(filters, opts);
|
||||||
|
|
||||||
|
const mutedPubkeysEvent = await this.getMuteList();
|
||||||
|
if (!mutedPubkeysEvent) {
|
||||||
|
return allEvents;
|
||||||
|
}
|
||||||
|
const mutedPubkeys = getTagSet(mutedPubkeysEvent.tags, 'p');
|
||||||
|
|
||||||
|
return allEvents.filter((event) => {
|
||||||
|
mutedPubkeys.has(event.pubkey) === false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getMuteList(): Promise<DittoEvent | undefined> {
|
||||||
|
const [muteList] = await this.store.query([{ authors: [this.pubkey], kinds: [10000], limit: 1 }]);
|
||||||
|
return muteList;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue