67 lines
1.6 KiB
TypeScript
67 lines
1.6 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) => {
|
|
if (field.includes(".")) {
|
|
const parts: string[] = field.split(".");
|
|
|
|
// Helper function to build nested object
|
|
const buildNestedFilter = (parts: string[], index = 0): any => {
|
|
if (index === parts.length - 1) {
|
|
// Reached the last part - add the contains filter
|
|
return { [parts[index] as string]: { contains: searchTerm } };
|
|
}
|
|
|
|
// For intermediate levels, nest the next level
|
|
return { [parts[index] as string]: buildNestedFilter(parts, index + 1) };
|
|
};
|
|
|
|
return buildNestedFilter(parts);
|
|
}
|
|
|
|
return { [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 };
|
|
}
|