mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
feat: create getPubkeysBySearch() function and use it inside searchEvents() function
This commit is contained in:
parent
b5aefdd93e
commit
c03ea07dcb
1 changed files with 28 additions and 2 deletions
|
|
@ -1,8 +1,10 @@
|
||||||
import { NostrEvent, NostrFilter, NSchema as n } from '@nostrify/nostrify';
|
import { NostrEvent, NostrFilter, NSchema as n } from '@nostrify/nostrify';
|
||||||
import { nip19 } from 'nostr-tools';
|
import { nip19 } from 'nostr-tools';
|
||||||
|
import { Kysely, sql } from 'kysely';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
import { AppController } from '@/app.ts';
|
import { AppController } from '@/app.ts';
|
||||||
|
import { DittoTables } from '@/db/DittoTables.ts';
|
||||||
import { booleanParamSchema } from '@/schema.ts';
|
import { booleanParamSchema } from '@/schema.ts';
|
||||||
import { Storages } from '@/storages.ts';
|
import { Storages } from '@/storages.ts';
|
||||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||||
|
|
@ -89,9 +91,21 @@ async function searchEvents({ q, type, limit, account_id }: SearchQuery, signal:
|
||||||
filter.authors = [account_id];
|
filter.authors = [account_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const filter2: NostrFilter = {
|
||||||
|
kinds: [0],
|
||||||
|
limit,
|
||||||
|
};
|
||||||
|
if (type === 'accounts') {
|
||||||
|
const kysely = await Storages.kysely();
|
||||||
|
|
||||||
|
const pubkeys = await getPubkeysBySearch(kysely, { q, limit });
|
||||||
|
|
||||||
|
filter2.authors = pubkeys; // if pubkeys is empty the filter 2 will be discarded
|
||||||
|
}
|
||||||
|
|
||||||
const store = await Storages.search();
|
const store = await Storages.search();
|
||||||
|
|
||||||
return store.query([filter], { signal })
|
return store.query([filter, filter2], { signal })
|
||||||
.then((events) => hydrateEvents({ events, store, signal }));
|
.then((events) => hydrateEvents({ events, store, signal }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,4 +184,16 @@ async function getLookupFilters({ q, type, resolve }: SearchQuery, signal: Abort
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
export { searchController };
|
/** Get pubkeys whose name and NIP-05 is similar to 'q' */
|
||||||
|
async function getPubkeysBySearch(kysely: Kysely<DittoTables>, { q, limit }: Pick<SearchQuery, 'q' | 'limit'>) {
|
||||||
|
const pubkeys = (await sql`
|
||||||
|
SELECT *, word_similarity(${q}, search) AS sml
|
||||||
|
FROM author_search
|
||||||
|
WHERE ${q} % search
|
||||||
|
ORDER BY sml DESC, search LIMIT ${limit}
|
||||||
|
`.execute(kysely)).rows.map((row) => (row as { pubkey: string }).pubkey);
|
||||||
|
|
||||||
|
return pubkeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { getPubkeysBySearch, searchController };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue