Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions src/constants/serverUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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<OrderFindManyArgs, OrderFindManyArgs>): SelectSubset<OrderFindManyArgs, OrderFindManyArgs> => {
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;
}
6 changes: 6 additions & 0 deletions src/pages/api/admin/order/[id]/invoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
81 changes: 19 additions & 62 deletions src/pages/api/admin/order/index.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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);

Expand Down
11 changes: 9 additions & 2 deletions src/pages/api/admin/order/invoice.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
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";
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
Expand All @@ -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,
Expand Down
Loading