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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 [
|
||||||
|
|||||||
Reference in New Issue
Block a user