/* 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, include?: Record, orderBy?: Record, select?: Record, ) { 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 }; }