From fe85976440d432c4c0c6fce1d855af23e84e0e9f Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Sat, 9 May 2026 12:40:58 +0200 Subject: [PATCH] refactor(blog): binders take BindContext arg --- packages/blog/src/di/bind-dev-seed.test.ts | 8 ++++---- packages/blog/src/di/bind-dev-seed.ts | 15 ++++----------- packages/blog/src/di/bind-production.ts | 17 ++++------------- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/packages/blog/src/di/bind-dev-seed.test.ts b/packages/blog/src/di/bind-dev-seed.test.ts index 9e0df79..6aced1f 100644 --- a/packages/blog/src/di/bind-dev-seed.test.ts +++ b/packages/blog/src/di/bind-dev-seed.test.ts @@ -34,7 +34,7 @@ describe("bindDevSeedBlog", () => { }); it("populates the repository with the dev articles", async () => { - await bindDevSeedBlog(tracer, logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); + await bindDevSeedBlog({ tracer, logger, bus: new RecordingEventBus(), queue: new RecordingJobQueue(), realtime: new RecordingRealtimeBroadcaster(), realtimeRegistry: new RealtimeHandlerRegistry() }); const repo = blogContainer.get( BLOG_SYMBOLS.IArticlesRepository, @@ -45,7 +45,7 @@ describe("bindDevSeedBlog", () => { }); it("seeds the welcome article reachable by slug", async () => { - await bindDevSeedBlog(tracer, logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); + await bindDevSeedBlog({ tracer, logger, bus: new RecordingEventBus(), queue: new RecordingJobQueue(), realtime: new RecordingRealtimeBroadcaster(), realtimeRegistry: new RealtimeHandlerRegistry() }); const repo = blogContainer.get( BLOG_SYMBOLS.IArticlesRepository, @@ -58,13 +58,13 @@ describe("bindDevSeedBlog", () => { }); it("is idempotent — calling twice rebuilds a fresh populated repo", async () => { - await bindDevSeedBlog(tracer, logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); + await bindDevSeedBlog({ tracer, logger, bus: new RecordingEventBus(), queue: new RecordingJobQueue(), realtime: new RecordingRealtimeBroadcaster(), realtimeRegistry: new RealtimeHandlerRegistry() }); const before = blogContainer.get( BLOG_SYMBOLS.IArticlesRepository, ); const beforeCount = (await before.getArticles()).length; - await bindDevSeedBlog(tracer, logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); + await bindDevSeedBlog({ tracer, logger, bus: new RecordingEventBus(), queue: new RecordingJobQueue(), realtime: new RecordingRealtimeBroadcaster(), realtimeRegistry: new RealtimeHandlerRegistry() }); const after = blogContainer.get( BLOG_SYMBOLS.IArticlesRepository, ); diff --git a/packages/blog/src/di/bind-dev-seed.ts b/packages/blog/src/di/bind-dev-seed.ts index 8b22e7f..dc978cc 100644 --- a/packages/blog/src/di/bind-dev-seed.ts +++ b/packages/blog/src/di/bind-dev-seed.ts @@ -5,9 +5,7 @@ import { type ITracer, type ILogger, } from "@repo/core-shared/instrumentation"; -import type { IEventBus } from "@repo/core-events"; -import type { IRealtimeBroadcaster, IRealtimeHandlerRegistry } from "@repo/core-realtime"; -import type { IJobQueue } from "@repo/core-shared/jobs"; +import type { BindContext } from "@repo/core-shared/di"; import { blogContainer } from "./container.js"; import { BLOG_SYMBOLS } from "./symbols.js"; import { MockArticlesRepository } from "../infrastructure/repositories/articles.repository.mock.js"; @@ -30,14 +28,9 @@ import type { IArticlesRepository } from "../application/repositories/articles.r * Idempotent: safe to call multiple times; each call rebuilds a fresh * populated repo and rebinds the symbol. */ -export async function bindDevSeedBlog( - tracer: ITracer, - logger: ILogger, - bus: IEventBus, - queue: IJobQueue, - realtime: IRealtimeBroadcaster, - realtimeRegistry: IRealtimeHandlerRegistry, -): Promise { +export async function bindDevSeedBlog(ctx: BindContext): Promise { + const { tracer, logger, bus, queue, realtime, realtimeRegistry } = ctx; + // Bind shared instrumentation into feature container if (blogContainer.isBound(INSTRUMENTATION_SYMBOLS.TRACER)) { blogContainer.unbind(INSTRUMENTATION_SYMBOLS.TRACER); diff --git a/packages/blog/src/di/bind-production.ts b/packages/blog/src/di/bind-production.ts index 5263c3b..2bc52c3 100644 --- a/packages/blog/src/di/bind-production.ts +++ b/packages/blog/src/di/bind-production.ts @@ -1,4 +1,3 @@ -import type { SanitizedConfig } from "payload"; import { withSpan, withCapture, @@ -6,9 +5,7 @@ import { type ITracer, type ILogger, } from "@repo/core-shared/instrumentation"; -import type { IEventBus } from "@repo/core-events"; -import type { IRealtimeBroadcaster, IRealtimeHandlerRegistry } from "@repo/core-realtime"; -import type { IJobQueue } from "@repo/core-shared/jobs"; +import type { BindProductionContext } from "@repo/core-shared/di"; import { blogContainer } from "./container"; import { BLOG_SYMBOLS } from "./symbols"; import { ArticlesRepository } from "../infrastructure/repositories/articles.repository"; @@ -19,15 +16,9 @@ import { getArticlesController } from "../interface-adapters/controllers/get-art import { getArticleBySlugController } from "../interface-adapters/controllers/get-article-by-slug.controller"; import { createArticleController } from "../interface-adapters/controllers/create-article.controller"; -export function bindProductionBlog( - config: SanitizedConfig, - tracer: ITracer, - logger: ILogger, - bus: IEventBus, - queue: IJobQueue, - realtime: IRealtimeBroadcaster, - realtimeRegistry: IRealtimeHandlerRegistry, -): void { +export function bindProductionBlog(ctx: BindProductionContext): void { + const { config, tracer, logger, bus, queue, realtime, realtimeRegistry } = ctx; + // Bind shared instrumentation into feature container if (blogContainer.isBound(INSTRUMENTATION_SYMBOLS.TRACER)) { blogContainer.unbind(INSTRUMENTATION_SYMBOLS.TRACER);