From 96ff31719e991353a8c25cb46b4e906e40618ade Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 9 Sep 2023 15:48:03 -0500 Subject: [PATCH] db/events: pass EventData, index all media from local users --- src/db/events.test.ts | 8 ++++---- src/db/events.ts | 15 ++++++++++++--- src/pipeline.ts | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/db/events.test.ts b/src/db/events.test.ts index a9ab016..297813a 100644 --- a/src/db/events.test.ts +++ b/src/db/events.test.ts @@ -6,12 +6,12 @@ import { insertUser } from '@/db/users.ts'; Deno.test('count filters', async () => { assertEquals(await countFilters([{ kinds: [1] }]), 0); - await insertEvent(event55920b75); + await insertEvent(event55920b75, { user: undefined }); assertEquals(await countFilters([{ kinds: [1] }]), 1); }); Deno.test('insert and filter events', async () => { - await insertEvent(event55920b75); + await insertEvent(event55920b75, { user: undefined }); assertEquals(await getFilters([{ kinds: [1] }]), [event55920b75]); assertEquals(await getFilters([{ kinds: [3] }]), []); @@ -24,14 +24,14 @@ Deno.test('insert and filter events', async () => { }); Deno.test('delete events', async () => { - await insertEvent(event55920b75); + await insertEvent(event55920b75, { user: undefined }); assertEquals(await getFilters([{ kinds: [1] }]), [event55920b75]); await deleteFilters([{ kinds: [1] }]); assertEquals(await getFilters([{ kinds: [1] }]), []); }); Deno.test('query events with local filter', async () => { - await insertEvent(event55920b75); + await insertEvent(event55920b75, { user: undefined }); assertEquals(await getFilters([{}]), [event55920b75]); assertEquals(await getFilters([{ local: true }]), []); diff --git a/src/db/events.ts b/src/db/events.ts index 9686bf9..0516092 100644 --- a/src/db/events.ts +++ b/src/db/events.ts @@ -2,12 +2,14 @@ import { db, type TagRow } from '@/db.ts'; import { type Event, type Insertable, SqliteError } from '@/deps.ts'; import { isParameterizedReplaceableKind } from '@/kinds.ts'; import { jsonMetaContentSchema } from '@/schemas/nostr.ts'; +import { EventData } from '@/types.ts'; import { isNostrId, isURL } from '@/utils.ts'; import type { DittoFilter, GetFiltersOpts } from '@/filter.ts'; type TagCondition = ({ event, count, value }: { event: Event; + data: EventData; count: number; value: string; }) => boolean; @@ -16,7 +18,7 @@ type TagCondition = ({ event, count, value }: { const tagConditions: Record = { 'd': ({ event, count }) => count === 0 && isParameterizedReplaceableKind(event.kind), 'e': ({ count, value }) => count < 15 && isNostrId(value), - 'media': ({ count, value }) => count < 4 && isURL(value), + 'media': ({ count, value, data }) => (data.user || count < 4) && isURL(value), 'p': ({ event, count, value }) => (count < 15 || event.kind === 3) && isNostrId(value), 'proxy': ({ count, value }) => count === 0 && isURL(value), 'q': ({ event, count, value }) => count === 0 && event.kind === 1 && isNostrId(value), @@ -24,7 +26,7 @@ const tagConditions: Record = { }; /** Insert an event (and its tags) into the database. */ -function insertEvent(event: Event): Promise { +function insertEvent(event: Event, data: EventData): Promise { return db.transaction().execute(async (trx) => { await trx.insertInto('events') .values({ @@ -44,7 +46,14 @@ function insertEvent(event: Event): Promise { const tags = event.tags.reduce[]>((results, [name, value]) => { tagCounts[name] = (tagCounts[name] || 0) + 1; - if (value && value.length < 200 && tagConditions[name]?.({ event, count: tagCounts[name] - 1, value })) { + const shouldIndex = tagConditions[name]?.({ + event, + data, + count: tagCounts[name] - 1, + value, + }); + + if (value && value.length < 200 && shouldIndex) { results.push({ event_id: event.id, tag: name, diff --git a/src/pipeline.ts b/src/pipeline.ts index 38e3214..b556817 100644 --- a/src/pipeline.ts +++ b/src/pipeline.ts @@ -64,7 +64,7 @@ async function storeEvent(event: Event, data: EventData): Promise { if (deletion) { return Promise.reject(new RelayError('blocked', 'event was deleted')); } else { - await eventsDB.insertEvent(event).catch(console.warn); + await eventsDB.insertEvent(event, data).catch(console.warn); } } else { return Promise.reject(new RelayError('blocked', 'only registered users can post'));