All checks were successful
Docker Deploy / build-and-push (push) Successful in 4m3s
80 lines
1.9 KiB
TypeScript
80 lines
1.9 KiB
TypeScript
import type { APIRoute } from "astro";
|
|
import { db } from "../../../../../db";
|
|
import { invoiceItems, invoices, members } from "../../../../../db/schema";
|
|
import { eq, and } from "drizzle-orm";
|
|
import { recalculateInvoiceTotals } from "../../../../../utils/invoice";
|
|
|
|
export const POST: APIRoute = async ({
|
|
request,
|
|
redirect,
|
|
locals,
|
|
params,
|
|
}) => {
|
|
const user = locals.user;
|
|
if (!user) {
|
|
return redirect("/login");
|
|
}
|
|
|
|
const { id: invoiceId } = params;
|
|
if (!invoiceId) {
|
|
return new Response("Invoice ID required", { status: 400 });
|
|
}
|
|
|
|
const invoice = await db
|
|
.select()
|
|
.from(invoices)
|
|
.where(eq(invoices.id, invoiceId))
|
|
.get();
|
|
|
|
if (!invoice) {
|
|
return new Response("Invoice not found", { status: 404 });
|
|
}
|
|
|
|
const membership = await db
|
|
.select()
|
|
.from(members)
|
|
.where(
|
|
and(
|
|
eq(members.userId, user.id),
|
|
eq(members.organizationId, invoice.organizationId)
|
|
)
|
|
)
|
|
.get();
|
|
|
|
if (!membership) {
|
|
return new Response("Unauthorized", { status: 401 });
|
|
}
|
|
|
|
if (invoice.status !== "draft") {
|
|
return new Response("Cannot edit a finalized invoice", { status: 400 });
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
const itemId = formData.get("itemId") as string;
|
|
|
|
if (!itemId) {
|
|
return new Response("Item ID required", { status: 400 });
|
|
}
|
|
|
|
const item = await db
|
|
.select()
|
|
.from(invoiceItems)
|
|
.where(and(eq(invoiceItems.id, itemId), eq(invoiceItems.invoiceId, invoiceId)))
|
|
.get();
|
|
|
|
if (!item) {
|
|
return new Response("Item not found", { status: 404 });
|
|
}
|
|
|
|
try {
|
|
await db.delete(invoiceItems).where(eq(invoiceItems.id, itemId));
|
|
|
|
await recalculateInvoiceTotals(invoiceId);
|
|
|
|
return redirect(`/dashboard/invoices/${invoiceId}`);
|
|
} catch (error) {
|
|
console.error("Error deleting invoice item:", error);
|
|
return new Response("Internal Server Error", { status: 500 });
|
|
}
|
|
};
|