diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f59634c05cd8297177238be1cb650867766d2b74..496a8968ed6257461a746eb92073ee4525b2bbdd 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -22,6 +22,7 @@ Fixed * The search bar in the sidenav menu is shown even though the user has no permission to see it. * Add permission check to accept invitation menu point in order to hide it when this feature is disabled. * Metrics endpoint for Prometheus was at the wrong URL. +* Polling behavior of the whoAmI and permission queries was fixed. `3.0`_ - 2022-05-11 ------------------- diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue index 6fcf3986af676dd2faab228e2eb3b1349625aed5..f650517ae88d122ea6684de14819c4a5f00cc241 100644 --- a/aleksis/core/frontend/components/app/App.vue +++ b/aleksis/core/frontend/components/app/App.vue @@ -246,12 +246,17 @@ export default { systemProperties: gqlSystemProperties, whoAmI: { query: gqlWhoAmI, + pollInterval: 30000, + result({ data }) { + if (data && data.whoAmI) { + this.$root.permissions = data.whoAmI.permissions; + } + }, variables() { return { - permissions: this.permissionNames, + permissions: this.$root.permissionNames, }; }, - pollInterval: 10000, }, messages: { query: gqlMessages, diff --git a/aleksis/core/frontend/components/app/SideNav.vue b/aleksis/core/frontend/components/app/SideNav.vue index 7d486ad7e2aba6cfdb325130710beb9cd39db106..94a7a60309752368e7a4d1d2ce4a05db42b3fd77 100644 --- a/aleksis/core/frontend/components/app/SideNav.vue +++ b/aleksis/core/frontend/components/app/SideNav.vue @@ -1,5 +1,10 @@ <template> - <v-navigation-drawer app :value="value" height="100dvh" @input="$emit('input', $event)"> + <v-navigation-drawer + app + :value="value" + height="100dvh" + @input="$emit('input', $event)" + > <v-list nav dense shaped> <v-list-item class="logo"> <a @@ -110,7 +115,7 @@ export default { }, mixins: [permissionsMixin], mounted() { - this.fetchPermissions(["core.search_rule"]); + this.addPermissions(["core.search_rule"]); }, }; </script> diff --git a/aleksis/core/frontend/components/app/permissions.graphql b/aleksis/core/frontend/components/app/permissions.graphql deleted file mode 100644 index fcb6133e0afdb78e9a2fb750e1972d64aa0968e7..0000000000000000000000000000000000000000 --- a/aleksis/core/frontend/components/app/permissions.graphql +++ /dev/null @@ -1,8 +0,0 @@ -query gqlPermissions($permissions: [String]!) { - whoAmI { - permissions: globalPermissionsByName(permissions: $permissions) { - name - result - } - } -} diff --git a/aleksis/core/frontend/components/app/whoAmI.graphql b/aleksis/core/frontend/components/app/whoAmI.graphql index 57e0292d37ea4d221c9f263621647bfdabe38b6f..fff7344d06817d73a37ede3f8698afaaa06e1ea6 100644 --- a/aleksis/core/frontend/components/app/whoAmI.graphql +++ b/aleksis/core/frontend/components/app/whoAmI.graphql @@ -1,4 +1,4 @@ -query whoAmI { +query whoAmI($permissions: [String]!) { whoAmI { username isAuthenticated @@ -12,5 +12,9 @@ query whoAmI { avatarUrl isDummy } + permissions: globalPermissionsByName(permissions: $permissions) { + name + result + } } } diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js index 11d1a1db0fe3b51703f63a6a668d96aac02f8374..a83d25c67452f1d52e59ff39e7f3ffb6bcd69b55 100644 --- a/aleksis/core/frontend/index.js +++ b/aleksis/core/frontend/index.js @@ -73,6 +73,7 @@ const app = new Vue({ snackbarItems: [], toolbarTitle: "AlekSIS®", permissions: [], + permissionNames: [], }), computed: { matchedComponents() { diff --git a/aleksis/core/frontend/mixins/menus.js b/aleksis/core/frontend/mixins/menus.js index 7b6317a5aa3f625501bd51119d0fc4c6f633b379..60ce66b5b0d36efa77cc2b8944ce21e928a1f107 100644 --- a/aleksis/core/frontend/mixins/menus.js +++ b/aleksis/core/frontend/mixins/menus.js @@ -37,7 +37,7 @@ const menusMixin = { } } - this.fetchPermissions(permArray); + this.addPermissions(permArray); }, buildMenu(routes, menuKey) { let menu = {}; diff --git a/aleksis/core/frontend/mixins/permissions.js b/aleksis/core/frontend/mixins/permissions.js index 55bc94f30a39e6712a6e74863b045707c3ae3bba..0f74b4ea857d1aed1ff93956515241538696c5eb 100644 --- a/aleksis/core/frontend/mixins/permissions.js +++ b/aleksis/core/frontend/mixins/permissions.js @@ -5,17 +5,6 @@ import gqlPermissions from "../components/app/permissions.graphql"; */ const permissionsMixin = { - apollo: { - permissions: { - query: gqlPermissions, - update(data) { - this.$root.permissions = data.whoAmI.permissions; - }, - variables: { - permissions: [], - }, - }, - }, methods: { checkPermission(permissionName) { return ( @@ -24,30 +13,16 @@ const permissionsMixin = { this.$root.permissions.find((p) => p.name === permissionName).result ); }, - fetchPermissions(permissionNames) { - this.$apollo.queries.permissions.fetchMore({ - variables: { - permissions: permissionNames, - }, - updateQuery: (previousResult, { fetchMoreResult }) => { - const oldPermissions = previousResult.whoAmI.permissions; - const newPermissions = fetchMoreResult.whoAmI.permissions; - - const keepPermissions = oldPermissions.filter( - (oldPermission) => - !newPermissions.find( - (newPermission) => newPermission.name === oldPermission.name - ) - ); + addPermissions(newPermissionNames) { + const keepPermissionNames = this.$root.permissionNames.filter( + (oldPermName) => + !newPermissionNames.find((newPermName) => newPermName === oldPermName) + ); - return { - whoAmI: { - __typename: previousResult.whoAmI.__typename, - permissions: [...keepPermissions, ...newPermissions], - }, - }; - }, - }); + this.$root.permissionNames = [ + ...keepPermissionNames, + ...newPermissionNames, + ]; }, }, };