98 lines
2.8 KiB
TypeScript
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
|
|
});
|
|
}; |