diff --git a/src/app.ts b/src/app.ts index c1b901b4..8cdbabe6 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,9 +4,11 @@ import { serveStatic } from '@hono/hono/deno'; import { logger } from '@hono/hono/logger'; import { NostrEvent, NostrSigner, NStore, NUploader } from '@nostrify/nostrify'; import Debug from '@soapbox/stickynotes/debug'; +import { Kysely } from 'kysely'; import '@/startup.ts'; +import { DittoTables } from '@/db/DittoTables.ts'; import { Time } from '@/utils/time.ts'; import { @@ -133,7 +135,7 @@ import { storeMiddleware } from '@/middleware/storeMiddleware.ts'; import { uploaderMiddleware } from '@/middleware/uploaderMiddleware.ts'; import { translatorMiddleware } from '@/middleware/translatorMiddleware.ts'; -interface AppEnv extends HonoEnv { +export interface AppEnv extends HonoEnv { Variables: { /** Signer to get the logged-in user's pubkey, relays, and to sign events, or `undefined` if the user isn't logged in. */ signer?: NostrSigner; @@ -141,6 +143,8 @@ interface AppEnv extends HonoEnv { uploader?: NUploader; /** NIP-98 signed event proving the pubkey is owned by the user. */ proof?: NostrEvent; + /** Kysely instance for the database. */ + kysely: Kysely; /** Storage for the user, might filter out unwanted content. */ store: NStore; /** Normalized pagination params. */ diff --git a/src/controllers/api/push.test.ts b/src/controllers/api/push.test.ts new file mode 100644 index 00000000..0b7ed885 --- /dev/null +++ b/src/controllers/api/push.test.ts @@ -0,0 +1,31 @@ +import { Hono } from '@hono/hono'; +import { NSecSigner } from '@nostrify/nostrify'; +import { generateSecretKey } from 'nostr-tools'; + +import { type AppEnv } from '@/app.ts'; +import { createTestDB } from '@/test.ts'; +import { pushSubscribeController } from '@/controllers/api/push.ts'; +import { assertEquals } from '@std/assert'; + +Deno.test('POST /api/v1/push/subscription creates the subscription in the database', async () => { + await using db = await createTestDB(); + const signer = new NSecSigner(generateSecretKey()); + + const app = new Hono().all((c) => { + c.set('kysely', db.kysely); + c.set('store', db.store); + c.set('signer', signer); + }, pushSubscribeController); + + const response = await app.request('/api/v1/push/subscription', { + body: JSON.stringify({ + endpoint: 'https://example.com', + keys: { + p256dh: 'p256dh', + auth: 'auth', + }, + }), + }); + + assertEquals(response.status, 200); +});