diff --git a/.gitignore b/.gitignore index 26b002a..39c19d2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ !.yarn/plugins !.yarn/releases !.yarn/versions - +.vscode # testing /coverage diff --git a/src/app/dashboard/components/cards.tsx b/src/app/dashboard/components/cards.tsx index 72bb37b..5060f9f 100644 --- a/src/app/dashboard/components/cards.tsx +++ b/src/app/dashboard/components/cards.tsx @@ -1,10 +1,10 @@ +import fetchSummaryInfoUsecase from '@/feature/core/summary-info/domain/usecase/fetch-summary-info-usecase'; import { BanknotesIcon, ClockIcon, UserGroupIcon, InboxIcon, } from '@heroicons/react/24/outline'; -import { fetchCardData } from '@/app/lib/data'; const iconMap = { collected: BanknotesIcon, @@ -14,21 +14,16 @@ const iconMap = { }; export default async function CardWrapper() { - const { - numberOfInvoices, - numberOfCustomers, - totalPaidInvoices, - totalPendingInvoices, - } = await fetchCardData(); + const {customersNumber, invoicesNumber, invoicesSummary } = await fetchSummaryInfoUsecase(); return ( <> - - - + + + diff --git a/src/app/dashboard/components/latest-invoices.tsx b/src/app/dashboard/components/latest-invoices.tsx index 5c7cd95..6f62655 100644 --- a/src/app/dashboard/components/latest-invoices.tsx +++ b/src/app/dashboard/components/latest-invoices.tsx @@ -1,9 +1,9 @@ +import fetchCustomerInvoicesUsecase from '@/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase'; import { ArrowPathIcon } from '@heroicons/react/24/outline'; import clsx from 'clsx'; import Image from 'next/image'; -import { fetchLatestInvoices } from '@/app/lib/data'; export default async function LatestInvoices() { - const latestInvoices = await fetchLatestInvoices(); + const latestInvoices = await fetchCustomerInvoicesUsecase(); return (
@@ -26,25 +26,25 @@ export default async function LatestInvoices() { >
{`${invoice.name}'s

- {invoice.name} + {invoice.customerName}

- {invoice.email} + {invoice.customerEmail}

- {invoice.amount} + {invoice.invoicesAmount}

); diff --git a/src/app/dashboard/components/revenue-chart.tsx b/src/app/dashboard/components/revenue-chart.tsx index 49d888c..f6a6f91 100644 --- a/src/app/dashboard/components/revenue-chart.tsx +++ b/src/app/dashboard/components/revenue-chart.tsx @@ -1,9 +1,9 @@ import { generateYAxis } from '@/app/lib/utils'; +import fetchRevenuesUsecase from '@/feature/core/revenue/domain/usecase/fetch-revenues-usecase'; import { CalendarIcon } from '@heroicons/react/24/outline'; -import { fetchRevenue } from '@/app/lib/data'; export default async function RevenueChart() { - const revenue = await fetchRevenue(); + const revenue = await fetchRevenuesUsecase(); const chartHeight = 350; diff --git a/src/app/dashboard/module/dashboard-app-module.ts b/src/app/dashboard/module/dashboard-app-module.ts new file mode 100644 index 0000000..fd9f144 --- /dev/null +++ b/src/app/dashboard/module/dashboard-app-module.ts @@ -0,0 +1,27 @@ +import di from "@/bootstrap/di/init-di" +import fetchCustomerInvoicesUsecase from "@/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase"; +import fetchCustomersUsecase from "@/feature/core/customer/domain/usecase/fetch-customers-usecase"; +import fetchAllInvoicesAmountUsecase from "@/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase"; +import fetchRevenuesUsecase from "@/feature/core/revenue/domain/usecase/fetch-revenues-usecase"; + +export default function dashboardAppModule() { + const dashboardDi = di.createChildContainer() + + dashboardDi.register(fetchCustomersUsecase.name, { + useValue: fetchCustomersUsecase + }) + + dashboardDi.register(fetchAllInvoicesAmountUsecase.name, { + useValue: fetchAllInvoicesAmountUsecase + }) + dashboardDi.register(fetchAllInvoicesAmountUsecase.name, { + useValue: fetchAllInvoicesAmountUsecase + }) + dashboardDi.register(fetchCustomerInvoicesUsecase.name, { + useValue: fetchCustomerInvoicesUsecase + }) + dashboardDi.register(fetchRevenuesUsecase.name, { + useValue: fetchRevenuesUsecase + }) + return dashboardDi +} diff --git a/src/feature/common/server-di.ts b/src/feature/common/server-di.ts index 7ce0735..401e706 100644 --- a/src/feature/common/server-di.ts +++ b/src/feature/common/server-di.ts @@ -12,7 +12,10 @@ import getSummaryInfoDi from "@/feature/core/summary-info/data/module/summary-in import { revenueModuleKey } from "@/feature/core/revenue/domain/revenue-module-key"; import getRevenueDi from "@/feature/core/revenue/data/module/revenue-di"; +const memoizedDis: Record = {} + export default function serverDi(module: string): DependencyContainer { + if (memoizedDis[module]) return memoizedDis[module] const getDi = { [testModuleKey]: getTestModule, [customerKey]: getCustomerDi, @@ -23,6 +26,8 @@ export default function serverDi(module: string): DependencyContainer { }[module] if (!getDi) throw new Error("Server Di didn't found for module: " + module) - - return getDi() + + const di = getDi() + memoizedDis[module] = di + return di } \ No newline at end of file diff --git a/src/feature/core/customer-invoice/data/module/customer-invoice-di.ts b/src/feature/core/customer-invoice/data/module/customer-invoice-di.ts index 76a7453..5364a92 100644 --- a/src/feature/core/customer-invoice/data/module/customer-invoice-di.ts +++ b/src/feature/core/customer-invoice/data/module/customer-invoice-di.ts @@ -1,16 +1,11 @@ import di from "@/bootstrap/di/init-di"; +import CustomerInvoiceDbRepo from "@/feature/core/customer-invoice/data/repo/customer-invoice-db-repo"; import { customerInvoiceRepoKey } from "@/feature/core/customer-invoice/domain/i-repo/customer-invoice-repo"; -import fetchCustomerInvoicesUsecase from "@/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase"; -import CustomerDbRepo from "@/feature/core/customer/data/repo/customer-db-repo"; import { DependencyContainer } from "tsyringe"; export default function getCustomerInvoiceDi(): DependencyContainer { const customerInvoiceDi = di.createChildContainer() - customerInvoiceDi.register(fetchCustomerInvoicesUsecase.name, { - useValue: fetchCustomerInvoicesUsecase - }) - - customerInvoiceDi.register(customerInvoiceRepoKey, CustomerDbRepo) + customerInvoiceDi.register(customerInvoiceRepoKey, CustomerInvoiceDbRepo) return customerInvoiceDi } \ No newline at end of file diff --git a/src/feature/core/customer-invoice/data/repo/customer-invoice-db-repo.ts b/src/feature/core/customer-invoice/data/repo/customer-invoice-db-repo.ts index 45ec6ab..18f7db1 100644 --- a/src/feature/core/customer-invoice/data/repo/customer-invoice-db-repo.ts +++ b/src/feature/core/customer-invoice/data/repo/customer-invoice-db-repo.ts @@ -2,7 +2,6 @@ import { formatCurrency } from "@/app/lib/utils"; import { sql } from "@/bootstrap/db/db"; import CustomerInvoice from "@/feature/core/customer-invoice/domain/entity/customer-invoice"; import CustomerInvoiceRepo from "@/feature/core/customer-invoice/domain/i-repo/customer-invoice-repo"; -import { connection } from "next/server"; import postgres from "postgres"; type customerInvoiceDbResponse = { @@ -13,11 +12,8 @@ type customerInvoiceDbResponse = { amount: string; } -export default class CustomerDbRepo implements CustomerInvoiceRepo { +export default class CustomerInvoiceDbRepo implements CustomerInvoiceRepo { async fetchList(): Promise { - // This is equivalent to in fetch(..., {cache: 'no-store'}). - connection() - try { const data = await sql` SELECT invoices.amount, customers.name, customers.image_url, customers.email, invoices.id diff --git a/src/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase.ts b/src/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase.ts index fd97f46..5947553 100644 --- a/src/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase.ts +++ b/src/feature/core/customer-invoice/domain/usecase/fetch-customer-invoices-usecase.ts @@ -3,9 +3,10 @@ import serverDi from "@/feature/common/server-di"; import CustomerInvoice from "@/feature/core/customer-invoice/domain/entity/customer-invoice"; import CustomerInvoiceRepo, { customerInvoiceRepoKey } from "@/feature/core/customer-invoice/domain/i-repo/customer-invoice-repo"; import { customerInvoiceModuleKey } from "@/feature/core/customer-invoice/invoice-module-key"; +import { connection } from "next/server"; -export default function fetchCustomerInvoicesUsecase(): Promise { +export default async function fetchCustomerInvoicesUsecase(): Promise { + connection() const repo = serverDi(customerInvoiceModuleKey).resolve(customerInvoiceRepoKey) - return repo.fetchList() } \ No newline at end of file diff --git a/src/feature/core/customer/data/module/customer-di.ts b/src/feature/core/customer/data/module/customer-di.ts index 1fa4398..c3806ee 100644 --- a/src/feature/core/customer/data/module/customer-di.ts +++ b/src/feature/core/customer/data/module/customer-di.ts @@ -1,16 +1,11 @@ import di from "@/bootstrap/di/init-di"; import CustomerDbRepo from "@/feature/core/customer/data/repo/customer-db-repo"; import { customerRepoKey } from "@/feature/core/customer/domain/i-repo/customer-repo"; -import fetchCustomersUsecase from "@/feature/core/customer/domain/usecase/fetch-customers-usecase"; import { DependencyContainer } from "tsyringe"; export default function getCustomerDi(): DependencyContainer { const customerDi = di.createChildContainer() - customerDi.register(fetchCustomersUsecase.name, { - useValue: fetchCustomersUsecase - }) - customerDi.register(customerRepoKey, CustomerDbRepo) return customerDi } \ No newline at end of file diff --git a/src/feature/core/customer/domain/usecase/fetch-customers-amount-usecase.ts b/src/feature/core/customer/domain/usecase/fetch-customers-amount-usecase.ts index f90d5c3..71cd13d 100644 --- a/src/feature/core/customer/domain/usecase/fetch-customers-amount-usecase.ts +++ b/src/feature/core/customer/domain/usecase/fetch-customers-amount-usecase.ts @@ -2,7 +2,7 @@ import serverDi from "@/feature/common/server-di"; import { customerKey } from "@/feature/core/customer/customer-key"; import CustomerRepo, { customerRepoKey } from "@/feature/core/customer/domain/i-repo/customer-repo"; -export default function fetchCustomersAmountUsecase(): Promise { +export default async function fetchCustomersAmountUsecase(): Promise { const repo = serverDi(customerKey).resolve(customerRepoKey) return repo.fetchCustomersAmount() } \ No newline at end of file diff --git a/src/feature/core/customer/domain/usecase/fetch-customers-usecase.ts b/src/feature/core/customer/domain/usecase/fetch-customers-usecase.ts index 60bd0c5..d28584d 100644 --- a/src/feature/core/customer/domain/usecase/fetch-customers-usecase.ts +++ b/src/feature/core/customer/domain/usecase/fetch-customers-usecase.ts @@ -5,7 +5,7 @@ import { customerKey } from "@/feature/core/customer/customer-key"; import Customer from "@/feature/core/customer/domain/entity/customer"; import CustomerRepo, { customerRepoKey } from "@/feature/core/customer/domain/i-repo/customer-repo"; -export default function fetchCustomersUsecase(query: string): Promise { +export default async function fetchCustomersUsecase(query: string): Promise { const repo = serverDi(customerKey).resolve(customerRepoKey) return repo.fetchList(query) diff --git a/src/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts b/src/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts index 93e2deb..48840f4 100644 --- a/src/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts +++ b/src/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts @@ -3,7 +3,7 @@ import serverDi from "@/feature/common/server-di"; import InvoiceRepo, { invoiceRepoKey } from "@/feature/core/invoice/domain/i-repo/invoice-repo"; import { invoiceModuleKey } from "@/feature/core/invoice/invoice-module-key"; -export default function fetchAllInvoicesAmountUsecase(): Promise { +export default async function fetchAllInvoicesAmountUsecase(): Promise { const repo = serverDi(invoiceModuleKey).resolve(invoiceRepoKey) return repo.fetchAllInvoicesAmount() diff --git a/src/feature/core/invoice/domain/usecase/fetch-invoices-status-summary.ts b/src/feature/core/invoice/domain/usecase/fetch-invoices-status-summary.ts index 07c76a8..3bb9a5e 100644 --- a/src/feature/core/invoice/domain/usecase/fetch-invoices-status-summary.ts +++ b/src/feature/core/invoice/domain/usecase/fetch-invoices-status-summary.ts @@ -3,7 +3,7 @@ import InvoiceRepo, { invoiceRepoKey } from "@/feature/core/invoice/domain/i-rep import InvoiceStatusSummary from "@/feature/core/invoice/domain/value-object/invoice-status"; import { invoiceModuleKey } from "@/feature/core/invoice/invoice-module-key"; -export default function fetchInvoicesStatusSummary(): Promise { +export default async function fetchInvoicesStatusSummary(): Promise { const repo = serverDi(invoiceModuleKey).resolve(invoiceRepoKey) return repo.fetchInvoicesStatusSummary() } \ No newline at end of file diff --git a/src/feature/core/revenue/data/repo/revenue-db-repo.ts b/src/feature/core/revenue/data/repo/revenue-db-repo.ts index b29c5d2..7adc439 100644 --- a/src/feature/core/revenue/data/repo/revenue-db-repo.ts +++ b/src/feature/core/revenue/data/repo/revenue-db-repo.ts @@ -11,7 +11,6 @@ export type RevenueDbResponse = { export default class RevenueDbRepo implements RevenueRepo { async fetchRevenues(): Promise { // This is equivalent to in fetch(..., {cache: 'no-store'}). - connection() try { // Artificially delay a response for demo purposes. // Don't do this in production :) diff --git a/src/feature/core/revenue/domain/usecase/fetch-revenues-usecase.ts b/src/feature/core/revenue/domain/usecase/fetch-revenues-usecase.ts index c9e6068..0f428c5 100644 --- a/src/feature/core/revenue/domain/usecase/fetch-revenues-usecase.ts +++ b/src/feature/core/revenue/domain/usecase/fetch-revenues-usecase.ts @@ -1,9 +1,9 @@ import serverDi from "@/feature/common/server-di"; import Revenue from "@/feature/core/revenue/domain/entity/revenue"; -import RevenueRepo from "@/feature/core/revenue/domain/i-repo/revenue-repo"; +import RevenueRepo, { revenueRepoKey } from "@/feature/core/revenue/domain/i-repo/revenue-repo"; import { revenueModuleKey } from "@/feature/core/revenue/domain/revenue-module-key"; -export default function fetchRevenuesUsecase(): Promise { - const repo = serverDi(revenueModuleKey).resolve(revenueModuleKey) +export default async function fetchRevenuesUsecase(): Promise { + const repo = serverDi(revenueModuleKey).resolve(revenueRepoKey) return repo.fetchRevenues() } \ No newline at end of file diff --git a/src/feature/core/summary-info/data/module/summary-info-di.ts b/src/feature/core/summary-info/data/module/summary-info-di.ts index cd181eb..9172b3d 100644 --- a/src/feature/core/summary-info/data/module/summary-info-di.ts +++ b/src/feature/core/summary-info/data/module/summary-info-di.ts @@ -2,7 +2,6 @@ import di from "@/bootstrap/di/init-di" import fetchCustomersAmountUsecase from "@/feature/core/customer/domain/usecase/fetch-customers-amount-usecase" import fetchAllInvoicesAmountUsecase from "@/feature/core/invoice/domain/usecase/fetch-all-invoices-amount-usecase" import fetchInvoicesStatusSummary from "@/feature/core/invoice/domain/usecase/fetch-invoices-status-summary" -import fetchSummaryInfoUsecase from "@/feature/core/summary-info/domain/usecase/fetch-summary-info-usecase" export default function getSummaryInfoDi() { const summaryInfoDi = di.createChildContainer() @@ -14,7 +13,7 @@ export default function getSummaryInfoDi() { useValue: fetchCustomersAmountUsecase }) summaryInfoDi.register(fetchInvoicesStatusSummary.name, { - useValue: fetchSummaryInfoUsecase + useValue: fetchInvoicesStatusSummary }) return summaryInfoDi } \ No newline at end of file