diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.spec.ts b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.spec.ts index 69db0fcd..0a04e1c1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.spec.ts @@ -220,6 +220,14 @@ describe('Check "filter" zod schema', () => { }, relation: null, }; + const check9: FilterQuerySchema = { + target: { + createdAt: { + eq: 'null', + }, + }, + relation: null, + }; const checkArray = [ check1, @@ -235,6 +243,10 @@ describe('Check "filter" zod schema', () => { const result = filterQuerySchema.parse(check); expect(result).toEqual(check); } + const result = filterQuerySchema.parse(check9); + expect(result.target!.createdAt!.eq).toEqual(null); + result.target!.createdAt!.eq = 'null'; + expect(result).toEqual(check9); }); it('Invalid schema', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.ts b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.ts index fec4b032..99f9c7cb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.ts +++ b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-query-schema/filter.ts @@ -2,10 +2,12 @@ import { z, ZodArray, ZodEffects, + ZodLiteral, ZodNullable, ZodObject, ZodOptional, ZodString, + ZodUnion, } from 'zod'; import { arrayItemStringLongerThan, @@ -41,15 +43,21 @@ import { ZodFilterRelationSchema, } from '../zod-input-query-schema/filter'; -type ZodForString = ZodEffects; -const zodForString: ZodForString = z.string().refine(stringLongerThan(), { - message: 'String should be not empty', -}); +type ZodForString = ZodUnion< + [ZodEffects, null, 'null'>, ZodEffects] +>; + +const zodForString: ZodForString = z.union([ + z.literal('null').transform(() => null), + z.string().refine(stringLongerThan(), { + message: 'String should be not empty', + }), +]); type ZodForStringArray = ZodEffects< ZodArray, - string[], - string[] + [string | null, ...(string | null)[]], + [string, ...string[]] >; const zodForStringArray: ZodForStringArray = zodForString .array() diff --git a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-utils.ts b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-utils.ts index eec27e43..f265e25b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/helper/zod/zod-utils.ts @@ -14,14 +14,15 @@ export const stringLongerThan = export const arrayItemStringLongerThan = (length = 0) => - (array: [string, ...string[]]) => { + (array: [string | null, ...(string | null)[]]) => { const checkFunction = stringLongerThan(length); - return !array.some((i) => !checkFunction(i)); + return !array.some((i) => i !== null && !checkFunction(i)); }; export const stringMustBe = (type: TypeField = TypeField.string) => - (inputString: string) => { + (inputString: string | null) => { + if (inputString === null) return true; switch (type) { case TypeField.boolean: return inputString === 'true' || inputString === 'false'; diff --git a/libs/json-api/json-api-nestjs/src/lib/mixin/service/typeorm-utils.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/mixin/service/typeorm-utils.service.spec.ts index 2777d323..96aa3b5e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/mixin/service/typeorm-utils.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/mixin/service/typeorm-utils.service.spec.ts @@ -26,7 +26,6 @@ import { } from '../../constants'; import { TypeormUtilsService } from './typeorm-utils.service'; import { - ObjectTyped, PostData, PostRelationshipData, Query, @@ -253,7 +252,7 @@ describe('TypeormUtilsService', () => { `test for ${filterOperand}`; const valueTestArray = ( filterOperand: FilterOperand.nin | FilterOperand.in - ) => [valueTest(filterOperand)]; + ): [string, ...string[]] => [valueTest(filterOperand)]; const query = getDefaultQuery(); query.filter.target = { @@ -429,9 +428,10 @@ describe('TypeormUtilsService', () => { createdAt: { [FilterOperand.eq]: 'test1', [FilterOperand.ne]: 'test2', - [FilterOperand.nin]: ['test3'], + [FilterOperand.nin]: ['test3'] as [string, ...string[]], }, }; + query.filter.relation = { roles: conditional, };