From 67be77ab9c8e1e470e5b3897e0aeb0a3b23cb2c5 Mon Sep 17 00:00:00 2001 From: behnam Date: Fri, 1 Nov 2024 15:45:53 +0300 Subject: [PATCH] Add fetch amount of invoice module --- src/app/lib/data.ts | 24 ------------------- src/app/lib/definitions.ts | 8 ------- src/feature/common/server-di.ts | 8 ++++++- .../data/module/customer-di.ts | 16 ------------- .../data/module/customer-invoice-di.ts | 16 +++++++++++++ src/feature/invoice/data/module/invoice-di.ts | 16 +++++++++++++ .../invoice/data/repo/invoice-db-repo.ts | 11 +++++++++ .../invoice/domain/i-repo/invoice-repo.ts | 6 +++++ .../fetch-all-invoices-amount-usecase.ts | 10 ++++++++ src/feature/invoice/invoice-module-key.ts | 1 + 10 files changed, 67 insertions(+), 49 deletions(-) delete mode 100644 src/feature/customer-invoice/data/module/customer-di.ts create mode 100644 src/feature/customer-invoice/data/module/customer-invoice-di.ts create mode 100644 src/feature/invoice/data/module/invoice-di.ts create mode 100644 src/feature/invoice/data/repo/invoice-db-repo.ts create mode 100644 src/feature/invoice/domain/i-repo/invoice-repo.ts create mode 100644 src/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts create mode 100644 src/feature/invoice/invoice-module-key.ts diff --git a/src/app/lib/data.ts b/src/app/lib/data.ts index d76cf24..b28fcb0 100644 --- a/src/app/lib/data.ts +++ b/src/app/lib/data.ts @@ -3,7 +3,6 @@ import { Revenue, Invoice, Customer, - LatestInvoice, } from './definitions'; import { formatCurrency } from './utils'; import postgres from 'postgres'; @@ -31,29 +30,6 @@ export async function fetchRevenue() { } } -export async function fetchLatestInvoices() { - // 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 - FROM invoices - JOIN customers ON invoices.customer_id = customers.id - ORDER BY invoices.date DESC - LIMIT 5` as postgres.RowList; - - const latestInvoices = data.map((invoice) => ({ - ...invoice, - amount: formatCurrency(+invoice.amount), - })); - return latestInvoices; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch the latest invoices.'); - } -} - export async function fetchCardData() { // This is equivalent to in fetch(..., {cache: 'no-store'}). connection() diff --git a/src/app/lib/definitions.ts b/src/app/lib/definitions.ts index e4cf179..b26dd32 100644 --- a/src/app/lib/definitions.ts +++ b/src/app/lib/definitions.ts @@ -18,14 +18,6 @@ export type Revenue = { revenue: number; }; -export type LatestInvoice = { - id: string; - name: string; - image_url: string; - email: string; - amount: string; -}; - export type InvoiceForm = { id: string; customer_id: string; diff --git a/src/feature/common/server-di.ts b/src/feature/common/server-di.ts index 78095a9..bd28b80 100644 --- a/src/feature/common/server-di.ts +++ b/src/feature/common/server-di.ts @@ -1,13 +1,19 @@ +import getCustomerInvoiceDi from "@/feature/customer-invoice/data/module/customer-invoice-di"; +import { customerInvoiceModuleKey } from "@/feature/customer-invoice/invoice-module-key"; import { customerKey } from "@/feature/customer/customer-key"; import getCustomerDi from "@/feature/customer/data/module/customer-di"; import { testModuleKey } from "@/feature/domain/test/test-module-key"; import getTestModule from "@/feature/infra/test/module/test-module"; +import getInvoiceDi from "@/feature/invoice/data/module/invoice-di"; +import { invoiceModuleKey } from "@/feature/invoice/invoice-module-key"; import { DependencyContainer } from "tsyringe"; export default function serverDi(module: string): DependencyContainer { const getDi = { [testModuleKey]: getTestModule, - [customerKey]: getCustomerDi + [customerKey]: getCustomerDi, + [customerInvoiceModuleKey]: getCustomerInvoiceDi, + [invoiceModuleKey]: getInvoiceDi, }[module] if (!getDi) throw new Error("Server Di didn't found for module: " + module) diff --git a/src/feature/customer-invoice/data/module/customer-di.ts b/src/feature/customer-invoice/data/module/customer-di.ts deleted file mode 100644 index 4d153a8..0000000 --- a/src/feature/customer-invoice/data/module/customer-di.ts +++ /dev/null @@ -1,16 +0,0 @@ -import di from "@/bootstrap/di/init-di"; -import CustomerDbRepo from "@/feature/customer/data/repo/customer-db-repo"; -import { customerRepoKey } from "@/feature/customer/domain/i-repo/customer-repo"; -import fetchCustomersUsecase from "@/feature/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/customer-invoice/data/module/customer-invoice-di.ts b/src/feature/customer-invoice/data/module/customer-invoice-di.ts new file mode 100644 index 0000000..fa6712e --- /dev/null +++ b/src/feature/customer-invoice/data/module/customer-invoice-di.ts @@ -0,0 +1,16 @@ +import di from "@/bootstrap/di/init-di"; +import { customerInvoiceRepoKey } from "@/feature/customer-invoice/domain/i-repo/customer-invoice-repo"; +import fetchCustomerInvoicesUsecase from "@/feature/customer-invoice/domain/usecase/fetch-customer-invoices-usecase"; +import CustomerDbRepo from "@/feature/customer/data/repo/customer-db-repo"; +import { DependencyContainer } from "tsyringe"; + +export default function getCustomerInvoiceInvoiceDi(): DependencyContainer { + const customerInvoiceDi = di.createChildContainer() + + customerInvoiceDi.register(fetchCustomerInvoicesUsecase.name, { + useValue: fetchCustomerInvoicesUsecase + }) + + customerInvoiceDi.register(customerInvoiceRepoKey, CustomerDbRepo) + return customerInvoiceDi +} \ No newline at end of file diff --git a/src/feature/invoice/data/module/invoice-di.ts b/src/feature/invoice/data/module/invoice-di.ts new file mode 100644 index 0000000..28ce2e0 --- /dev/null +++ b/src/feature/invoice/data/module/invoice-di.ts @@ -0,0 +1,16 @@ +import di from "@/bootstrap/di/init-di"; +import invoiceDbRepo from "@/feature/invoice/data/repo/invoice-db-repo"; +import { invoiceRepoKey } from "@/feature/invoice/domain/i-repo/invoice-repo"; +import fetchAllInvoicesAmountUsecase from "@/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase"; +import { DependencyContainer } from "tsyringe"; + +export default function getInvoiceDi(): DependencyContainer { + const invoiceDi = di.createChildContainer() + + invoiceDi.register(fetchAllInvoicesAmountUsecase.name, { + useValue: fetchAllInvoicesAmountUsecase + }) + + invoiceDi.register(invoiceRepoKey, invoiceDbRepo) + return invoiceDi +} \ No newline at end of file diff --git a/src/feature/invoice/data/repo/invoice-db-repo.ts b/src/feature/invoice/data/repo/invoice-db-repo.ts new file mode 100644 index 0000000..5191d67 --- /dev/null +++ b/src/feature/invoice/data/repo/invoice-db-repo.ts @@ -0,0 +1,11 @@ +import { sql } from "@/bootstrap/db/db"; +import InvoiceRepo from "@/feature/invoice/domain/i-repo/invoice-repo"; +import postgres from "postgres"; + +export default class InvoiceDbRepo implements InvoiceRepo { + async fetchAllInvoicesAmount(): Promise { + const data = await sql`SELECT COUNT(*) FROM invoices` as postgres.RowList; + + return data.count ?? 0 + } +} \ No newline at end of file diff --git a/src/feature/invoice/domain/i-repo/invoice-repo.ts b/src/feature/invoice/domain/i-repo/invoice-repo.ts new file mode 100644 index 0000000..fb4c8a2 --- /dev/null +++ b/src/feature/invoice/domain/i-repo/invoice-repo.ts @@ -0,0 +1,6 @@ + +export default interface InvoiceRepo { + fetchAllInvoicesAmount(): Promise +} + +export const invoiceRepoKey = "invoiceRepoKey" \ No newline at end of file diff --git a/src/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts b/src/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts new file mode 100644 index 0000000..1922f81 --- /dev/null +++ b/src/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase.ts @@ -0,0 +1,10 @@ +"use server" +import serverDi from "@/feature/common/server-di"; +import InvoiceRepo, { invoiceRepoKey } from "@/feature/invoice/domain/i-repo/invoice-repo"; +import { invoiceModuleKey } from "@/feature/invoice/invoice-module-key"; + +export default function fetchAllInvoicesAmountUsecase(): Promise { + const repo = serverDi(invoiceModuleKey).resolve(invoiceRepoKey) + + return repo.fetchAllInvoicesAmount() +} \ No newline at end of file diff --git a/src/feature/invoice/invoice-module-key.ts b/src/feature/invoice/invoice-module-key.ts new file mode 100644 index 0000000..c9cafd9 --- /dev/null +++ b/src/feature/invoice/invoice-module-key.ts @@ -0,0 +1 @@ +export const invoiceModuleKey = "invoiceModuleKey" \ No newline at end of file