fix: resolved response schema mismatch for scim

This commit is contained in:
=
2024-10-10 18:38:29 +05:30
parent b482a9cda7
commit 3d58eba78c
2 changed files with 28 additions and 25 deletions
+24 -24
View File
@@ -8,12 +8,11 @@ const appendParentToGroupingOperator = (parentPath: string, filter: Filter) => {
return filter; return filter;
}; };
export const generateKnexQueryFromScim = ( const processDynamicQuery = (
rootQuery: Knex.QueryBuilder, rootQuery: Knex.QueryBuilder,
rootScimFilter: string, scimRootFilterAst: Filter,
getAttributeField: (attr: string) => string | null getAttributeField: (attr: string) => string | null
) => { ) => {
const scimRootFilterAst = parse(rootScimFilter);
const stack = [ const stack = [
{ {
scimFilterAst: scimRootFilterAst, scimFilterAst: scimRootFilterAst,
@@ -75,42 +74,34 @@ export const generateKnexQueryFromScim = (
break; break;
} }
case "and": { case "and": {
void query.andWhere((subQueryBuilder) => { scimFilterAst.filters.forEach((el) => {
scimFilterAst.filters.forEach((el) => { void query.andWhere((subQueryBuilder) => {
stack.push({ processDynamicQuery(subQueryBuilder, el, getAttributeField);
query: subQueryBuilder,
scimFilterAst: el
});
}); });
}); });
break; break;
} }
case "or": { case "or": {
void query.orWhere((subQueryBuilder) => { scimFilterAst.filters.forEach((el) => {
scimFilterAst.filters.forEach((el) => { void query.orWhere((subQueryBuilder) => {
stack.push({ processDynamicQuery(subQueryBuilder, el, getAttributeField);
query: subQueryBuilder,
scimFilterAst: el
});
}); });
}); });
break; break;
} }
case "not": { case "not": {
void query.whereNot((subQueryBuilder) => { void query.whereNot((subQueryBuilder) => {
stack.push({ processDynamicQuery(subQueryBuilder, scimFilterAst.filter, getAttributeField);
query: subQueryBuilder,
scimFilterAst: scimFilterAst.filter
});
}); });
break; break;
} }
case "[]": { case "[]": {
void query.whereNot((subQueryBuilder) => { void query.where((subQueryBuilder) => {
stack.push({ processDynamicQuery(
query: subQueryBuilder, subQueryBuilder,
scimFilterAst: appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter) appendParentToGroupingOperator(scimFilterAst.attrPath, scimFilterAst.valFilter),
}); getAttributeField
);
}); });
break; 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);
};
@@ -3,9 +3,12 @@ import fp from "fastify-plugin";
import { DefaultResponseErrorsSchema } from "../routes/sanitizedSchemas"; 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) => { export const addErrorsToResponseSchemas = fp(async (server) => {
server.addHook("onRoute", (routeOptions) => { server.addHook("onRoute", (routeOptions) => {
if (routeOptions.schema && routeOptions.schema.response) { if (routeOptions.schema && routeOptions.schema.response && !isScimRoutes(routeOptions.path)) {
routeOptions.schema.response = { routeOptions.schema.response = {
...DefaultResponseErrorsSchema, ...DefaultResponseErrorsSchema,
...routeOptions.schema.response ...routeOptions.schema.response