97 lines
2.5 KiB
TypeScript
97 lines
2.5 KiB
TypeScript
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<typeof pageQueryParams>;
|
|
|
|
export function getSortObject(
|
|
params: PageQueryParams,
|
|
validFields: Array<string>
|
|
) {
|
|
const sortObj: Record<string, 1 | -1> = {};
|
|
|
|
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<string, 1 | -1>
|
|
) {
|
|
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 };
|
|
}
|