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}
+ {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