From b7f63479a61b7fab223fde4c0ed8c56ad88a230a Mon Sep 17 00:00:00 2001 From: Akhil Meka Date: Fri, 14 Nov 2025 17:51:31 +0530 Subject: [PATCH] feat: convert assignedTo field to string for permits --- src/permit/permit.schema.ts | 6 +-- src/permit/permit.service.ts | 87 +++++++++++++++++++++++------------- src/utils/diff.ts | 11 +++++ 3 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 src/utils/diff.ts diff --git a/src/permit/permit.schema.ts b/src/permit/permit.schema.ts index 578a6ea..0603210 100644 --- a/src/permit/permit.schema.ts +++ b/src/permit/permit.schema.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import mongoose from "mongoose"; +import mongoose, { Schema } from "mongoose"; import { buildJsonSchemas } from "fastify-zod"; import { pageMetadata, pageQueryParams } from "../pagination"; @@ -38,7 +38,7 @@ const permitSchema = new mongoose.Schema({ permitType: String, utility: String, assignedTo: { - type: mongoose.Types.ObjectId, + type: [Schema.Types.ObjectId], ref: "user", }, link: String, @@ -158,7 +158,7 @@ const permitCore = { cleanStatus: z.string().optional(), permitType: z.string().optional(), utility: z.string().nullable().optional(), - assignedTo: z.string().nullable().optional(), + assignedTo: z.array(z.string()).nullable().optional(), link: z.string().optional(), address: z .object({ diff --git a/src/permit/permit.service.ts b/src/permit/permit.service.ts index 6472003..54a4973 100644 --- a/src/permit/permit.service.ts +++ b/src/permit/permit.service.ts @@ -20,6 +20,7 @@ import { createNote } from "../note/note.service"; import { createAlert } from "../alert/alert.service"; import { processedModel } from "../processed/processed.schema"; import { orgModel } from "../organization/organization.schema"; +import { arrayDiff } from "../utils/diff"; export async function createPermit( input: CreatePermitInput, @@ -137,7 +138,7 @@ export async function listPermits( from: "users", localField: "assignedTo", foreignField: "_id", - as: "assignedRec", + as: "assignedTo", }, }, { @@ -190,13 +191,14 @@ export async function listPermits( deed: 1, requests: 1, assignedTo: { - $let: { - vars: { assigned: { $arrayElemAt: ["$assignedRec", 0] } }, + $map: { + input: "$assignedTo", + as: "user", in: { - _id: "$$assigned._id", - pid: "$$assigned.pid", - name: "$$assigned.name", - avatar: "$$assigned.avatar", + _id: "$$user._id", + pid: "$$user.pid", + name: "$$user.name", + avatar: "$$user.avatar", }, }, }, @@ -232,6 +234,10 @@ export async function updatePermit( permitId: string, user: AuthenticatedUser ) { + const oldPermitResult = await permitModel.findOne( + { pid: permitId }, + { assignedTo: 1 } + ); const updatePermitResult = await permitModel .findOneAndUpdate( { @@ -246,16 +252,11 @@ export async function updatePermit( if (updatePermitResult) { for (const key in input) { - if (["manualStatus", "utility", "assignedTo", "requests"].includes(key)) { + if (["manualStatus", "utility", "requests"].includes(key)) { let msg = ""; if (input[key] === null) { msg = `Cleared ${key}`; - } else if (key == "assignedTo") { - const user = await getUser(input.assignedTo); - if (!user) continue; - - msg = `Assigned to ${user.firstName + " " + user.lastName}`; } else if (key == "requests") { msg = `Updated ${key} to '${input[key].join(", ")}'`; } else { @@ -271,17 +272,6 @@ export async function updatePermit( user ); - if (key == "assignedTo" && input[key] != null) { - await createAlert( - user.tenantId, - `You are assigned to ${updatePermitResult.permitNumber}`, - "user", - input.assignedTo, - updatePermitResult.pid, - "permits" - ); - } - if (key == "requests" && input[key] != null) { const requestAlertsUsers = [ "6830d9ac46971e8148fda973", //Lucy @@ -314,6 +304,40 @@ export async function updatePermit( updatePermitResult.markModified("clientData"); await updatePermitResult.save(); } + } else if (key == "assignedTo") { + const newAssignees = arrayDiff( + updatePermitResult.assignedTo.map((item) => item._id), + oldPermitResult.assignedTo + ); + + if (newAssignees.length == 0) continue; + + let msg = "Assigned to:\n\n"; + + for (const assignee of newAssignees) { + const user = await getUser(assignee); + if (!user) continue; + + msg += `${user.firstName + " " + user.lastName}\n`; + + await createAlert( + user.tenantId, + `You are assigned to ${updatePermitResult.permitNumber}`, + "user", + assignee, + updatePermitResult.pid, + "permits" + ); + } + + await createNote( + { + content: msg, + }, + permitId, + "permits", + user + ); } } @@ -391,7 +415,7 @@ export async function searchPermit( from: "users", localField: "assignedTo", foreignField: "_id", - as: "assignedRec", + as: "assignedTo", }, }, { @@ -444,13 +468,14 @@ export async function searchPermit( deed: 1, requests: 1, assignedTo: { - $let: { - vars: { assigned: { $arrayElemAt: ["$assignedRec", 0] } }, + $map: { + input: "$assignedTo", + as: "user", in: { - _id: "$$assigned._id", - pid: "$$assigned.pid", - name: "$$assigned.name", - avatar: "$$assigned.avatar", + _id: "$$user._id", + pid: "$$user.pid", + name: "$$user.name", + avatar: "$$user.avatar", }, }, }, diff --git a/src/utils/diff.ts b/src/utils/diff.ts new file mode 100644 index 0000000..d3c2031 --- /dev/null +++ b/src/utils/diff.ts @@ -0,0 +1,11 @@ +import mongoose from "mongoose"; + +export function arrayDiff( + newArr: Array, + oldArr: Array +) { + const convertedNewArr = newArr.map((item) => item.toString()); + const convertedOldArr = oldArr.map((item) => item.toString()); + + return convertedNewArr.filter((item) => !convertedOldArr.includes(item)); +}