refactor(marketing-pages): factory-style use cases + per-use-case controllers

- Use cases (get-page-by-slug, get-site-settings) → factory functions with I*UseCase aliases
- Controllers split: pages.controller.ts → 2 single-responsibility files
- DI module wires factories with .toDynamicValue()
- tRPC router resolves controllers via container

Refactor log: §2, §3, §4.1, §4.2, §5.1
Spec: §6.3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-06 00:14:27 +02:00
parent 700d311052
commit 353a41b244
15 changed files with 206 additions and 162 deletions

View File

@@ -0,0 +1,35 @@
import { describe, it, expect } from "vitest";
import { getPageBySlugController } from "@/interface-adapters/controllers/get-page-by-slug.controller";
import { getPageBySlugUseCase } from "@/application/use-cases/get-page-by-slug.use-case";
import { MockPagesRepository } from "@/infrastructure/repositories/pages.repository.mock";
import { InputParseError } from "@/entities/errors/common";
describe("getPageBySlugController", () => {
it("returns the page when found", async () => {
const repo = new MockPagesRepository();
const useCase = getPageBySlugUseCase(repo);
const controller = getPageBySlugController(useCase);
const result = await controller({ slug: "about" });
expect(result?.slug).toBe("about");
});
it("throws InputParseError on missing slug", async () => {
const repo = new MockPagesRepository();
const useCase = getPageBySlugUseCase(repo);
const controller = getPageBySlugController(useCase);
await expect(
controller({} as { slug: string }),
).rejects.toBeInstanceOf(InputParseError);
});
it("returns undefined when slug not found", async () => {
const repo = new MockPagesRepository();
const useCase = getPageBySlugUseCase(repo);
const controller = getPageBySlugController(useCase);
const result = await controller({ slug: "nonexistent" });
expect(result).toBeUndefined();
});
});