diff --git a/src/constants/serverUtil.ts b/src/constants/serverUtil.ts index e13293b..0f66629 100644 --- a/src/constants/serverUtil.ts +++ b/src/constants/serverUtil.ts @@ -10,6 +10,9 @@ import { Ticket, Tickets } from "../store/reducers/orderReducer"; import { eventDateIsBookable } from "./util"; import { SeatMap } from "../components/seatselection/seatmap/SeatSelectionMap"; import { randomBytes } from "crypto"; +import { Prisma } from ".prisma/client"; +import OrderFindManyArgs = Prisma.OrderFindManyArgs; +import SelectSubset = Prisma.SelectSubset; export function getStaticAssetFile(file, options = null) { let basePath = process.cwd(); @@ -322,3 +325,54 @@ export const getSeatMap = async (eventDateId, withOccupiedMarked, reservationId? } return seatMap; } + +export const setProperty = (object: any, path: string, value: any) => { + const pList = path.split("."); + const len = pList.length; + for(let i = 0; i < len-1; i++) { + const elem = pList[i]; + if( !object[elem] ) object[elem] = {} + object = object[elem]; + } + + object[pList[len-1]] = value; + return object; +} + +export const makeOrderDBRequestFromQuery = (query: Partial<{[p: string]: string | string[]}>, baseRequest?: SelectSubset): SelectSubset => { + let {page, amount, shipping, eventId, event, payment, customerFirstName, customerLastName, sorting}: any = query; + const request = baseRequest ?? {}; + if (amount) { + request["take"] = parseInt(amount as string); + if (page) + request["skip"] = parseInt(page as string) * parseInt(amount as string); + } + if (shipping) { + setProperty(request, "where.shipping.contains", `"type":"${shipping}"`); + } + if (eventId) { + setProperty(request, "where.eventId", parseInt(eventId)); + } + if (event) { + setProperty(request, "where.event.title", event); + } + if (payment) { + setProperty(request, "where.paymentType", payment); + } + if (customerFirstName) { + setProperty(request, "where.user.firstName.contains", customerFirstName); + } + if (customerLastName) { + setProperty(request, "where.user.lastName.contains", customerLastName); + } + if (sorting) { + sorting = decodeURIComponent(sorting); + setProperty(request, "orderBy", sorting.split(",").map(sort => { + const split = sort.split(":"); + const result = {}; + setProperty(result, split[0], split[1]); + return result; + })); + } + return request; +} diff --git a/src/pages/api/admin/order/[id]/invoice.ts b/src/pages/api/admin/order/[id]/invoice.ts index 239eed8..d26115f 100644 --- a/src/pages/api/admin/order/[id]/invoice.ts +++ b/src/pages/api/admin/order/[id]/invoice.ts @@ -6,6 +6,12 @@ import { generateInvoice } from "../../../../../lib/invoice"; import { getOptionData } from "../../../../../lib/options"; import { Options } from "../../../../../constants/Constants"; +export const config = { + api: { + responseLimit: false, + }, +}; + export default async function handler( req: NextApiRequest, res: NextApiResponse diff --git a/src/pages/api/admin/order/index.ts b/src/pages/api/admin/order/index.ts index 609907f..93d9f1c 100644 --- a/src/pages/api/admin/order/index.ts +++ b/src/pages/api/admin/order/index.ts @@ -1,25 +1,12 @@ import { NextApiRequest, NextApiResponse } from "next"; import { + makeOrderDBRequestFromQuery, serverAuthenticate } from "../../../../constants/serverUtil"; import prisma from "../../../../lib/prisma"; import { PermissionSection, PermissionType } from "../../../../constants/interfaces"; import { json2csvAsync } from 'json-2-csv'; -function setProperty(object, path, value) { - const pList = path.split("."); - const len = pList.length; - for(let i = 0; i < len-1; i++) { - const elem = pList[i]; - if( !object[elem] ) object[elem] = {} - object = object[elem]; - } - - object[pList[len-1]] = value; - return object; -} - - export default async function handler( req: NextApiRequest, res: NextApiResponse @@ -31,57 +18,27 @@ export default async function handler( if (!user) return; if (req.method === "GET") { - const request = { - include: { - eventDate: { - select: { - title: true, - date: true, - event: { - select: { - title: true + const request = makeOrderDBRequestFromQuery( + req.query, + { + include: { + eventDate: { + select: { + title: true, + date: true, + event: { + select: { + title: true + } } } - } - }, - user: true, - tickets: true + }, + user: true, + tickets: true + } } - } - let {page, amount, shipping, eventId, event, payment, customerFirstName, customerLastName, sorting, exportFile}: any = req.query; - - if (amount) { - request["take"] = parseInt(amount as string); - if (page) - request["skip"] = parseInt(page as string) * parseInt(amount as string); - } - if (shipping) { - setProperty(request, "where.shipping.contains", `"type":"${shipping}"`); - } - if (eventId) { - setProperty(request, "where.eventId", parseInt(eventId)); - } - if (event) { - setProperty(request, "where.event.title", event); - } - if (payment) { - setProperty(request, "where.paymentType", payment); - } - if (customerFirstName) { - setProperty(request, "where.user.firstName.contains", customerFirstName); - } - if (customerLastName) { - setProperty(request, "where.user.lastName.contains", customerLastName); - } - if (sorting) { - sorting = decodeURIComponent(sorting); - setProperty(request, "orderBy", sorting.split(",").map(sort => { - const split = sort.split(":"); - const result = {}; - setProperty(result, split[0], split[1]); - return result; - })); - } + ); + let {exportFile}: any = req.query; const orders = await prisma.order.findMany(request); diff --git a/src/pages/api/admin/order/invoice.ts b/src/pages/api/admin/order/invoice.ts index 908c0ff..61f6c6e 100644 --- a/src/pages/api/admin/order/invoice.ts +++ b/src/pages/api/admin/order/invoice.ts @@ -1,5 +1,5 @@ import {NextApiRequest, NextApiResponse} from "next"; -import { getStaticAssetFile, serverAuthenticate } from "../../../../constants/serverUtil"; +import { getStaticAssetFile, makeOrderDBRequestFromQuery, serverAuthenticate } from "../../../../constants/serverUtil"; import { PermissionSection, PermissionType } from "../../../../constants/interfaces"; import prisma from "../../../../lib/prisma"; import { generateInvoice } from "../../../../lib/invoice"; @@ -7,6 +7,12 @@ import { getOptionData } from "../../../../lib/options"; import { Options } from "../../../../constants/Constants"; import PDFMerger from "pdf-merger-js"; +export const config = { + api: { + responseLimit: false, + }, +}; + export default async function handler( req: NextApiRequest, res: NextApiResponse @@ -21,7 +27,8 @@ export default async function handler( if (req.method === "GET") { const pdfs = []; const merger = new PDFMerger(); - const orders = await prisma.order.findMany(); + const request = makeOrderDBRequestFromQuery(req.query); + const orders = await prisma.order.findMany(request); for (const order of orders) { const invoiceData = await generateInvoice( (await getOptionData(Options.TemplateInvoice, getStaticAssetFile("invoice/template.html", "utf-8"))).data,