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

View File

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

View File

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