Skip to content

Commit

Permalink
Util functions update, code improvement and lint fix
Browse files Browse the repository at this point in the history
Signed-off-by: Yi Cai <yicai@redhat.com>
  • Loading branch information
ciiay committed Jun 20, 2024
1 parent c813e04 commit 44023e6
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export const ConditionsForm = ({
React.useState<boolean>(false);

const flattenConditions = (
conditions: Condition[],
conditionData: Condition[],
): PermissionCondition[] => {
const flatConditions: PermissionCondition[] = [];

Expand All @@ -92,7 +92,7 @@ export const ConditionsForm = ({
}
}
};
conditions.forEach(processCondition);
conditionData.forEach(processCondition);
return flatConditions;
};

Expand Down
36 changes: 15 additions & 21 deletions plugins/rbac/src/components/ConditionalAccess/ConditionsFormRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -127,17 +127,18 @@ export const ConditionsFormRow = ({
React.useState<NotConditionType>('simple-condition');

React.useEffect(() => {
let nestedConditions: ConditionsData[] = [];
const nestedConditions: ConditionsData[] = [];
const criteriaTypes = [criterias.allOf, criterias.anyOf, criterias.not];
const extractNestedConditions = (conditions: ConditionsData[]) => {
Array.isArray(conditions) &&
conditions?.forEach(c => {
if (Array.isArray(conditions)) {
conditions.forEach(c => {
criteriaTypes.forEach(ct => {
if (Object.keys(c).includes(ct)) {
nestedConditions.push(c as ConditionsData);
}
});
});
}
};

switch (criteria) {
Expand All @@ -154,6 +155,7 @@ export const ConditionsFormRow = ({
)
) {
nestedConditions.push(conditionRow.not as ConditionsData);
setNotConditionType('nested-condition');
}
break;
default:
Expand Down Expand Up @@ -224,24 +226,16 @@ export const ConditionsFormRow = ({
conditionRow[criteria as keyof ConditionsData] as Condition[]
)?.filter(con => Object.keys(con).includes('rule')) || []
: [];
let newCondition: Condition[] = [];
if (Array.isArray(updatedNestedConditionRow)) {
newCondition = [...existingSimpleCondition, ...updatedNestedConditionRow];
} else {
newCondition = [...existingSimpleCondition, updatedNestedConditionRow];
}

if (criteria === criterias.anyOf) {
onRuleChange({
[criteria]: [...newCondition],
});
}
if (criteria === criterias.allOf) {
const newCondition: Condition[] = Array.isArray(updatedNestedConditionRow)
? [...existingSimpleCondition, ...updatedNestedConditionRow]
: [...existingSimpleCondition, updatedNestedConditionRow];

if (criteria === criterias.anyOf || criteria === criterias.allOf) {
onRuleChange({
[criteria]: [...newCondition],
[criteria]: newCondition,
});
}
if (criteria === criterias.not) {
} else if (criteria === criterias.not) {
onRuleChange({
not: updatedNestedConditionRow as ConditionsData,
});
Expand Down Expand Up @@ -287,7 +281,7 @@ export const ConditionsFormRow = ({
}
};

const handleAddNestedCondition = (criteria: string) => {
const handleAddNestedCondition = (currentCriteria: string) => {
const newNestedCondition = {
[criterias.allOf]: [
{
Expand All @@ -302,7 +296,7 @@ export const ConditionsFormRow = ({
newNestedCondition,
];
updateRules(
criteria === criterias.not
currentCriteria === criterias.not
? newNestedCondition
: updatedNestedConditionRow,
);
Expand Down Expand Up @@ -707,7 +701,7 @@ export const ConditionsFormRow = ({
}
onRuleChange={onRuleChange}
conditionRow={nc}
criteria={criterias.not}
criteria={criteria}
conditionRulesData={conditionRulesData}
setErrors={setErrors}
optionDisabled={ruleOption =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,42 +128,38 @@ export const ConditionsFormRowFields = ({
}
};

const handleNestedConditionChange = (
updateRules: (conditions: ConditionsData[] | ConditionsData) => void,
nestedConditionRow: ConditionsData[],
nestedConditionCriteria: string,
nestedConditionIndex: number,
ruleIndex: number,
newCondition: PermissionCondition,
) => {
const updatedNestedConditionRow: ConditionsData[] = [];

nestedConditionRow.forEach((c, index) => {
if (index === nestedConditionIndex) {
if (nestedConditionCriteria === criterias.not) {
updatedNestedConditionRow.push({
[nestedConditionCriteria as keyof ConditionsData]: newCondition,
});
} else {
const handleNestedConditionChange = (newCondition: PermissionCondition) => {
if (
!nestedConditionRow ||
!nestedConditionCriteria ||
nestedConditionIndex === undefined ||
!updateRules
) {
return;
}
const updatedNestedConditionRow: ConditionsData[] = nestedConditionRow.map(
(c, i) => {
if (i === nestedConditionIndex) {
if (nestedConditionCriteria === criterias.not) {
return {
[nestedConditionCriteria]: newCondition,
};
}
const updatedNestedConditionRules = (
(c[
nestedConditionCriteria as keyof ConditionsData
] as PermissionCondition[]) || []
).map((_r, rindex) => {
if (rindex === ruleIndex) {
return newCondition;
}
return _r;
});
updatedNestedConditionRow.push({
[nestedConditionCriteria as keyof ConditionsData]:
updatedNestedConditionRules,
).map((rule, rindex) => {
return rindex === ruleIndex ? newCondition : rule;
});

return {
[nestedConditionCriteria]: updatedNestedConditionRules,
};
}
} else {
updatedNestedConditionRow.push(c);
}
});
return c;
},
);

updateRules(
criteria === criterias.not
Expand All @@ -173,22 +169,10 @@ export const ConditionsFormRowFields = ({
};

const onConditionChange = (newCondition: PermissionCondition) => {
if (
nestedConditionRow &&
nestedConditionCriteria &&
nestedConditionIndex !== undefined &&
updateRules
) {
handleNestedConditionChange(
updateRules,
nestedConditionRow,
nestedConditionCriteria,
nestedConditionIndex,
ruleIndex || 0,
newCondition,
);
if (nestedConditionRow) {
handleNestedConditionChange(newCondition);
} else {
handleConditionChange(newCondition as PermissionCondition);
handleConditionChange(newCondition);
}
};

Expand Down
31 changes: 18 additions & 13 deletions plugins/rbac/src/utils/rbac-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ export const getPermissionsData = (
};

export const getConditionUpperCriteria = (
conditions: PermissionCriteria<PermissionCondition>,
conditions: PermissionCriteria<PermissionCondition> | string,
): string | undefined => {
return Object.keys(conditions).find(key =>
[criterias.allOf, criterias.anyOf, criterias.not].includes(key),
Expand All @@ -230,26 +230,31 @@ export const getConditionsData = (
case criterias.allOf: {
const allOfConditions = (conditions as AllOfCriteria<PermissionCondition>)
.allOf;
if (allOfConditions.find(c => !!getConditionUpperCriteria(c))) {
return undefined;
}
allOfConditions.map(aoc => {
if (getConditionUpperCriteria(aoc)) {
return getConditionsData(aoc);
}
return aoc;
});
return { allOf: allOfConditions as PermissionCondition[] };
}
case criterias.anyOf: {
const anyOfConditions = (conditions as AnyOfCriteria<PermissionCondition>)
.anyOf;
if (anyOfConditions.find(c => !!getConditionUpperCriteria(c))) {
return undefined;
}
anyOfConditions.map(aoc => {
if (getConditionUpperCriteria(aoc)) {
return getConditionsData(aoc);
}
return aoc;
});
return { anyOf: anyOfConditions as PermissionCondition[] };
}
case criterias.not: {
const notConditions = (conditions as NotCriteria<PermissionCondition>)
.not;
if (getConditionUpperCriteria(notConditions)) {
return undefined;
}
return { not: notConditions as PermissionCondition };
const notCondition = (conditions as NotCriteria<PermissionCondition>).not;
const nestedCondition = getConditionUpperCriteria(notCondition)
? getConditionsData(notCondition)
: notCondition;
return { not: nestedCondition as PermissionCondition };
}
default:
return { condition: conditions as PermissionCondition };
Expand Down

0 comments on commit 44023e6

Please sign in to comment.