diff --git a/src/services/search/__tests__/query.spec.ts b/src/services/search/__tests__/query.spec.ts index cbeb13e8..ab4d1ee5 100644 --- a/src/services/search/__tests__/query.spec.ts +++ b/src/services/search/__tests__/query.spec.ts @@ -151,6 +151,32 @@ describe('search – query', () => { filters: [], }; expect(requireOneFilter).toBeDefined(); + + const requestWithQSettings: query.GSearchRequest = { + q: 'test', + q_settings: { + mode: 'query_string', + default_operator: 'and', + }, + }; + expect(requestWithQSettings).toBeDefined(); + + const requestWithAdvanced: query.GSearchRequest = { + q: 'test', + advanced: true, + }; + expect(requestWithAdvanced).toBeDefined(); + + // @ts-expect-error `q_settings` and `advanced` are mutually exclusive + const requestWithQSettingsAndAdvanced: query.GSearchRequest = { + q: 'test', + q_settings: { + mode: 'query_string' as const, + default_operator: 'and', + }, + advanced: true, + }; + expect(requestWithQSettingsAndAdvanced).toBeDefined(); }); test('Content Generic', async () => { diff --git a/src/services/search/service/query.ts b/src/services/search/service/query.ts index 7a3d1140..fc60dc85 100644 --- a/src/services/search/service/query.ts +++ b/src/services/search/service/query.ts @@ -95,7 +95,6 @@ type InternalGSearchRequest = { q?: string; offset?: number; limit?: number; - advanced?: boolean; bypass_visible_to?: boolean; result_format_version?: ResultFormatVersion; filter_principal_sets?: string[]; @@ -103,19 +102,37 @@ type InternalGSearchRequest = { facets?: GFacet[]; boosts?: GBoost[]; sort?: GSort[]; + q_settings?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['q_settings']; + advanced?: OpenAPI.components['schemas']['GSearchRequestBodyV1']['advanced']; }; +/** + * `q_settings` and `advanced` are mutually exclusive. + * @see https://docs.globus.org/api/search/reference/post_query/#gsearchrequest + */ +type QSettingsOrAdvanced = + | { + q_settings?: InternalGSearchRequest['q_settings']; + advanced?: never; + } + | { + advanced?: InternalGSearchRequest['advanced']; + q_settings?: never; + }; + /** * You must provide either `q` or `filters`. * @see https://docs.globus.org/api/search/reference/post_query/#gsearchrequest */ -export type GSearchRequest = +export type GSearchRequest = ( | (Omit & { q: InternalGSearchRequest['q']; }) | (Omit & { filters: [GFilter, ...GFilter[]]; - }); + }) +) & + QSettingsOrAdvanced; /** * @param index_id The UUID of the index to query.