From aabb20efa3bfcc6713e8fe8ccc77d82bb43d65ab Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 12 Feb 2025 23:04:08 -0600 Subject: [PATCH] Rework domain queries so allow querying all subdomains by base domain --- src/storages/EventsDB.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/storages/EventsDB.ts b/src/storages/EventsDB.ts index 96fe4e06..64876718 100644 --- a/src/storages/EventsDB.ts +++ b/src/storages/EventsDB.ts @@ -8,6 +8,7 @@ import { LanguageCode } from 'iso-639-1'; import { Kysely } from 'kysely'; import linkify from 'linkifyjs'; import { nip27 } from 'nostr-tools'; +import tldts from 'tldts'; import { z } from 'zod'; import { DittoTables } from '@/db/DittoTables.ts'; @@ -370,18 +371,36 @@ class EventsDB extends NPostgres { const tokens = NIP50.parseInput(filter.search); const domains = new Set(); + const hostnames = new Set(); for (const token of tokens) { if (typeof token === 'object' && token.key === 'domain') { - domains.add(token.value); + const { domain, hostname } = tldts.parse(token.value); + if (domain === hostname) { + domains.add(token.value); + } else { + hostnames.add(token.value); + } } } - if (domains.size) { + if (domains.size || hostnames.size) { let query = this.opts.kysely .selectFrom('author_stats') .select('pubkey') - .where('nip05_hostname', 'in', [...domains]); + .where((eb) => { + const expr = []; + if (domains.size) { + expr.push(eb('nip05_domain', 'in', [...domains])); + } + if (hostnames.size) { + expr.push(eb('nip05_hostname', 'in', [...hostnames])); + } + if (expr.length === 1) { + return expr[0]; + } + return eb.or(expr); + }); if (filter.authors) { query = query.where('pubkey', 'in', filter.authors);