Skip to content
ts
import { BookPort, ClientPort } from "@applications/ports";
import { clientBorrowBook } from "@domains/aggregates";
import { type Book, type Client } from "@domains/entities";
import { C, E, promiseObject } from "@duplojs/utils";

interface Input {
	client: Client.Entity & Client.CanRent;
	book: Book.Entity & Book.Available;
}

export const ClientBorrowBookUseCase = C.createUseCase(
	{
		BookPort,
		ClientPort,
	},
	({
		bookPort,
		clientPort,
	}) => ({ book, client }: Input) => E.rightPipe(
		clientBorrowBook(client, book),
		({ book, client }) => promiseObject({
			book: bookPort.save(book),
			client: clientPort.save(client),
		}),
	),
);

Released under the MIT License.