diff --git a/src/resolvers/Organization/userTags.ts b/src/resolvers/Organization/userTags.ts index b25c5966370..c8cd8debdd4 100644 --- a/src/resolvers/Organization/userTags.ts +++ b/src/resolvers/Organization/userTags.ts @@ -41,20 +41,14 @@ export const userTags: OrganizationResolvers["userTags"] = async ( parent, args, ) => { - const parsedWhere = parseUserTagWhere(args.where); - const parsedSortedBy = parseUserTagSortedBy(args.sortedBy); + const parseWhereResult = parseUserTagWhere(args.where); + const parseSortedByResult = parseUserTagSortedBy(args.sortedBy); const parseGraphQLConnectionArgumentsResult = await parseGraphQLConnectionArgumentsWithSortedByAndWhere({ args, - parseSortedByResult: { - isSuccessful: true, - parsedSortedBy, - }, - parseWhereResult: { - isSuccessful: true, - parsedWhere, - }, + parseSortedByResult, + parseWhereResult, parseCursor: (args) => parseCursor({ ...args, @@ -94,7 +88,7 @@ export const userTags: OrganizationResolvers["userTags"] = async ( // if there's no search input, we'll list all the root tag // otherwise we'll also list the subtags matching the filter - const parentTagIdFilter = parsedWhere.nameStartsWith + const parentTagIdFilter = parsedArgs.filter.nameStartsWith ? {} : { parentTagId: null }; diff --git a/src/resolvers/UserTag/childTags.ts b/src/resolvers/UserTag/childTags.ts index a760f68e08f..c49b58f9fb6 100644 --- a/src/resolvers/UserTag/childTags.ts +++ b/src/resolvers/UserTag/childTags.ts @@ -41,20 +41,14 @@ export const childTags: UserTagResolvers["childTags"] = async ( parent, args, ) => { - const parsedWhere = parseUserTagWhere(args.where); - const parsedSortedBy = parseUserTagSortedBy(args.sortedBy); + const parseWhereResult = parseUserTagWhere(args.where); + const parseSortedByResult = parseUserTagSortedBy(args.sortedBy); const parseGraphQLConnectionArgumentsResult = await parseGraphQLConnectionArgumentsWithSortedByAndWhere({ args, - parseSortedByResult: { - isSuccessful: true, - parsedSortedBy, - }, - parseWhereResult: { - isSuccessful: true, - parsedWhere, - }, + parseSortedByResult, + parseWhereResult, parseCursor: (args) => parseCursor({ ...args, diff --git a/src/resolvers/UserTag/usersAssignedTo.ts b/src/resolvers/UserTag/usersAssignedTo.ts index bf1b084f14b..3c9f390a265 100644 --- a/src/resolvers/UserTag/usersAssignedTo.ts +++ b/src/resolvers/UserTag/usersAssignedTo.ts @@ -41,17 +41,14 @@ export const usersAssignedTo: UserTagResolvers["usersAssignedTo"] = async ( parent, args, ) => { - const parsedWhere = parseUserTagUserWhere(args.where); - const parsedSortedBy = parseUserTagSortedBy(args.sortedBy); + const parseWhereResult = parseUserTagUserWhere(args.where); + const parseSortedByResult = parseUserTagSortedBy(args.sortedBy); const parseGraphQLConnectionArgumentsResult = await parseGraphQLConnectionArgumentsWithSortedByAndWhere({ args, - parseSortedByResult: { - isSuccessful: true, - parsedSortedBy, - }, - parseWhereResult: parsedWhere, + parseSortedByResult, + parseWhereResult, parseCursor: (args) => parseCursor({ ...args, diff --git a/src/resolvers/UserTag/usersToAssignTo.ts b/src/resolvers/UserTag/usersToAssignTo.ts index 41be4c754bb..acbe97d8573 100644 --- a/src/resolvers/UserTag/usersToAssignTo.ts +++ b/src/resolvers/UserTag/usersToAssignTo.ts @@ -3,7 +3,6 @@ import type { InterfaceUser } from "../../models"; import { User } from "../../models"; import type { DefaultGraphQLArgumentError, - GraphQLConnectionTraversalDirection, ParseGraphQLConnectionCursorArguments, ParseGraphQLConnectionCursorResult, } from "../../utilities/graphQLConnection"; @@ -41,12 +40,12 @@ export const usersToAssignTo: UserTagResolvers["usersToAssignTo"] = async ( parent, args, ) => { - const parsedWhere = parseUserTagUserWhere(args.where); + const parseWhereResult = parseUserTagUserWhere(args.where); const parseGraphQLConnectionArgumentsResult = await parseGraphQLConnectionArgumentsWithWhere({ args, - parseWhereResult: parsedWhere, + parseWhereResult, parseCursor: (args) => parseCursor({ ...args, @@ -195,42 +194,3 @@ export const parseCursor = async ({ parsedCursor: cursorValue, }; }; - -type GraphQLConnectionFilter = - | { - _id: { - $lt: Types.ObjectId; - }; - } - | { - _id: { - $gt: Types.ObjectId; - }; - } - | Record; - -export const getGraphQLConnectionFilter = ({ - cursor, - direction, -}: { - cursor: string | null; - direction: GraphQLConnectionTraversalDirection; -}): GraphQLConnectionFilter => { - if (cursor !== null) { - if (direction === "BACKWARD") { - return { - _id: { - $gt: new Types.ObjectId(cursor), - }, - }; - } else { - return { - _id: { - $lt: new Types.ObjectId(cursor), - }, - }; - } - } else { - return {}; - } -}; diff --git a/src/utilities/userTagsUtils/parseUserTagSortedBy.ts b/src/utilities/userTagsUtils/parseUserTagSortedBy.ts index ad82b59d553..e79bd9b63dd 100644 --- a/src/utilities/userTagsUtils/parseUserTagSortedBy.ts +++ b/src/utilities/userTagsUtils/parseUserTagSortedBy.ts @@ -2,6 +2,10 @@ import type { SortedByOrder, UserTagSortedByInput, } from "../../types/generatedGraphQLTypes"; +import type { + DefaultGraphQLArgumentError, + ParseGraphQLConnectionSortedByResult, +} from "../graphQLConnection"; /* * function to parse the args.sortedBy for UserTag queries @@ -13,14 +17,33 @@ export type ParseSortedByResult = { export function parseUserTagSortedBy( sortedBy: UserTagSortedByInput | null | undefined, -): ParseSortedByResult { +): ParseGraphQLConnectionSortedByResult { + const errors: DefaultGraphQLArgumentError[] = []; + if (!sortedBy) { return { - sortById: "DESCENDING", + isSuccessful: true, + parsedSortedBy: { sortById: "DESCENDING" }, }; } else { + if (sortedBy.id !== "DESCENDING" && sortedBy.id !== "ASCENDING") { + errors.push({ + message: + "Invalid sortedByInput provided. It must be a of type SortedByOrder.", + path: ["sortUserTagInput"], + }); + + return { + isSuccessful: false, + errors, + }; + } + return { - sortById: sortedBy.id, + isSuccessful: true, + parsedSortedBy: { + sortById: sortedBy.id, + }, }; } } diff --git a/src/utilities/userTagsUtils/parseUserTagUserWhere.ts b/src/utilities/userTagsUtils/parseUserTagUserWhere.ts index a6fd2ba8a22..569bd7f5426 100644 --- a/src/utilities/userTagsUtils/parseUserTagUserWhere.ts +++ b/src/utilities/userTagsUtils/parseUserTagUserWhere.ts @@ -30,7 +30,7 @@ export function parseUserTagUserWhere( if (!where.firstName && !where.lastName) { errors.push({ message: `Atleast one of firstName or lastName should be provided`, - path: ["whereInput"], + path: ["whereUserNameInput"], }); return { diff --git a/src/utilities/userTagsUtils/parseUserTagWhere.ts b/src/utilities/userTagsUtils/parseUserTagWhere.ts index ffe04a111cc..19ec925df4c 100644 --- a/src/utilities/userTagsUtils/parseUserTagWhere.ts +++ b/src/utilities/userTagsUtils/parseUserTagWhere.ts @@ -1,4 +1,8 @@ import type { UserTagWhereInput } from "../../types/generatedGraphQLTypes"; +import type { + DefaultGraphQLArgumentError, + ParseGraphQLConnectionWhereResult, +} from "../graphQLConnection"; /* * function to parse the args.where for UserTag queries @@ -10,14 +14,34 @@ export type ParseUserTagWhereResult = { export function parseUserTagWhere( where: UserTagWhereInput | null | undefined, -): ParseUserTagWhereResult { +): ParseGraphQLConnectionWhereResult { + const errors: DefaultGraphQLArgumentError[] = []; + if (!where) { return { - nameStartsWith: "", + isSuccessful: true, + parsedWhere: { + nameStartsWith: "", + }, }; } else { - return { - nameStartsWith: where.name.starts_with.trim(), - }; + if (typeof where.name.starts_with !== "string") { + errors.push({ + message: "Invalid name provided. It must be a string.", + path: ["whereUserTagNameInput"], + }); + + return { + isSuccessful: false, + errors, + }; + } else { + return { + isSuccessful: true, + parsedWhere: { + nameStartsWith: where.name.starts_with.trim(), + }, + }; + } } } diff --git a/tests/resolvers/UserTag/usersToAssignTo.spec.ts b/tests/resolvers/UserTag/usersToAssignTo.spec.ts index fdcc04ff2b7..3b502b7db0a 100644 --- a/tests/resolvers/UserTag/usersToAssignTo.spec.ts +++ b/tests/resolvers/UserTag/usersToAssignTo.spec.ts @@ -1,8 +1,6 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ import "dotenv/config"; import { parseCursor, - getGraphQLConnectionFilter, usersToAssignTo as usersToAssignToResolver, } from "../../../src/resolvers/UserTag/usersToAssignTo"; import { connect, disconnect } from "../../helpers/db"; @@ -116,44 +114,3 @@ describe("parseCursor function", () => { } }); }); - -describe("getGraphQLConnectionFilter function", () => { - it(`when argument cursor is non-null and argument direction corresponds to backward`, async () => { - const cursor = new Types.ObjectId().toString(); - - expect( - getGraphQLConnectionFilter({ - cursor, - direction: "BACKWARD", - }), - ).toEqual({ - _id: { - $gt: new Types.ObjectId(cursor), - }, - }); - }); - - it(`when argument cursor is non-null and argument direction corresponds to forward`, async () => { - const cursor = new Types.ObjectId().toString(); - - expect( - getGraphQLConnectionFilter({ - cursor, - direction: "FORWARD", - }), - ).toEqual({ - _id: { - $lt: new Types.ObjectId(cursor), - }, - }); - }); - - it(`when argument cursor is null`, async () => { - expect( - getGraphQLConnectionFilter({ - cursor: null, - direction: "BACKWARD", - }), - ).toEqual({}); - }); -});