fix: bugs in taggedUsers filter
This commit is contained in:
@@ -1,7 +1,12 @@
|
|||||||
import mongoose from "mongoose";
|
import mongoose from "mongoose";
|
||||||
import { AuthenticatedUser } from "../auth";
|
import { AuthenticatedUser } from "../auth";
|
||||||
import { orgModel } from "../organization/organization.schema";
|
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 { userModel } from "../user/user.schema";
|
||||||
import { generateId } from "../utils/id";
|
import { generateId } from "../utils/id";
|
||||||
import {
|
import {
|
||||||
@@ -125,38 +130,12 @@ export async function listNotifications(
|
|||||||
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const taggedUserFilterIndex = filterObj.findIndex((item) =>
|
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
|
||||||
Object.keys(item).includes("taggedUsers")
|
filterObj,
|
||||||
|
sortObj
|
||||||
);
|
);
|
||||||
|
|
||||||
let taggedFilter = [];
|
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
const pipeline: any = [
|
const pipeline: any = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { parse } from "./utils/queryParser";
|
import { MongoFilter, parse } from "./utils/queryParser";
|
||||||
|
|
||||||
export const pageMetadata = z.object({
|
export const pageMetadata = z.object({
|
||||||
count: z.number(),
|
count: z.number(),
|
||||||
@@ -46,3 +46,51 @@ export function getFilterObject(params: PageQueryParams) {
|
|||||||
return parsedQuery;
|
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 };
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
|
import {
|
||||||
|
getFilterObject,
|
||||||
|
getSortObject,
|
||||||
|
getTaggedUsersFilter,
|
||||||
|
PageQueryParams,
|
||||||
|
} from "../pagination";
|
||||||
import { generateId } from "../utils/id";
|
import { generateId } from "../utils/id";
|
||||||
import {
|
import {
|
||||||
CreatePermitInput,
|
CreatePermitInput,
|
||||||
@@ -72,38 +77,12 @@ export async function listPermits(
|
|||||||
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const taggedUserFilterIndex = filterObj.findIndex((item) =>
|
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
|
||||||
Object.keys(item).includes("taggedUsers")
|
filterObj,
|
||||||
|
sortObj
|
||||||
);
|
);
|
||||||
|
|
||||||
let taggedFilter = [];
|
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
const permitsList = await permitModel.aggregate([
|
const permitsList = await permitModel.aggregate([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import mongoose from "mongoose";
|
import mongoose from "mongoose";
|
||||||
import { AuthenticatedUser } from "../auth";
|
import { AuthenticatedUser } from "../auth";
|
||||||
import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
|
import {
|
||||||
|
getFilterObject,
|
||||||
|
getSortObject,
|
||||||
|
getTaggedUsersFilter,
|
||||||
|
PageQueryParams,
|
||||||
|
} from "../pagination";
|
||||||
import {
|
import {
|
||||||
processedFields,
|
processedFields,
|
||||||
processedModel,
|
processedModel,
|
||||||
@@ -86,38 +91,12 @@ export async function listProcessedPermits(
|
|||||||
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const taggedUserFilterIndex = filterObj.findIndex((item) =>
|
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
|
||||||
Object.keys(item).includes("taggedUsers")
|
filterObj,
|
||||||
|
sortObj
|
||||||
);
|
);
|
||||||
|
|
||||||
let taggedFilter = [];
|
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
const pipeline: any = [
|
const pipeline: any = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ import {
|
|||||||
} from "./rts.schema";
|
} from "./rts.schema";
|
||||||
import { AuthenticatedUser } from "../auth";
|
import { AuthenticatedUser } from "../auth";
|
||||||
import { generateId } from "../utils/id";
|
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 { getUserWithoutPopulate } from "../user/user.service";
|
||||||
import mongoose from "mongoose";
|
import mongoose from "mongoose";
|
||||||
import { rtsPipeline } from "../utils/pipeline";
|
import { rtsPipeline } from "../utils/pipeline";
|
||||||
@@ -79,38 +84,12 @@ export async function listRts(
|
|||||||
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
filterObj.push({ client: new mongoose.Types.ObjectId(user.orgId) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const taggedUserFilterIndex = filterObj.findIndex((item) =>
|
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
|
||||||
Object.keys(item).includes("taggedUsers")
|
filterObj,
|
||||||
|
sortObj
|
||||||
);
|
);
|
||||||
|
|
||||||
let taggedFilter = [];
|
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rtsList = await rtsModel.aggregate([
|
const rtsList = await rtsModel.aggregate([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
import { createAlert } from "../alert/alert.service";
|
import { createAlert } from "../alert/alert.service";
|
||||||
import { AuthenticatedUser } from "../auth";
|
import { AuthenticatedUser } from "../auth";
|
||||||
import { createNote } from "../note/note.service";
|
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 { generateId } from "../utils/id";
|
||||||
import { taskPipeline } from "../utils/pipeline";
|
import { taskPipeline } from "../utils/pipeline";
|
||||||
import {
|
import {
|
||||||
@@ -90,38 +95,12 @@ export async function listTasks(
|
|||||||
const sortObj = getSortObject(params, taskFields);
|
const sortObj = getSortObject(params, taskFields);
|
||||||
let filterObj = getFilterObject(params) || [];
|
let filterObj = getFilterObject(params) || [];
|
||||||
|
|
||||||
const taggedUserFilterIndex = filterObj.findIndex((item) =>
|
let { taggedFilter, taggedUserFilterIndex } = getTaggedUsersFilter(
|
||||||
Object.keys(item).includes("taggedUsers")
|
filterObj,
|
||||||
|
sortObj
|
||||||
);
|
);
|
||||||
|
|
||||||
let taggedFilter = [];
|
if (taggedUserFilterIndex != -1) filterObj.splice(taggedUserFilterIndex, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
const taskList = await taskModel.aggregate([
|
const taskList = await taskModel.aggregate([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import mongoose from "mongoose";
|
import mongoose from "mongoose";
|
||||||
|
|
||||||
type MongoFilter = Record<string, any>;
|
export type MongoFilter = Record<string, any>;
|
||||||
|
|
||||||
const objectIdConversion = ["taggedUsers"];
|
const objectIdConversion = ["taggedUsers"];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user