From 18776bd8cb5680560bceba18309d0c5c04d59268 Mon Sep 17 00:00:00 2001 From: Alejandro Pinar Ruiz Date: Wed, 1 Jun 2022 20:33:02 +0200 Subject: [PATCH] Add CheckItemVisibility util templated from CheckSectionVisibility --- src/utils/CheckItemVisibility.js | 84 ++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/utils/CheckItemVisibility.js diff --git a/src/utils/CheckItemVisibility.js b/src/utils/CheckItemVisibility.js new file mode 100644 index 00000000..4a1c0be3 --- /dev/null +++ b/src/utils/CheckItemVisibility.js @@ -0,0 +1,84 @@ +/** + * A helper function that checks if an item is visible based on current users permissions + * Checks an item displayData for hideForUsers, showForUsers and hideForGuests + * Returns a boolean that determines if the user has the required permissions + */ + +// Import helper functions from auth, to get current user, and check if guest +import { getCurrentUser, isLoggedInAsGuest } from '@/utils/Auth'; +import { localStorageKeys } from '@/utils/defaults'; + +/* Helper function, checks if a given testValue is found in the visibility list */ +const determineVisibility = (visibilityList, testValue) => { + let isFound = false; + visibilityList.forEach((visibilityItem) => { + if (visibilityItem.toLowerCase() === testValue.toLowerCase()) isFound = true; + }); + return isFound; +}; + +/* Helper function, determines if two arrays have any intersecting elements + (one or more items that are the same) */ +const determineIntersection = (source = [], target = []) => { + const intersections = source.filter(item => target.indexOf(item) !== -1); + return intersections.length > 0; +}; + +/* Returns false if this item should not be rendered for the current user/ guest */ +const isItemVisibleToUser = (displayData, currentUser, isGuest) => { + // Checks if user explicitly has access to a certain item + const checkVisibility = () => { + if (!currentUser) return true; + const hideForUsers = displayData.hideForUsers || []; + const cUsername = currentUser.user.toLowerCase(); + return !determineVisibility(hideForUsers, cUsername); + }; + // Checks if user is explicitly prevented from viewing a certain item + const checkHiddenability = () => { + if (!currentUser) return true; + const cUsername = currentUser.user.toLowerCase(); + const showForUsers = displayData.showForUsers || []; + if (showForUsers.length < 1) return true; + return determineVisibility(showForUsers, cUsername); + }; + const checkKeycloakVisibility = () => { + if (!displayData.hideForKeycloakUsers) return true; + + const { groups, roles } = JSON.parse(localStorage.getItem(localStorageKeys.KEYCLOAK_INFO) || '{}'); + const hideForGroups = displayData.hideForKeycloakUsers.groups || []; + const hideForRoles = displayData.hideForKeycloakUsers.roles || []; + + return !(determineIntersection(hideForRoles, roles) + || determineIntersection(hideForGroups, groups)); + }; + const checkKeycloakHiddenability = () => { + if (!displayData.showForKeycloakUsers) return true; + + const { groups, roles } = JSON.parse(localStorage.getItem(localStorageKeys.KEYCLOAK_INFO) || '{}'); + const showForGroups = displayData.showForKeycloakUsers.groups || []; + const showForRoles = displayData.showForKeycloakUsers.roles || []; + + return determineIntersection(showForRoles, roles) + || determineIntersection(showForGroups, groups); + }; + // Checks if the current user is a guest, and if item allows for guests + const checkIfHideForGuest = () => { + const hideForGuest = displayData.hideForGuests; + return !(hideForGuest && isGuest); + }; + return checkVisibility() + && checkHiddenability() + && checkIfHideForGuest() + && checkKeycloakVisibility() + && checkKeycloakHiddenability(); +}; + +/* Putting it all together, the function to export */ +const checkItemVisibility = (item) => { + const currentUser = getCurrentUser(); // Get current user object + const isGuest = isLoggedInAsGuest(); // Check if current user is a guest + const displayData = item.displayData || {}; + return isItemVisibleToUser(displayData, currentUser, isGuest); +}; + +export default checkItemVisibility;