diff --git a/src/app/[lang]/dashboard/controller/create-invoice.controller.ts b/src/app/[lang]/dashboard/controller/create-invoice.controller.ts index 185261a..e07023f 100644 --- a/src/app/[lang]/dashboard/controller/create-invoice.controller.ts +++ b/src/app/[lang]/dashboard/controller/create-invoice.controller.ts @@ -1,8 +1,13 @@ "use server"; import { ApiEither } from "@/feature/common/data/api-task"; +import serverDi from "@/feature/common/server.di"; import { InvoiceParam } from "@/feature/core/invoice/domain/param/invoice.param"; -import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice.usecase"; +import { + CreateInvoiceUsecase, + createInvoiceUsecaseKey, +} from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase"; +import { invoiceModuleKey } from "@/feature/core/invoice/invoice.module-key"; import { connection } from "next/server"; /** @@ -15,5 +20,8 @@ export default async function createInvoiceController( params: InvoiceParam, ): Promise<ApiEither<string>> { connection(); - return createInvoiceUsecase(params); + const usecase = serverDi(invoiceModuleKey).resolve<CreateInvoiceUsecase>( + createInvoiceUsecaseKey, + ); + return usecase(params); } diff --git a/src/app/[lang]/dashboard/module/dashboard.app-module.ts b/src/app/[lang]/dashboard/module/dashboard.app-module.ts index e4344ab..b3ec20f 100644 --- a/src/app/[lang]/dashboard/module/dashboard.app-module.ts +++ b/src/app/[lang]/dashboard/module/dashboard.app-module.ts @@ -1,6 +1,5 @@ import CreateRandomInvoiceButtonVM from "@/app/[lang]/dashboard/vm/create-random-invoice-button-vm"; import di from "@/bootstrap/di/init-di"; -// import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice.usecase"; /** * Each page can have its own di to connect all vms, usecases or controllers @@ -8,9 +7,6 @@ import di from "@/bootstrap/di/init-di"; export default function dashboardAppModule() { const dashboardDi = di.createChildContainer(); - // dashboardDi.register(createInvoiceUsecase.name, { - // useValue: createInvoiceUsecase, - // }); dashboardDi.register( CreateRandomInvoiceButtonVM, CreateRandomInvoiceButtonVM, diff --git a/src/app/[lang]/dashboard/vm/create-random-invoice-button-vm.ts b/src/app/[lang]/dashboard/vm/create-random-invoice-button-vm.ts index 92e0c25..246508d 100644 --- a/src/app/[lang]/dashboard/vm/create-random-invoice-button-vm.ts +++ b/src/app/[lang]/dashboard/vm/create-random-invoice-button-vm.ts @@ -5,7 +5,7 @@ import useThrottle from "@/bootstrap/helpers/hooks/use-throttle"; import BaseVM from "@/bootstrap/helpers/vm/base-vm"; import langKey from "@/bootstrap/i18n/dictionaries/lang-key"; import { InvoiceParam } from "@/feature/core/invoice/domain/param/invoice.param"; -import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice.usecase"; +import { CreateInvoiceUsecase } from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase"; import { faker } from "@faker-js/faker"; import { useRouter } from "next/navigation"; import { useTranslation } from "react-i18next"; @@ -16,7 +16,7 @@ import { useTranslation } from "react-i18next"; * in this layer. */ export default class CreateRandomInvoiceButtonVM extends BaseVM<ButtonVm> { - private createInvoice: typeof createInvoiceUsecase; + private createInvoice: CreateInvoiceUsecase; constructor() { super(); diff --git a/src/app/components/button/stories/Button.stories.tsx b/src/app/components/button/stories/Button.stories.tsx index 2ad8208..a68137b 100644 --- a/src/app/components/button/stories/Button.stories.tsx +++ b/src/app/components/button/stories/Button.stories.tsx @@ -4,7 +4,7 @@ import { DiContext, useDI } from "@/bootstrap/di/di-context"; import mockedModuleDi from "@/bootstrap/di/mocked-module-di"; import Story from "@/bootstrap/helpers/view/storybook-base-template-type"; import getArgVM from "@/bootstrap/helpers/view/storybook-with-arg-vm"; -import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice.usecase"; +import { createInvoiceUsecaseKey } from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase"; import type { Meta } from "@storybook/react"; import { useRef } from "react"; @@ -36,30 +36,32 @@ export const Primary: Story = { export const WithVM: Story = { decorators: [ (Story) => { - const di = mockedModuleDi([ - { - token: CreateRandomInvoiceButtonVM, - provider: CreateRandomInvoiceButtonVM, - }, - { - token: createInvoiceUsecase.name, - // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-console - provider: (args: any) => console.log("clicked", args), - }, - ]); - return <Story di={di} />; + const di = useRef( + mockedModuleDi([ + { + token: CreateRandomInvoiceButtonVM, + provider: CreateRandomInvoiceButtonVM, + }, + { + token: createInvoiceUsecaseKey, + // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-console + provider: (args: any) => console.log("clicked", args), + }, + ]), + ); + return ( + <DiContext.Provider value={di.current}> + <Story di={di.current} /> + </DiContext.Provider> + ); }, ], - render: (_, globalProps) => { + render: () => { function Child() { const di = useDI(); const vm = useRef(di.resolve(CreateRandomInvoiceButtonVM)); return <Button vm={vm.current} memoizedByVM={false} />; } - return ( - <DiContext.Provider value={globalProps.di}> - <Child /> - </DiContext.Provider> - ); + return <Child />; }, }; diff --git a/src/feature/core/invoice/data/module/invoice.di.ts b/src/feature/core/invoice/data/module/invoice.di.ts index 641faee..cfff4b0 100644 --- a/src/feature/core/invoice/data/module/invoice.di.ts +++ b/src/feature/core/invoice/data/module/invoice.di.ts @@ -1,11 +1,16 @@ import di from "@/bootstrap/di/init-di"; import invoiceDbRepo from "@/feature/core/invoice/data/repo/invoice-db.repo"; import { invoiceRepoKey } from "@/feature/core/invoice/domain/i-repo/invoice.i-repo"; +import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice-impl.usecase"; +import { createInvoiceUsecaseKey } from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase"; import { DependencyContainer } from "tsyringe"; export default function getInvoiceDi(): DependencyContainer { const invoiceDi = di.createChildContainer(); invoiceDi.register(invoiceRepoKey, invoiceDbRepo); + invoiceDi.register(createInvoiceUsecaseKey, { + useValue: createInvoiceUsecase, + }); return invoiceDi; } diff --git a/src/feature/core/invoice/domain/usecase/create-invoice.usecase.ts b/src/feature/core/invoice/domain/usecase/create-invoice/create-invoice-impl.usecase.ts similarity index 80% rename from src/feature/core/invoice/domain/usecase/create-invoice.usecase.ts rename to src/feature/core/invoice/domain/usecase/create-invoice/create-invoice-impl.usecase.ts index da93b8d..edb7144 100644 --- a/src/feature/core/invoice/domain/usecase/create-invoice.usecase.ts +++ b/src/feature/core/invoice/domain/usecase/create-invoice/create-invoice-impl.usecase.ts @@ -9,12 +9,13 @@ import { invoiceSchema, } from "@/feature/core/invoice/domain/param/invoice.param"; import { invoiceModuleKey } from "@/feature/core/invoice/invoice.module-key"; +import { CreateInvoiceUsecase } from "@/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase"; import { pipe } from "fp-ts/lib/function"; import { chain, fromNullable, left, map, right } from "fp-ts/lib/TaskEither"; -export default async function createInvoiceUsecase( +const createInvoiceUsecase: CreateInvoiceUsecase = async ( params: InvoiceParam, -): Promise<ApiEither<string>> { +): Promise<ApiEither<string>> => { const repo = serverDi(invoiceModuleKey).resolve<InvoiceRepo>(invoiceRepoKey); return pipe( @@ -27,4 +28,6 @@ export default async function createInvoiceUsecase( }), chain((params) => repo.createInvoice(params)), )(); -} +}; + +export default createInvoiceUsecase; diff --git a/src/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase.ts b/src/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase.ts new file mode 100644 index 0000000..4289a0e --- /dev/null +++ b/src/feature/core/invoice/domain/usecase/create-invoice/create-invoice.usecase.ts @@ -0,0 +1,8 @@ +import { ApiEither } from "@/feature/common/data/api-task"; +import { InvoiceParam } from "@/feature/core/invoice/domain/param/invoice.param"; + +export type CreateInvoiceUsecase = ( + param: InvoiceParam, +) => Promise<ApiEither<string>>; + +export const createInvoiceUsecaseKey = "createInvoiceUsecaseKey";