Uecko_ERP/templates/new-module/src/api/application/use-cases/create-{{kebabCase name}}.use-case.ts
2025-09-27 21:28:50 +02:00

29 lines
1.2 KiB
TypeScript

import { IPresenterRegistry, ITransactionManager } from "@erp/core/api";
import { Result } from "@repo/rdx-utils";
import { I{{pascalCase name}}Repository } from "../../domain/repositories";
import { {{pascalCase name}} } from "../../domain/aggregates";
import { {{pascalCase name}}FullPresenter } from "../presenters";
type Create{{pascalCase name}}Input = { name: string };
export class Create{{pascalCase name}}UseCase {
constructor(
private readonly repo: I{{pascalCase name}}Repository,
private readonly txManager: ITransactionManager,
private readonly presenters: IPresenterRegistry
) {}
public execute(params: Create{{pascalCase name}}Input) {
return this.txManager.complete(async (tx) => {
const entityOrError = {{pascalCase name}}.create({ name: params.name });
if (entityOrError.isFailure) return Result.fail(entityOrError.error);
const savedOrError = await this.repo.save(entityOrError.data, tx);
if (savedOrError.isFailure) return Result.fail(savedOrError.error);
const presenter = this.presenters.getPresenter({ resource: "{{kebabCase name}}", projection: "FULL" }) as {{pascalCase name}}FullPresenter;
return Result.ok(presenter.toOutput(savedOrError.data));
});
}
}