fix: bugs in taggedUsers filter

This commit is contained in:
2025-09-23 11:35:43 +05:30
parent 00ee3f6a8b
commit 444f909bac
7 changed files with 100 additions and 157 deletions

View File

@@ -1,7 +1,12 @@
import mongoose from "mongoose";
import { AuthenticatedUser } from "../auth";
import { orgModel } from "../organization/organization.schema";
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import {
getFilterObject,
getSortObject,
getTaggedUsersFilter,
PageQueryParams,
} from "../pagination";
import { userModel } from "../user/user.schema";
import { generateId } from "../utils/id";
import {
@@ -125,38 +130,12 @@ export async function listNotifications(
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
}
const taggedUserFilterIndex = filterObj.findIndex((item) =>
Object.keys(item).includes("taggedUsers")
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
filterObj,
sortObj
);
let taggedFilter = [];
if (taggedUserFilterIndex != -1) {
const filterItem = filterObj[taggedUserFilterIndex].taggedUsers;
let filterValues = null;
if (filterItem["$eq"]) filterValues = [filterItem["$eq"]];
else filterValues = filterItem["$in"];
filterValues = filterValues.map((item) => item.toString());
taggedFilter = [
{
$addFields: {
taggedUsers: {
$filter: {
input: "$taggedUsers",
as: "user",
cond: { $in: ["$$user.userId", filterValues] },
},
},
},
},
{ $match: { "taggedUsers.0": { $exists: true } } },
{ $sort: { "taggedUsers.taggedAt": sortObj.taggedUsers ?? -1 } },
];
filterObj.splice(taggedUserFilterIndex, 1);
}
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
const pipeline: any = [
{

View File

@@ -1,5 +1,5 @@
import { z } from "zod";
import { parse } from "./utils/queryParser";
import { MongoFilter, parse } from "./utils/queryParser";
export const pageMetadata = z.object({
count: z.number(),
@@ -46,3 +46,51 @@ export function getFilterObject(params: PageQueryParams) {
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 };
}

View File

@@ -1,4 +1,9 @@
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import {
getFilterObject,
getSortObject,
getTaggedUsersFilter,
PageQueryParams,
} from "../pagination";
import { generateId } from "../utils/id";
import {
CreatePermitInput,
@@ -72,38 +77,12 @@ export async function listPermits(
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
}
const taggedUserFilterIndex = filterObj.findIndex((item) =>
Object.keys(item).includes("taggedUsers")
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
filterObj,
sortObj
);
let taggedFilter = [];
if (taggedUserFilterIndex != -1) {
const filterItem = filterObj[taggedUserFilterIndex].taggedUsers;
let filterValues = null;
if (filterItem["$eq"]) filterValues = [filterItem["$eq"]];
else filterValues = filterItem["$in"];
filterValues = filterValues.map((item) => item.toString());
taggedFilter = [
{
$addFields: {
taggedUsers: {
$filter: {
input: "$taggedUsers",
as: "user",
cond: { $in: ["$$user.userId", filterValues] },
},
},
},
},
{ $match: { "taggedUsers.0": { $exists: true } } },
{ $sort: { "taggedUsers.taggedAt": sortObj.taggedUsers ?? -1 } },
];
filterObj.splice(taggedUserFilterIndex, 1);
}
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
const permitsList = await permitModel.aggregate([
{

View File

@@ -1,6 +1,11 @@
import mongoose from "mongoose";
import { AuthenticatedUser } from "../auth";
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import {
getFilterObject,
getSortObject,
getTaggedUsersFilter,
PageQueryParams,
} from "../pagination";
import {
processedFields,
processedModel,
@@ -86,38 +91,12 @@ export async function listProcessedPermits(
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
}
const taggedUserFilterIndex = filterObj.findIndex((item) =>
Object.keys(item).includes("taggedUsers")
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
filterObj,
sortObj
);
let taggedFilter = [];
if (taggedUserFilterIndex != -1) {
const filterItem = filterObj[taggedUserFilterIndex].taggedUsers;
let filterValues = null;
if (filterItem["$eq"]) filterValues = [filterItem["$eq"]];
else filterValues = filterItem["$in"];
filterValues = filterValues.map((item) => item.toString());
taggedFilter = [
{
$addFields: {
taggedUsers: {
$filter: {
input: "$taggedUsers",
as: "user",
cond: { $in: ["$$user.userId", filterValues] },
},
},
},
},
{ $match: { "taggedUsers.0": { $exists: true } } },
{ $sort: { "taggedUsers.taggedAt": sortObj.taggedUsers ?? -1 } },
];
filterObj.splice(taggedUserFilterIndex, 1);
}
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
const pipeline: any = [
{

View File

@@ -7,7 +7,12 @@ import {
} from "./rts.schema";
import { AuthenticatedUser } from "../auth";
import { generateId } from "../utils/id";
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import {
getFilterObject,
getSortObject,
getTaggedUsersFilter,
PageQueryParams,
} from "../pagination";
import { getUserWithoutPopulate } from "../user/user.service";
import mongoose from "mongoose";
import { rtsPipeline } from "../utils/pipeline";
@@ -79,38 +84,12 @@ export async function listRts(
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
}
const taggedUserFilterIndex = filterObj.findIndex((item) =>
Object.keys(item).includes("taggedUsers")
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
filterObj,
sortObj
);
let taggedFilter = [];
if (taggedUserFilterIndex != -1) {
const filterItem = filterObj[taggedUserFilterIndex].taggedUsers;
let filterValues = null;
if (filterItem["$eq"]) filterValues = [filterItem["$eq"]];
else filterValues = filterItem["$in"];
filterValues = filterValues.map((item) => item.toString());
taggedFilter = [
{
$addFields: {
taggedUsers: {
$filter: {
input: "$taggedUsers",
as: "user",
cond: { $in: ["$$user.userId", filterValues] },
},
},
},
},
{ $match: { "taggedUsers.0": { $exists: true } } },
{ $sort: { "taggedUsers.taggedAt": sortObj.taggedUsers ?? -1 } },
];
filterObj.splice(taggedUserFilterIndex, 1);
}
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
const rtsList = await rtsModel.aggregate([
{

View File

@@ -1,7 +1,12 @@
import { createAlert } from "../alert/alert.service";
import { AuthenticatedUser } from "../auth";
import { createNote } from "../note/note.service";
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import {
getFilterObject,
getSortObject,
getTaggedUsersFilter,
PageQueryParams,
} from "../pagination";
import { generateId } from "../utils/id";
import { taskPipeline } from "../utils/pipeline";
import {
@@ -90,38 +95,12 @@ export async function listTasks(
const sortObj = getSortObject(params, taskFields);
let filterObj = getFilterObject(params) || [];
const taggedUserFilterIndex = filterObj.findIndex((item) =>
Object.keys(item).includes("taggedUsers")
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
filterObj,
sortObj
);
let taggedFilter = [];
if (taggedUserFilterIndex != -1) {
const filterItem = filterObj[taggedUserFilterIndex].taggedUsers;
let filterValues = null;
if (filterItem["$eq"]) filterValues = [filterItem["$eq"]];
else filterValues = filterItem["$in"];
filterValues = filterValues.map((item) => item.toString());
taggedFilter = [
{
$addFields: {
taggedUsers: {
$filter: {
input: "$taggedUsers",
as: "user",
cond: { $in: ["$$user.userId", filterValues] },
},
},
},
},
{ $match: { "taggedUsers.0": { $exists: true } } },
{ $sort: { "taggedUsers.taggedAt": sortObj.taggedUsers ?? -1 } },
];
filterObj.splice(taggedUserFilterIndex, 1);
}
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
const taskList = await taskModel.aggregate([
{

View File

@@ -1,6 +1,6 @@
import mongoose from "mongoose";
type MongoFilter = Record<string, any>;
export type MongoFilter = Record<string, any>;
const objectIdConversion = ["taggedUsers"];