mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
searchEvents: fix account_id, simplify code
This commit is contained in:
parent
4ae17c4993
commit
8890f6bce5
1 changed files with 27 additions and 25 deletions
|
|
@ -80,7 +80,12 @@ async function searchEvents(
|
||||||
{ q, type, limit, account_id, viewerPubkey }: SearchQuery & { viewerPubkey?: string },
|
{ q, type, limit, account_id, viewerPubkey }: SearchQuery & { viewerPubkey?: string },
|
||||||
signal: AbortSignal,
|
signal: AbortSignal,
|
||||||
): Promise<NostrEvent[]> {
|
): Promise<NostrEvent[]> {
|
||||||
if (type === 'hashtags') return Promise.resolve([]);
|
// Hashtag search is not supported.
|
||||||
|
if (type === 'hashtags') {
|
||||||
|
return Promise.resolve([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const store = await Storages.search();
|
||||||
|
|
||||||
const filter: NostrFilter = {
|
const filter: NostrFilter = {
|
||||||
kinds: typeToKinds(type),
|
kinds: typeToKinds(type),
|
||||||
|
|
@ -88,36 +93,33 @@ async function searchEvents(
|
||||||
limit,
|
limit,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// For account search, use a special index, and prioritize followed accounts.
|
||||||
|
if (type === 'accounts') {
|
||||||
|
const kysely = await Storages.kysely();
|
||||||
|
|
||||||
|
const followedPubkeys = viewerPubkey ? await getFollowedPubkeys(viewerPubkey) : new Set<string>();
|
||||||
|
const searchPubkeys = await getPubkeysBySearch(kysely, { q, limit, followedPubkeys });
|
||||||
|
|
||||||
|
filter.authors = [...searchPubkeys];
|
||||||
|
filter.search = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Results should only be shown from one author.
|
||||||
if (account_id) {
|
if (account_id) {
|
||||||
filter.authors = [account_id];
|
filter.authors = [account_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
let pubkeys: Set<string> = new Set();
|
// Query the events.
|
||||||
if (type === 'accounts') {
|
let events = await store
|
||||||
const kysely = await Storages.kysely();
|
.query([filter], { signal })
|
||||||
|
|
||||||
const followedPubkeys: Set<string> = viewerPubkey ? await getFollowedPubkeys(viewerPubkey) : new Set();
|
|
||||||
pubkeys = pubkeys.union(await getPubkeysBySearch(kysely, { q, limit, followedPubkeys }));
|
|
||||||
|
|
||||||
if (!filter?.authors) {
|
|
||||||
filter.authors = Array.from(pubkeys);
|
|
||||||
} else {
|
|
||||||
filter.authors.push(...pubkeys);
|
|
||||||
}
|
|
||||||
|
|
||||||
filter.search = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const store = await Storages.search();
|
|
||||||
|
|
||||||
let events = await store.query([filter], { signal })
|
|
||||||
.then((events) => hydrateEvents({ events, store, signal }));
|
.then((events) => hydrateEvents({ events, store, signal }));
|
||||||
|
|
||||||
if (type !== 'accounts') return events;
|
// When using an authors filter, return the events in the same order as the filter.
|
||||||
|
if (filter.authors) {
|
||||||
events = Array.from(pubkeys)
|
events = filter.authors
|
||||||
.map((pubkey) => events.find((event) => event.pubkey === pubkey))
|
.map((pubkey) => events.find((event) => event.pubkey === pubkey))
|
||||||
.filter((event) => !!event);
|
.filter((event) => !!event);
|
||||||
|
}
|
||||||
|
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue