refactor(media): migrate binders to wireUseCase for all 3 use cases

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-13 17:59:59 +00:00
parent 0867efbaae
commit b93ce25b2a
3 changed files with 88 additions and 99 deletions

View File

@@ -1,16 +1,16 @@
{ {
"generatedAt": "2026-05-13T17:51:01.137Z", "generatedAt": "2026-05-13T17:59:49.208Z",
"commit": "e08e0a1", "commit": "0867efb",
"repo": { "repo": {
"statements": 95.86, "statements": 95.86,
"branches": 88.91, "branches": 88.93,
"functions": 100, "functions": 100,
"lines": 95.86, "lines": 95.86,
"counts": { "counts": {
"lf": 3117, "lf": 3115,
"lh": 2988, "lh": 2986,
"brf": 487, "brf": 488,
"brh": 433, "brh": 434,
"fnf": 142, "fnf": 142,
"fnh": 142 "fnh": 142
} }
@@ -31,13 +31,13 @@
} }
}, },
"@repo/blog": { "@repo/blog": {
"statements": 96.39, "statements": 96.36,
"branches": 88.65, "branches": 88.65,
"functions": 100, "functions": 100,
"lines": 96.39, "lines": 96.36,
"counts": { "counts": {
"lf": 747, "lf": 741,
"lh": 720, "lh": 714,
"brf": 141, "brf": 141,
"brh": 125, "brh": 125,
"fnf": 29, "fnf": 29,
@@ -59,15 +59,15 @@
} }
}, },
"@repo/media": { "@repo/media": {
"statements": 97.13, "statements": 97.15,
"branches": 90.53, "branches": 90.63,
"functions": 100, "functions": 100,
"lines": 97.13, "lines": 97.15,
"counts": { "counts": {
"lf": 557, "lf": 561,
"lh": 541, "lh": 545,
"brf": 95, "brf": 96,
"brh": 86, "brh": 87,
"fnf": 24, "fnf": 24,
"fnh": 24 "fnh": 24
} }

View File

@@ -6,7 +6,10 @@ import {
type ILogger, type ILogger,
} from "@repo/core-shared/instrumentation"; } from "@repo/core-shared/instrumentation";
import type { BindContext } from "@repo/core-shared/di"; import type { BindContext } from "@repo/core-shared/di";
import { assertFeatureConformance } from "@repo/core-shared/conformance"; import {
assertFeatureConformance,
wireUseCase,
} from "@repo/core-shared/conformance";
import { mediaManifest } from "../feature.manifest.js"; import { mediaManifest } from "../feature.manifest.js";
import { mediaContainer } from "./container.js"; import { mediaContainer } from "./container.js";
import { MEDIA_SYMBOLS } from "./symbols.js"; import { MEDIA_SYMBOLS } from "./symbols.js";
@@ -60,54 +63,48 @@ export async function bindDevSeedMedia(ctx: BindContext): Promise<void> {
.bind<IMediaRepository>(MEDIA_SYMBOLS.IMediaRepository) .bind<IMediaRepository>(MEDIA_SYMBOLS.IMediaRepository)
.toConstantValue(repo); .toConstantValue(repo);
// Wrap use cases + controllers identically to bind-production // Use cases
const wrappedGetMedia = withSpan( const wrappedGetMedia = wireUseCase({
container: mediaContainer,
symbol: MEDIA_SYMBOLS.IGetMediaUseCase,
factory: getMediaUseCase,
deps: [repo],
feature: "media",
layer: "use-case",
name: "getMedia",
tracer, tracer,
{ name: "media.getMedia", op: "use-case" }, logger,
withCapture( });
logger, const wrappedListMedia = wireUseCase({
{ feature: "media", layer: "use-case", name: "media.getMedia" }, container: mediaContainer,
getMediaUseCase(repo), symbol: MEDIA_SYMBOLS.IListMediaUseCase,
), factory: listMediaUseCase,
); deps: [repo],
const wrappedListMedia = withSpan( feature: "media",
layer: "use-case",
name: "listMedia",
tracer, tracer,
{ name: "media.listMedia", op: "use-case" }, logger,
withCapture( });
logger, const wrappedDeleteMedia = wireUseCase({
{ feature: "media", layer: "use-case", name: "media.listMedia" }, container: mediaContainer,
listMediaUseCase(repo), symbol: MEDIA_SYMBOLS.IDeleteMediaUseCase,
), factory: deleteMediaUseCase,
); deps: [repo],
const wrappedDeleteMedia = withSpan( feature: "media",
layer: "use-case",
name: "deleteMedia",
tracer, tracer,
{ name: "media.deleteMedia", op: "use-case" }, logger,
withCapture( });
logger,
{ feature: "media", layer: "use-case", name: "media.deleteMedia" },
deleteMediaUseCase(repo),
),
);
for (const sym of [ for (const sym of [
MEDIA_SYMBOLS.IGetMediaUseCase,
MEDIA_SYMBOLS.IListMediaUseCase,
MEDIA_SYMBOLS.IDeleteMediaUseCase,
MEDIA_SYMBOLS.IGetMediaController, MEDIA_SYMBOLS.IGetMediaController,
MEDIA_SYMBOLS.IListMediaController, MEDIA_SYMBOLS.IListMediaController,
MEDIA_SYMBOLS.IDeleteMediaController, MEDIA_SYMBOLS.IDeleteMediaController,
]) { ]) {
if (mediaContainer.isBound(sym)) mediaContainer.unbind(sym); if (mediaContainer.isBound(sym)) mediaContainer.unbind(sym);
} }
mediaContainer
.bind(MEDIA_SYMBOLS.IGetMediaUseCase)
.toConstantValue(wrappedGetMedia);
mediaContainer
.bind(MEDIA_SYMBOLS.IListMediaUseCase)
.toConstantValue(wrappedListMedia);
mediaContainer
.bind(MEDIA_SYMBOLS.IDeleteMediaUseCase)
.toConstantValue(wrappedDeleteMedia);
mediaContainer mediaContainer
.bind(MEDIA_SYMBOLS.IGetMediaController) .bind(MEDIA_SYMBOLS.IGetMediaController)

View File

@@ -6,7 +6,10 @@ import {
type ILogger, type ILogger,
} from "@repo/core-shared/instrumentation"; } from "@repo/core-shared/instrumentation";
import type { BindProductionContext } from "@repo/core-shared/di"; import type { BindProductionContext } from "@repo/core-shared/di";
import { assertFeatureConformance } from "@repo/core-shared/conformance"; import {
assertFeatureConformance,
wireUseCase,
} from "@repo/core-shared/conformance";
import { mediaContainer } from "./container"; import { mediaContainer } from "./container";
import { MEDIA_SYMBOLS } from "./symbols"; import { MEDIA_SYMBOLS } from "./symbols";
import { mediaManifest } from "../feature.manifest"; import { mediaManifest } from "../feature.manifest";
@@ -43,51 +46,40 @@ export function bindProductionMedia(ctx: BindProductionContext): void {
const repo = new MediaRepository(config, tracer, logger); const repo = new MediaRepository(config, tracer, logger);
mediaContainer.bind(MEDIA_SYMBOLS.IMediaRepository).toConstantValue(repo); mediaContainer.bind(MEDIA_SYMBOLS.IMediaRepository).toConstantValue(repo);
// Use cases — wrapped with span + capture at bind time // Use cases
const wrappedGetMedia = withSpan( const wrappedGetMedia = wireUseCase({
container: mediaContainer,
symbol: MEDIA_SYMBOLS.IGetMediaUseCase,
factory: getMediaUseCase,
deps: [repo],
feature: "media",
layer: "use-case",
name: "getMedia",
tracer, tracer,
{ name: "media.getMedia", op: "use-case" }, logger,
withCapture( });
logger, const wrappedListMedia = wireUseCase({
{ feature: "media", layer: "use-case", name: "media.getMedia" }, container: mediaContainer,
getMediaUseCase(repo), symbol: MEDIA_SYMBOLS.IListMediaUseCase,
), factory: listMediaUseCase,
); deps: [repo],
const wrappedListMedia = withSpan( feature: "media",
layer: "use-case",
name: "listMedia",
tracer, tracer,
{ name: "media.listMedia", op: "use-case" }, logger,
withCapture( });
logger, const wrappedDeleteMedia = wireUseCase({
{ feature: "media", layer: "use-case", name: "media.listMedia" }, container: mediaContainer,
listMediaUseCase(repo), symbol: MEDIA_SYMBOLS.IDeleteMediaUseCase,
), factory: deleteMediaUseCase,
); deps: [repo],
const wrappedDeleteMedia = withSpan( feature: "media",
layer: "use-case",
name: "deleteMedia",
tracer, tracer,
{ name: "media.deleteMedia", op: "use-case" }, logger,
withCapture( });
logger,
{ feature: "media", layer: "use-case", name: "media.deleteMedia" },
deleteMediaUseCase(repo),
),
);
for (const sym of [
MEDIA_SYMBOLS.IGetMediaUseCase,
MEDIA_SYMBOLS.IListMediaUseCase,
MEDIA_SYMBOLS.IDeleteMediaUseCase,
]) {
if (mediaContainer.isBound(sym)) mediaContainer.unbind(sym);
}
mediaContainer
.bind(MEDIA_SYMBOLS.IGetMediaUseCase)
.toConstantValue(wrappedGetMedia);
mediaContainer
.bind(MEDIA_SYMBOLS.IListMediaUseCase)
.toConstantValue(wrappedListMedia);
mediaContainer
.bind(MEDIA_SYMBOLS.IDeleteMediaUseCase)
.toConstantValue(wrappedDeleteMedia);
// Controllers — wrapped with span at bind time // Controllers — wrapped with span at bind time
for (const sym of [ for (const sym of [