import { z } from "zod"; export const pageMetadata = z.object({ count: z.number(), page: z.number(), pageSize: z.number(), }); export const pageQueryParams = z.object({ page: z.number().optional(), pageSize: z.number().optional(), sort: z.string().optional(), filter: z.string().optional(), }); export type PageQueryParams = z.infer; export function getSortObject( params: PageQueryParams, validFields: Array ) { const sortObj: Record = {}; if (params.sort && params.sort != "") { const sortOptions = params.sort.split(","); sortOptions.forEach((item) => { const order = item.startsWith("-") ? -1 : 1; const field = item.replace("-", "").trim(); if (validFields.includes(field)) sortObj[field] = order; }); } if (Object.keys(sortObj).length == 0) sortObj["createdAt"] = -1; return sortObj; } export function getFilterObject( params: PageQueryParams, validFields: Array ) { const filterObj: Array<{}> = []; if (params.filter && params.filter != "") { const filterOptions = params.filter.split(","); filterOptions.forEach((item) => { if (item.includes("!=")) { const [key, val] = item.split("!=").map((token) => token.trim()); if (validFields.includes(key)) filterObj.push({ [key]: { $ne: val } }); } else if (item.includes("=")) { const [key, val] = item.split("=").map((token) => token.trim()); if (validFields.includes(key)) filterObj.push({ [key]: { $eq: val } }); } }); } return filterObj; }