29 lines
1.2 KiB
TypeScript
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));
|
|
});
|
|
}
|
|
}
|