From 903d3d6d32316e05cfb79fcdfccde31f583da02e Mon Sep 17 00:00:00 2001 From: Hangzhi Yu <hangzhi@protonmail.com> Date: Mon, 29 May 2023 17:24:11 +0200 Subject: [PATCH] Fix polling and updating behavior of whoAmI and permission queries --- CHANGELOG.rst | 1 + aleksis/core/frontend/components/app/App.vue | 9 +++- .../core/frontend/components/app/SideNav.vue | 9 +++- .../components/app/permissions.graphql | 8 ---- .../frontend/components/app/whoAmI.graphql | 6 ++- aleksis/core/frontend/index.js | 1 + aleksis/core/frontend/mixins/menus.js | 2 +- aleksis/core/frontend/mixins/permissions.js | 43 ++++--------------- 8 files changed, 31 insertions(+), 48 deletions(-) delete mode 100644 aleksis/core/frontend/components/app/permissions.graphql diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f59634c05..496a8968e 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 6fcf3986a..f650517ae 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 7d486ad7e..94a7a6030 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 fcb6133e0..000000000 --- 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 57e0292d3..fff7344d0 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 11d1a1db0..a83d25c67 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 7b6317a5a..60ce66b5b 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 55bc94f30..0f74b4ea8 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, + ]; }, }, }; -- GitLab