From fff0e14a4b30cc0a5f71a9b46105aa6f7740f121 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 20 Jan 2026 11:10:31 -0700 Subject: [PATCH] Fixed --- src/pages/api/invoices/[id]/generate.ts | 45 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/pages/api/invoices/[id]/generate.ts b/src/pages/api/invoices/[id]/generate.ts index e967c6e..73fc0bd 100644 --- a/src/pages/api/invoices/[id]/generate.ts +++ b/src/pages/api/invoices/[id]/generate.ts @@ -1,7 +1,13 @@ import type { APIRoute } from "astro"; import { renderToStream } from "@ceereals/vue-pdf"; import { db } from "../../../../db"; -import { invoices, invoiceItems, clients, organizations, members } from "../../../../db/schema"; +import { + invoices, + invoiceItems, + clients, + organizations, + members, +} from "../../../../db/schema"; import { eq, and } from "drizzle-orm"; import { createInvoiceDocument } from "../../../../pdf/generateInvoicePDF"; @@ -17,11 +23,12 @@ export const GET: APIRoute = async ({ params, locals }) => { } // Fetch invoice with related data - const invoiceResult = await db.select({ - invoice: invoices, - client: clients, - organization: organizations, - }) + const invoiceResult = await db + .select({ + invoice: invoices, + client: clients, + organization: organizations, + }) .from(invoices) .leftJoin(clients, eq(invoices.clientId, clients.id)) .innerJoin(organizations, eq(invoices.organizationId, organizations.id)) @@ -35,12 +42,15 @@ export const GET: APIRoute = async ({ params, locals }) => { const { invoice, client, organization } = invoiceResult; // Verify membership - const membership = await db.select() + const membership = await db + .select() .from(members) - .where(and( - eq(members.userId, user.id), - eq(members.organizationId, invoice.organizationId) - )) + .where( + and( + eq(members.userId, user.id), + eq(members.organizationId, invoice.organizationId), + ), + ) .get(); if (!membership) { @@ -48,7 +58,8 @@ export const GET: APIRoute = async ({ params, locals }) => { } // Fetch items - const items = await db.select() + const items = await db + .select() .from(invoiceItems) .where(eq(invoiceItems.invoiceId, invoice.id)) .all(); @@ -82,12 +93,18 @@ export const GET: APIRoute = async ({ params, locals }) => { zip: organization.zip || null, country: organization.country || null, logoUrl: organization.logoUrl || null, - } + }, }); const stream = await renderToStream(document); + const chunks: Uint8Array[] = []; - return new Response(stream, { + for await (const chunk of stream) { + chunks.push(chunk as Uint8Array); + } + const buffer = Buffer.concat(chunks); + + return new Response(buffer, { headers: { "Content-Type": "application/pdf", "Content-Disposition": `attachment; filename="${invoice.number}.pdf"`,