From e128a7a322e0459f9ff47c4f013ee8a5bb6bedd9 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Thu, 2 Apr 2026 20:37:27 -0500 Subject: [PATCH] feat(gateway): wire adapter factories + DI tokens alongside existing providers Co-Authored-By: Claude Opus 4.6 --- apps/gateway/package.json | 1 + apps/gateway/src/database/database.module.ts | 21 +++++++++++++++++--- apps/gateway/src/memory/memory.module.ts | 10 ++++++++-- apps/gateway/src/queue/queue.module.ts | 17 ++++++++++++++-- pnpm-lock.yaml | 3 +++ 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/apps/gateway/package.json b/apps/gateway/package.json index ccd1183..97fed5c 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -25,6 +25,7 @@ "@mosaic/log": "workspace:^", "@mosaic/memory": "workspace:^", "@mosaic/queue": "workspace:^", + "@mosaic/storage": "workspace:^", "@mosaic/telegram-plugin": "workspace:^", "@mosaic/types": "workspace:^", "@nestjs/common": "^11.0.0", diff --git a/apps/gateway/src/database/database.module.ts b/apps/gateway/src/database/database.module.ts index 127f82e..39206a8 100644 --- a/apps/gateway/src/database/database.module.ts +++ b/apps/gateway/src/database/database.module.ts @@ -1,8 +1,12 @@ import { Global, Inject, Module, type OnApplicationShutdown } from '@nestjs/common'; import { createDb, type Db, type DbHandle } from '@mosaic/db'; +import { createStorageAdapter, type StorageAdapter } from '@mosaic/storage'; export const DB_HANDLE = 'DB_HANDLE'; export const DB = 'DB'; +export const STORAGE_ADAPTER = 'STORAGE_ADAPTER'; + +const DEFAULT_DATABASE_URL = 'postgresql://mosaic:mosaic@localhost:5432/mosaic'; @Global() @Module({ @@ -16,13 +20,24 @@ export const DB = 'DB'; useFactory: (handle: DbHandle): Db => handle.db, inject: [DB_HANDLE], }, + { + provide: STORAGE_ADAPTER, + useFactory: (): StorageAdapter => + createStorageAdapter({ + type: 'postgres', + url: process.env['DATABASE_URL'] ?? DEFAULT_DATABASE_URL, + }), + }, ], - exports: [DB], + exports: [DB, STORAGE_ADAPTER], }) export class DatabaseModule implements OnApplicationShutdown { - constructor(@Inject(DB_HANDLE) private readonly handle: DbHandle) {} + constructor( + @Inject(DB_HANDLE) private readonly handle: DbHandle, + @Inject(STORAGE_ADAPTER) private readonly storageAdapter: StorageAdapter, + ) {} async onApplicationShutdown(): Promise { - await this.handle.close(); + await Promise.all([this.handle.close(), this.storageAdapter.close()]); } } diff --git a/apps/gateway/src/memory/memory.module.ts b/apps/gateway/src/memory/memory.module.ts index 0108047..8b8d51b 100644 --- a/apps/gateway/src/memory/memory.module.ts +++ b/apps/gateway/src/memory/memory.module.ts @@ -1,11 +1,13 @@ import { Global, Module } from '@nestjs/common'; -import { createMemory, type Memory } from '@mosaic/memory'; +import { createMemory, type Memory, createMemoryAdapter, type MemoryAdapter } from '@mosaic/memory'; import type { Db } from '@mosaic/db'; import { DB } from '../database/database.module.js'; import { MEMORY } from './memory.tokens.js'; import { MemoryController } from './memory.controller.js'; import { EmbeddingService } from './embedding.service.js'; +export const MEMORY_ADAPTER = 'MEMORY_ADAPTER'; + @Global() @Module({ providers: [ @@ -14,9 +16,13 @@ import { EmbeddingService } from './embedding.service.js'; useFactory: (db: Db): Memory => createMemory(db), inject: [DB], }, + { + provide: MEMORY_ADAPTER, + useFactory: (): MemoryAdapter => createMemoryAdapter({ type: 'pgvector' }), + }, EmbeddingService, ], controllers: [MemoryController], - exports: [MEMORY, EmbeddingService], + exports: [MEMORY, MEMORY_ADAPTER, EmbeddingService], }) export class MemoryModule {} diff --git a/apps/gateway/src/queue/queue.module.ts b/apps/gateway/src/queue/queue.module.ts index f0fbc5e..b4c1e36 100644 --- a/apps/gateway/src/queue/queue.module.ts +++ b/apps/gateway/src/queue/queue.module.ts @@ -1,9 +1,22 @@ import { Global, Module } from '@nestjs/common'; +import { createQueueAdapter, type QueueAdapter } from '@mosaic/queue'; import { QueueService } from './queue.service.js'; +export const QUEUE_ADAPTER = 'QUEUE_ADAPTER'; + @Global() @Module({ - providers: [QueueService], - exports: [QueueService], + providers: [ + QueueService, + { + provide: QUEUE_ADAPTER, + useFactory: (): QueueAdapter => + createQueueAdapter({ + type: 'bullmq', + url: process.env['VALKEY_URL'], + }), + }, + ], + exports: [QueueService, QUEUE_ADAPTER], }) export class QueueModule {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74c8296..5588d4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: '@mosaic/queue': specifier: workspace:^ version: link:../../packages/queue + '@mosaic/storage': + specifier: workspace:^ + version: link:../../packages/storage '@mosaic/telegram-plugin': specifier: workspace:^ version: link:../../plugins/telegram