From 83786e2994068e58d107fe8cbc5078417879c199 Mon Sep 17 00:00:00 2001 From: Akhil Reddy Date: Thu, 2 Jan 2025 11:19:44 +0530 Subject: [PATCH] Add sorting --- src/organization/organization.schema.ts | 46 ++++++------ src/organization/organization.service.ts | 10 ++- src/pagination.ts | 23 ++++++ src/permit/permit.schema.ts | 90 ++++++++++++------------ src/permit/permit.service.ts | 10 ++- 5 files changed, 109 insertions(+), 70 deletions(-) diff --git a/src/organization/organization.schema.ts b/src/organization/organization.schema.ts index cb11d7d..3a6a1c0 100644 --- a/src/organization/organization.schema.ts +++ b/src/organization/organization.schema.ts @@ -3,30 +3,32 @@ import mongoose from "mongoose"; import { z } from "zod"; import { pageMetadata, pageQueryParams } from "../pagination"; -export const orgModel = mongoose.model( - "organization", - new mongoose.Schema({ - tenantId: { - type: String, - required: true, - }, - pid: { - type: String, - unique: true, - }, - name: String, - domain: { - type: String, - }, - avatar: String, +const orgSchema = new mongoose.Schema({ + tenantId: { type: String, - isClient: Boolean, - status: String, - createdAt: Date, - createdBy: String, - updatedAt: Date, - }).index({ tenantId: 1, domain: 1 }, { unique: true }) + required: true, + }, + pid: { + type: String, + unique: true, + }, + name: String, + domain: { + type: String, + }, + avatar: String, + type: String, + isClient: Boolean, + status: String, + createdAt: Date, + createdBy: String, + updatedAt: Date, +}).index({ tenantId: 1, domain: 1 }, { unique: true }); + +export const orgFields = Object.keys(orgSchema.paths).filter( + (path) => path !== "__v" ); +export const orgModel = mongoose.model("organization", orgSchema); const orgCore = { name: z.string().max(30), diff --git a/src/organization/organization.service.ts b/src/organization/organization.service.ts index 5f7ba25..07b4cfe 100644 --- a/src/organization/organization.service.ts +++ b/src/organization/organization.service.ts @@ -1,7 +1,8 @@ -import { PageQueryParams } from "../pagination"; +import { getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreateOrgInput, + orgFields, orgModel, UpdateOrgInput, } from "./organization.schema"; @@ -26,13 +27,18 @@ export async function getOrg(orgId: string, tenantId: string) { export async function listOrgs(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; + const sortObj = getSortObject(params, orgFields); const orgs = await orgModel.aggregate([ { $match: { $and: [{ tenantId: tenantId }] } }, { $facet: { metadata: [{ $count: "count" }], - data: [{ $skip: (page - 1) * pageSize }, { $limit: pageSize }], + data: [ + { $skip: (page - 1) * pageSize }, + { $limit: pageSize }, + { $sort: sortObj }, + ], }, }, ]); diff --git a/src/pagination.ts b/src/pagination.ts index e738aa6..3479c94 100644 --- a/src/pagination.ts +++ b/src/pagination.ts @@ -9,6 +9,29 @@ export const pageMetadata = z.object({ 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; +} diff --git a/src/permit/permit.schema.ts b/src/permit/permit.schema.ts index 7940454..3c3ff54 100644 --- a/src/permit/permit.schema.ts +++ b/src/permit/permit.schema.ts @@ -3,51 +3,53 @@ import mongoose from "mongoose"; import { buildJsonSchemas } from "fastify-zod"; import { pageMetadata, pageQueryParams } from "../pagination"; -export const permitModel = mongoose.model( - "permit", - new mongoose.Schema({ - tenantId: { - type: String, - required: true, - }, - pid: { - type: String, - unique: true, - }, - permitNumber: String, - county: { - type: mongoose.Types.ObjectId, - ref: "organization", - }, - client: { - type: mongoose.Types.ObjectId, - ref: "organization", - }, - permitDate: Date, - stage: String, - status: String, - assignedTo: { - type: mongoose.Types.ObjectId, - ref: "user", - }, - link: String, - address: String, - recordType: String, - description: String, - applicationDetails: Object, - applicationInfo: Object, - applicationInfoTable: Object, - conditions: Array, - ownerDetails: String, - parcelInfo: Object, - paymentData: Object, - professionalsList: Array, - inspections: Object, - createdAt: Date, - updatedAt: Date, - createdBy: String, - }).index({ tenantId: 1, permitNumber: 1 }, { unique: true }) +const permitSchema = new mongoose.Schema({ + tenantId: { + type: String, + required: true, + }, + pid: { + type: String, + unique: true, + }, + permitNumber: String, + county: { + type: mongoose.Types.ObjectId, + ref: "organization", + }, + client: { + type: mongoose.Types.ObjectId, + ref: "organization", + }, + permitDate: Date, + stage: String, + status: String, + assignedTo: { + type: mongoose.Types.ObjectId, + ref: "user", + }, + link: String, + address: String, + recordType: String, + description: String, + applicationDetails: Object, + applicationInfo: Object, + applicationInfoTable: Object, + conditions: Array, + ownerDetails: String, + parcelInfo: Object, + paymentData: Object, + professionalsList: Array, + inspections: Object, + createdAt: Date, + updatedAt: Date, + createdBy: String, +}).index({ tenantId: 1, permitNumber: 1 }, { unique: true }); + +export const permitFields = Object.keys(permitSchema.paths).filter( + (path) => path !== "__v" ); +export const permitModel = mongoose.model("permit", permitSchema); const permitCore = { permitNumber: z.string(), diff --git a/src/permit/permit.service.ts b/src/permit/permit.service.ts index f2ea57a..bcae309 100644 --- a/src/permit/permit.service.ts +++ b/src/permit/permit.service.ts @@ -1,7 +1,8 @@ -import { PageQueryParams } from "../pagination"; +import { getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreatePermitInput, + permitFields, permitModel, UpdatePermitInput, } from "./permit.schema"; @@ -29,6 +30,7 @@ export async function getPermit(permitId: string, tenantId: string) { export async function listPermits(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; + const sortObj = getSortObject(params, permitFields); const permitsList = await permitModel.aggregate([ { @@ -74,7 +76,11 @@ export async function listPermits(params: PageQueryParams, tenantId: string) { { $facet: { metadata: [{ $count: "count" }], - data: [{ $skip: (page - 1) * pageSize }, { $limit: pageSize }], + data: [ + { $skip: (page - 1) * pageSize }, + { $limit: pageSize }, + { $sort: sortObj }, + ], }, }, ]);