diff --git a/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/__tests__/add-default-conjunction.util.spec.ts b/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/__tests__/add-default-conjunction.util.spec.ts index e1a2c69af19..2a81670b97a 100644 --- a/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/__tests__/add-default-conjunction.util.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/__tests__/add-default-conjunction.util.spec.ts @@ -12,4 +12,38 @@ describe('addDefaultConjunctionIfMissing', () => { 'and(field[eq]:1)', ); }); + + it('should add default conjunction when bare filters are mixed with nested conjunctions', () => { + expect( + addDefaultConjunctionIfMissing( + "status[eq]:'TODO',and(title[ilike]:'%test%')", + ), + ).toEqual("and(status[eq]:'TODO',and(title[ilike]:'%test%'))"); + }); + + it('should add default conjunction for multiple bare filters with nested or', () => { + expect( + addDefaultConjunctionIfMissing( + "field1[in]:['a','b'],or(field2[like]:'%x%')", + ), + ).toEqual("and(field1[in]:['a','b'],or(field2[like]:'%x%'))"); + }); + + it('should not add default conjunction for or root conjunction', () => { + expect( + addDefaultConjunctionIfMissing('or(field[eq]:1,field[eq]:2)'), + ).toEqual('or(field[eq]:1,field[eq]:2)'); + }); + + it('should not add default conjunction for not root conjunction', () => { + expect(addDefaultConjunctionIfMissing('not(field[eq]:1)')).toEqual( + 'not(field[eq]:1)', + ); + }); + + it('should add default conjunction for multiple bare filters', () => { + expect( + addDefaultConjunctionIfMissing('field1[eq]:1,field2[gte]:10'), + ).toEqual('and(field1[eq]:1,field2[gte]:10)'); + }); }); diff --git a/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/add-default-conjunction.util.ts b/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/add-default-conjunction.util.ts index 8fde997cd91..aecf7e800c7 100644 --- a/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/add-default-conjunction.util.ts +++ b/packages/twenty-server/src/engine/api/rest/input-request-parsers/filter-parser-utils/add-default-conjunction.util.ts @@ -2,8 +2,12 @@ import { Conjunctions } from 'src/engine/api/rest/input-request-parsers/filter-p export const DEFAULT_CONJUNCTION = Conjunctions.and; +const ROOT_CONJUNCTION_REGEX = new RegExp( + `^(${Object.values(Conjunctions).join('|')})\\((.+)\\)$`, +); + export const addDefaultConjunctionIfMissing = (filterQuery: string): string => { - if (!(filterQuery.includes('(') && filterQuery.includes(')'))) { + if (!ROOT_CONJUNCTION_REGEX.test(filterQuery)) { return `${DEFAULT_CONJUNCTION}(${filterQuery})`; }