98 lines
2.8 KiB
TypeScript

import { Request, Response } from "express";
import prisma, { Prisma } from "@server/prisma";
import { AjaxData, AjaxResponse } from "datatables.net-dt";
type ModelDelegateFindManyArgs = {
skip?: number;
take?: number;
orderBy?: any;
where?: any;
include?: any;
};
type ModelDelegate = {
findMany(args: ModelDelegateFindManyArgs): Promise<any[]>;
count(args?: { where?: any }): Promise<number>;
};
interface DatatableQuery extends AjaxData {
filters: { [key: string]: any };
}
export const datatableRequest = async <TOrderBy, TWhere>(
request: Request,
response: Response,
model: ModelDelegate,
defaultOrderBy: TOrderBy,
include?: object,
baseWhere?: object
) => {
const query = request.body as unknown as DatatableQuery;
const orderBy = query.order?.length
? { [query.columns[query.order[0].column].data]: query.order[0].dir } as unknown as TOrderBy
: defaultOrderBy;
let filterWhere = query.search?.value
? {
OR: Object.values(query.columns)
.filter(col => col.searchable)
.map(col => ({
[col.data]: { contains: query.search.value }
})) as TWhere
}
: {};
filterWhere = { ...filterWhere, ...baseWhere };
const data = await model.findMany({
skip: query.start,
take: query.length,
orderBy: orderBy,
where: filterWhere,
include: include,
});
const recordsFiltered = await model.count({ where: filterWhere });
const recordsTotal = await model.count({ where: baseWhere });
response.json({
data,
recordsFiltered,
recordsTotal,
draw: query.draw,
} as AjaxResponse);
};
export const oldDatatable = async (request: Request, response: Response) => {
const query = request.body as unknown as DatatableQuery;
const orderBy: Prisma.FeedOrderByWithRelationInput = query.order?.length
? { [query.columns[query.order[0].column].data]: query.order[0].dir }
: { id: "asc" };
const where: Prisma.FeedWhereInput = query.search?.value
? {
OR: Object.values(query.columns)
.filter(col => col.searchable)
.map(col => ({
[col.data]: { contains: query.search.value }
})) as Prisma.FeedWhereInput[]
}
: {};
const data = await prisma.feed.findMany({
skip: query.start,
take: query.length,
orderBy: orderBy,
where: where,
include: { channels: true },
});
response.json(<AjaxResponse>{
data: data,
recordsFiltered: await prisma.feed.count({ where: where }),
recordsTotal: await prisma.feed.count(),
draw: query.draw
});
};