Merge pull request #2570 from akhilmhdh/fix/scim-error-response

Resolved response schema mismatch for scim
This commit is contained in:
Maidul Islam
2024-10-10 13:53:33 -07:00
committed by GitHub
3 changed files with 38 additions and 27 deletions
+29 -25
View File
@@ -8,12 +8,14 @@ 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,
depth = 0
) => { ) => {
const scimRootFilterAst = parse(rootScimFilter); if (depth > 20) return;
const stack = [ const stack = [
{ {
scimFilterAst: scimRootFilterAst, scimFilterAst: scimRootFilterAst,
@@ -75,42 +77,35 @@ 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, depth + 1);
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, depth + 1);
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, depth + 1);
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,
depth + 1
);
}); });
break; break;
} }
@@ -119,3 +114,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
+5 -1
View File
@@ -97,7 +97,11 @@ export const fastifyErrHandler = fastifyPlugin(async (server: FastifyZodProvider
message message
}); });
} else { } else {
void res.send(error); void res.status(HttpStatusCodes.InternalServerError).send({
statusCode: HttpStatusCodes.InternalServerError,
error: "InternalServerError",
message: "Something went wrong"
});
} }
}); });
}); });