瀏覽代碼

post review fixes

Olivier Massot 2 年之前
父節點
當前提交
26dceaef15

+ 1 - 2
components/Layout/MainMenu.vue

@@ -87,12 +87,11 @@ if (menu.value === null) {
   throw new Error('No main menu to display')
 }
 
-const hasMainMenu = computed(() => hasMenu('Main'))
 const isOpened = computed(() => isMenuOpened('Main'))
 
 // En vue lg+, on affiche toujours le menu
 const displayMenu = computed(() => {
-  return menu.value !== null && hasMainMenu && (lgAndUp.value || isOpened.value)
+  return menu.value !== null && hasMenu('Main') && (lgAndUp.value || isOpened.value)
 })
 
 // En vue md+, fermer le menu le passe simplement en mode rail

+ 0 - 1
components/Ui/ExpansionPanel.vue

@@ -61,7 +61,6 @@ const props = defineProps({
 
   :deep(.v-expansion-panel-title__icon > .v-icon) {
     font-size: 16px;
-    color: #707070;
   }
 
   .icon {

+ 2 - 2
composables/utils/useAbilityUtils.ts

@@ -1,12 +1,12 @@
 import {useAccessProfileStore} from "~/stores/accessProfile";
 import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 import {useAbility} from "@casl/vue";
-import AbilityUtils from "~/services/rights/abilityUtils";
+import AbilityBuilder from "~/services/rights/abilityBuilder";
 
 export const useAbilityUtils = () => {
     const ability = useAbility()
     const accessProfile = useAccessProfileStore()
     const organizationProfile = useOrganizationProfileStore()
 
-    return new AbilityUtils(ability, accessProfile, organizationProfile)
+    return new AbilityBuilder(ability, accessProfile, organizationProfile)
 }

+ 1 - 1
pages/subscription.vue

@@ -309,7 +309,7 @@ Page 'Mon abonnement'
 
   const { data: dolibarrAccount, pending: dolibarrPending } = fetch(DolibarrAccount, organizationProfile.id)
 
-  if (organizationProfile.hasModule('Sms')) {
+  if (ability.can('manage', 'texto')) {
     const {data: mobytStatus, pending: mobytPending} = fetch(MobytUserStatus, organizationProfile.id)
   } else {
     const mobytStatus = ref(null)

+ 2 - 2
plugins/ability.ts

@@ -1,5 +1,5 @@
 import { createMongoAbility } from '@casl/ability'
-import AbilityUtils from '~/services/rights/abilityUtils'
+import AbilityBuilder from '~/services/rights/abilityBuilder'
 import {defineNuxtPlugin} from "nuxt/app";
 import {useAccessProfileStore} from "~/stores/accessProfile";
 import {useOrganizationProfileStore} from "~/stores/organizationProfile";
@@ -10,7 +10,7 @@ export default defineNuxtPlugin(() => {
     const accessProfile = useAccessProfileStore()
     const organizationProfile = useOrganizationProfileStore()
 
-    const abilityUtils = new AbilityUtils(ability, accessProfile, organizationProfile)
+    const abilityUtils = new AbilityBuilder(ability, accessProfile, organizationProfile)
 
     abilityUtils.setupAbilities()
 })

+ 2 - 0
services/data/entityManager.ts

@@ -74,6 +74,8 @@ class EntityManager {
         const repository = this.getRepository(model)
 
         let entity = repository.make(properties)
+
+        // Keep track of the entitie's model
         entity.setModel(model)
 
         // @ts-ignore

+ 21 - 24
services/rights/abilityUtils.ts → services/rights/abilityBuilder.ts

@@ -15,15 +15,14 @@ interface Condition {
 /**
  * Classe permettant de mener des opérations sur les habilités
  */
-class AbilityUtils {
+class AbilityBuilder {
     private readonly ability: MongoAbility = {} as MongoAbility
     private readonly accessProfile: any
     private readonly organizationProfile: any
 
     private readonly configDir = './config/abilities/config.yaml'
 
-    private abilitiesByRoles: Array<AbilitiesType> = []
-    private abilitiesByConfig: Array<AbilitiesType> = []
+    private abilities: Array<AbilitiesType> = []
 
     /**
      * @constructor
@@ -56,13 +55,11 @@ class AbilityUtils {
                                                                 }: any) => {
             after((result: any)=>{
                 if (name === 'setProfile'){
-                    //On récupère les habilités
-                    const abilities = this.buildAbilities();
+                    //On construit les habilités
+                    this.buildAbilities();
 
                     //On les store puis on update le service ability pour le mettre à jour.
-                    this.accessProfile.abilities = abilities
-
-                    this.ability.update(abilities)
+                    this.accessProfile.abilities = this.abilities
 
                     // Unsubscribe pour éviter les memory leaks
                     unsubscribe()
@@ -77,28 +74,29 @@ class AbilityUtils {
      *
      * @return {Array<AbilitiesType>}
      */
-    buildAbilities(): Array<AbilitiesType> {
-        this.buildAbilitiesFromRoles()
-        this.buildAbilitiesFromConfig()
-
-        return this.abilities()
-    }
-
-    abilities(): Array<AbilitiesType> {
-        return ([] as Array<AbilitiesType>).concat(this.abilitiesByRoles).concat(this.abilitiesByConfig)
+    buildAbilities() {
+        // Build from roles
+        this.abilities = this.buildAbilitiesFromRoles()
+        this.ability.update(this.abilities)
+
+        // Build from config
+        this.abilities = this.abilities.concat(this.buildAbilitiesFromConfig())
+        this.ability.update(this.abilities)
     }
 
     /**
      * Adaptation et transformations des roles symfony en abilities Casl
      */
     buildAbilitiesFromRoles() {
-        this.abilitiesByRoles = RoleUtils.rolesToAbilities(this.accessProfile.roles)
+        return RoleUtils.rolesToAbilities(this.accessProfile.roles)
     }
 
     /**
      * Charge les habilités depuis les fichiers de configuration
      */
     buildAbilitiesFromConfig() {
+        const abilitiesByConfig: Array<AbilitiesType> = []
+
         const doc = YamlDenormalizer.denormalize({path: this.configDir})
         const fromConfig = doc.abilities
 
@@ -111,9 +109,11 @@ class AbilityUtils {
             }
 
             if (this.hasConfigAbility(conditions as Array<Condition>, subject)) {
-                this.abilitiesByConfig.push({ action, subject })
+                abilitiesByConfig.push({ action, subject })
             }
         })
+
+        return abilitiesByConfig
     }
 
     /**
@@ -179,10 +179,7 @@ class AbilityUtils {
      * @param ability
      */
     hasRoleAbility(ability: AbilitiesType): boolean {
-        return this.abilitiesByRoles.some((candidate: AbilitiesType) => {
-            return candidate.subject === ability.subject &&
-                (candidate.action === ability.action || candidate.action === 'manage') // 'manage' permet aussi l'action 'read'
-        })
+        return this.ability.can(ability.action, ability.subject)
     }
 
     /**
@@ -308,4 +305,4 @@ class AbilityUtils {
     }
 }
 
-export default AbilityUtils
+export default AbilityBuilder