From 7e3218f84e7d1e37f9c43f3421fd5131502d17d1 Mon Sep 17 00:00:00 2001 From: Akhil Reddy Date: Mon, 6 Jan 2025 18:30:31 +0530 Subject: [PATCH] Add filtering --- src/organization/organization.controller.ts | 2 +- src/organization/organization.service.ts | 8 ++++++-- src/pagination.ts | 22 +++++++++++++++++++++ src/permit/permit.service.ts | 10 +++++++--- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/organization/organization.controller.ts b/src/organization/organization.controller.ts index b3d2828..5834203 100644 --- a/src/organization/organization.controller.ts +++ b/src/organization/organization.controller.ts @@ -38,7 +38,7 @@ export async function getOrgHandler(req: FastifyRequest, res: FastifyReply) { export async function listOrgsHandler(req: FastifyRequest, res: FastifyReply) { const queryParams = req.query as PageQueryParams; - console.log(req.user); + try { const authUser = req.user; const orgList = await listOrgs(queryParams, authUser.tenantId); diff --git a/src/organization/organization.service.ts b/src/organization/organization.service.ts index 07b4cfe..d51605a 100644 --- a/src/organization/organization.service.ts +++ b/src/organization/organization.service.ts @@ -1,4 +1,4 @@ -import { getSortObject, PageQueryParams } from "../pagination"; +import { getFilterObject, getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreateOrgInput, @@ -28,9 +28,10 @@ export async function listOrgs(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; const sortObj = getSortObject(params, orgFields); + const filterObj = getFilterObject(params, orgFields); const orgs = await orgModel.aggregate([ - { $match: { $and: [{ tenantId: tenantId }] } }, + { $match: { $and: [{ tenantId: tenantId }, ...filterObj] } }, { $facet: { metadata: [{ $count: "count" }], @@ -43,6 +44,9 @@ export async function listOrgs(params: PageQueryParams, tenantId: string) { }, ]); + if (orgs[0].data.length === 0) + return { orgs: [], metadata: { count: 0, page, pageSize } }; + return { orgs: orgs[0].data, metadata: { diff --git a/src/pagination.ts b/src/pagination.ts index 3479c94..1ff21d1 100644 --- a/src/pagination.ts +++ b/src/pagination.ts @@ -35,3 +35,25 @@ export function getSortObject( 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; +} diff --git a/src/permit/permit.service.ts b/src/permit/permit.service.ts index bcae309..8ece40e 100644 --- a/src/permit/permit.service.ts +++ b/src/permit/permit.service.ts @@ -1,4 +1,4 @@ -import { getSortObject, PageQueryParams } from "../pagination"; +import { getFilterObject, getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreatePermitInput, @@ -31,10 +31,11 @@ export async function listPermits(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; const sortObj = getSortObject(params, permitFields); + const filterObj = getFilterObject(params, permitFields); const permitsList = await permitModel.aggregate([ { - $match: { $and: [{ tenantId: tenantId }] }, + $match: { $and: [{ tenantId: tenantId }, ...filterObj] }, }, { $lookup: { @@ -85,8 +86,11 @@ export async function listPermits(params: PageQueryParams, tenantId: string) { }, ]); + if (permitsList[0].data.length === 0) + return { permits: [], metadata: { count: 0, page, pageSize } }; + return { - permits: permitsList[0].data, + permits: permitsList[0]?.data, metadata: { count: permitsList[0].metadata[0].count, page,