import { z } from "zod"; import { MongoFilter, parse } from "./utils/queryParser"; 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(), searchToken: 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) { if (params.filter && params.filter != "") { const parsedQuery = parse(params.filter.split("|")).filter( (query) => Object.keys(query).length > 0 ); return parsedQuery; } } export function getTaggedUsersFilter( filterObj: MongoFilter[], sortObj: Record ) { const taggedUserFilterIndex = filterObj.findIndex((item) => Object.keys(item).includes("taggedUsers") ); let taggedFilter = []; if (taggedUserFilterIndex != -1) { const filterItem = filterObj[taggedUserFilterIndex].taggedUsers; let filterValues = null; let notFlag = false; if (filterItem["$eq"]) { filterValues = [filterItem["$eq"]]; } else if (filterItem["$ne"]) { filterValues = [filterItem["$ne"]]; notFlag = true; } else if (filterItem["$in"]) { filterValues = filterItem["$in"]; } else { filterValues = filterItem["$nin"]; notFlag = true; } const condition = notFlag ? { $exists: false } : { $exists: true }; taggedFilter = [ { $addFields: { taggedUsersFilter: { $filter: { input: "$taggedUsers", as: "user", cond: { $in: ["$$user.userId", filterValues] }, }, }, }, }, { $match: { "taggedUsersFilter.0": condition } }, { $sort: { "taggedUsersFilter.taggedAt": sortObj.taggedUsers ?? -1 } }, ]; } return { taggedFilter, taggedUserFilterIndex }; }