From 98e906a88e3d84f800b99b3eb2d50c5b5b1dfb17 Mon Sep 17 00:00:00 2001 From: jubnl Date: Tue, 22 Sep 2026 14:23:39 +0200 Subject: [PATCH] chore(addons): well-known gate wraps only the addon read in a request context; drop unused test factories --- .../nest/platform/mcp-metadata.middleware.ts | 22 ++++++++++++++----- server/tests/helpers/test-addons.ts | 15 ------------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/server/src/nest/platform/mcp-metadata.middleware.ts b/server/src/nest/platform/mcp-metadata.middleware.ts index 4a164ba0b..ccc40958d 100644 --- a/server/src/nest/platform/mcp-metadata.middleware.ts +++ b/server/src/nest/platform/mcp-metadata.middleware.ts @@ -42,13 +42,23 @@ export function createMcpMetadataMiddleware( // helper and its rejection is handed to next() — the same error path a // synchronous throw took before (recipe R1.5). return (req, res, next) => { - void withRequestContext(orm, async () => { - if (req.path.startsWith('/.well-known/') && !(await addons.isAddonEnabled(ADDON_IDS.MCP))) { - res.status(404).end(); - return; - } + if (!req.path.startsWith('/.well-known/')) { meta.getMetaRouter()(req, res, next); - }).catch(next); + return; + } + // Only the addon read needs an ORM request context: this middleware sits + // before Nest's per-request EntityManager fork (a pathless pre-init + // app.use), and wrapping the router delegation too would fork an unused + // EntityManager for every request the server answers. + void withRequestContext(orm, () => addons.isAddonEnabled(ADDON_IDS.MCP)) + .then((enabled) => { + if (!enabled) { + res.status(404).end(); + return; + } + meta.getMetaRouter()(req, res, next); + }) + .catch(next); }; } diff --git a/server/tests/helpers/test-addons.ts b/server/tests/helpers/test-addons.ts index dcfc2f107..3e6d7935a 100644 --- a/server/tests/helpers/test-addons.ts +++ b/server/tests/helpers/test-addons.ts @@ -29,21 +29,6 @@ import type { AppSettingsRepository } from '../../src/db/repositories/AppSetting * Nest's real DI graph (task-2-review.md I2's fix, carried forward for this * domain). */ -export async function createTestAddonsRepo(db: Database.Database): Promise { - const t = await sharedTestOrm(db); - return t.repo(Addons) as AddonsRepository; -} - -export async function createTestPhotoProvidersRepo(db: Database.Database): Promise { - const t = await sharedTestOrm(db); - return t.repo(PhotoProviders) as PhotoProvidersRepository; -} - -export async function createTestPhotoProviderFieldsRepo(db: Database.Database): Promise { - const t = await sharedTestOrm(db); - return t.repo(PhotoProviderFields) as PhotoProviderFieldsRepository; -} - /** * The full `AddonsService` a hand-constructed test collaborator needs, bound * to the suite's own better-sqlite3 handle.