feat: make assignedTo field accept multiple values for all collections

This commit is contained in:
2025-11-18 13:32:47 +05:30
parent b7f63479a6
commit 8f5c0a1827
12 changed files with 202 additions and 108 deletions

View File

@@ -1,5 +1,5 @@
import z from "zod";
import mongoose from "mongoose";
import mongoose, { Schema } from "mongoose";
import { pageQueryParams } from "../pagination";
import { buildJsonSchemas } from "fastify-zod";
@@ -38,7 +38,7 @@ const processedSchema = new mongoose.Schema({
permitType: String,
utility: String,
assignedTo: {
type: mongoose.Types.ObjectId,
type: [Schema.Types.ObjectId],
ref: "user",
},
link: String,
@@ -131,13 +131,13 @@ const updateProcessedInput = z.object({
block: z.string().nullable().optional(),
jobNumber: z.string().nullable().optional(),
startDate: z.date().nullable().optional(),
assignedTo: z.string().nullable().optional(),
assignedTo: z.array(z.string()).nullable().optional(),
noc: z.string().optional(),
deed: z.string().optional(),
requests: z.array(z.string()).optional(),
relatedRecords: z
.object({
custon_id: z.string(),
custom_id: z.string(),
relationship: z.string(),
type_text: z.string(),
})

View File

@@ -15,6 +15,7 @@ import { createNote } from "../note/note.service";
import { createAlert } from "../alert/alert.service";
import { getUser } from "../user/user.service";
import { orgModel } from "../organization/organization.schema";
import { arrayDiff } from "../utils/diff";
export async function getProcessedPermit(
permitId: String,
@@ -38,6 +39,10 @@ export async function updateProcessed(
permitId: string,
user: AuthenticatedUser
) {
const oldPermitResult = await processedModel.findOne(
{ pid: permitId },
{ assignedTo: 1 }
);
const updateProcessedResult = await processedModel
.findOneAndUpdate(
{
@@ -52,16 +57,11 @@ export async function updateProcessed(
if (updateProcessedResult) {
for (const key in input) {
if (["manualStatus", "utility", "assignedTo"].includes(key)) {
if (["manualStatus", "utility"].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 {
msg = `Updated ${key} to '${input[key]}'`;
}
@@ -74,17 +74,6 @@ export async function updateProcessed(
"processed",
user
);
if (key == "assignedTo" && input[key] != null) {
await createAlert(
user.tenantId,
`You are assigned to ${updateProcessedResult.permitNumber}`,
"user",
input.assignedTo,
updateProcessedResult.pid,
"processed"
);
}
} else if (key == "client") {
const orgInDb = await orgModel.findById(input.client);
if (orgInDb) {
@@ -98,6 +87,40 @@ export async function updateProcessed(
updateProcessedResult.markModified("clientData");
await updateProcessedResult.save();
}
} else if (key == "assignedTo") {
const newAssignees = arrayDiff(
updateProcessedResult.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 ${updateProcessedResult.permitNumber}`,
"user",
assignee,
updateProcessedResult.pid,
"processed"
);
}
await createNote(
{
content: msg,
},
permitId,
"processed",
user
);
}
}
@@ -152,7 +175,7 @@ export async function listProcessedPermits(
from: "users",
localField: "assignedTo",
foreignField: "_id",
as: "assignedRec",
as: "assignedTo",
},
},
{
@@ -205,13 +228,14 @@ export async function listProcessedPermits(
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",
},
},
},