50 lines
1.0 KiB
TypeScript
50 lines
1.0 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
"use server";
|
|
import { prisma, PrismaClient } from "@repo/db";
|
|
|
|
export async function getData(
|
|
model: keyof PrismaClient,
|
|
limit: number,
|
|
offset: number,
|
|
searchTerm: string,
|
|
searchFields: string[],
|
|
filter?: Record<string, any>,
|
|
include?: Record<string, boolean>,
|
|
orderBy?: Record<string, "asc" | "desc">,
|
|
select?: Record<string, any>,
|
|
) {
|
|
if (!model || !prisma[model]) {
|
|
return { data: [], total: 0 };
|
|
}
|
|
|
|
const formattedId = searchTerm.match(/^VAR(\d+)$/)?.[1];
|
|
|
|
const where = searchTerm
|
|
? {
|
|
OR: [
|
|
formattedId ? { id: formattedId } : undefined,
|
|
...searchFields.map((field) => ({
|
|
[field]: { contains: searchTerm },
|
|
})),
|
|
].filter(Boolean),
|
|
...filter,
|
|
}
|
|
: { ...filter };
|
|
|
|
if (!prisma[model]) {
|
|
return { data: [], total: 0 };
|
|
}
|
|
const data = await (prisma[model] as any).findMany({
|
|
where,
|
|
orderBy,
|
|
take: limit,
|
|
skip: offset,
|
|
include,
|
|
select,
|
|
});
|
|
|
|
const total = await (prisma[model] as any).count({ where });
|
|
|
|
return { data, total };
|
|
}
|