diff --git a/backend/src/lib/knex/scim.ts b/backend/src/lib/knex/scim.ts index 530a7d45a..255d8778b 100644 --- a/backend/src/lib/knex/scim.ts +++ b/backend/src/lib/knex/scim.ts @@ -8,12 +8,11 @@ const appendParentToGroupingOperator = (parentPath: string, filter: Filter) => { return filter; }; -export const generateKnexQueryFromScim = ( +const processDynamicQuery = ( rootQuery: Knex.QueryBuilder, - rootScimFilter: string, + scimRootFilterAst: Filter, getAttributeField: (attr: string) => string | null ) => { - const scimRootFilterAst = parse(rootScimFilter); const stack = [ { scimFilterAst: scimRootFilterAst, @@ -75,42 +74,34 @@ export const generateKnexQueryFromScim = ( break; } case "and": { - void query.andWhere((subQueryBuilder) => { - scimFilterAst.filters.forEach((el) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: el - }); + scimFilterAst.filters.forEach((el) => { + void query.andWhere((subQueryBuilder) => { + processDynamicQuery(subQueryBuilder, el, getAttributeField); }); }); break; } case "or": { - void query.orWhere((subQueryBuilder) => { - scimFilterAst.filters.forEach((el) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: el - }); + scimFilterAst.filters.forEach((el) => { + void query.orWhere((subQueryBuilder) => { + processDynamicQuery(subQueryBuilder, el, getAttributeField); }); }); break; } case "not": { void query.whereNot((subQueryBuilder) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: scimFilterAst.filter - }); + processDynamicQuery(subQueryBuilder, scimFilterAst.filter, getAttributeField); }); break; } case "[]": { - void query.whereNot((subQueryBuilder) => { - stack.push({ - query: subQueryBuilder, - scimFilterAst: appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter) - }); + void query.where((subQueryBuilder) => { + processDynamicQuery( + subQueryBuilder, + appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter), + getAttributeField + ); }); break; } @@ -119,3 +110,12 @@ export const generateKnexQueryFromScim = ( } } }; + +export const generateKnexQueryFromScim = ( + rootQuery: Knex.QueryBuilder, + rootScimFilter: string, + getAttributeField: (attr: string) => string | null +) => { + const scimRootFilterAst = parse(rootScimFilter); + return processDynamicQuery(rootQuery, scimRootFilterAst, getAttributeField); +}; diff --git a/backend/src/server/plugins/add-errors-to-response-schemas.ts b/backend/src/server/plugins/add-errors-to-response-schemas.ts index 75844040c..8eb358a1b 100644 --- a/backend/src/server/plugins/add-errors-to-response-schemas.ts +++ b/backend/src/server/plugins/add-errors-to-response-schemas.ts @@ -3,9 +3,12 @@ import fp from "fastify-plugin"; import { DefaultResponseErrorsSchema } from "../routes/sanitizedSchemas"; +const isScimRoutes = (pathname: string) => + pathname.startsWith("/api/v1/scim/Users") || pathname.startsWith("/api/v1/scim/Groups"); + export const addErrorsToResponseSchemas = fp(async (server) => { server.addHook("onRoute", (routeOptions) => { - if (routeOptions.schema && routeOptions.schema.response) { + if (routeOptions.schema && routeOptions.schema.response && !isScimRoutes(routeOptions.path)) { routeOptions.schema.response = { ...DefaultResponseErrorsSchema, ...routeOptions.schema.response