Vincent GUFFON před 5 roky
rodič
revize
6b7d58f011

+ 2 - 2
components/Layout/MenuComponent.vue

@@ -61,7 +61,7 @@
 </template>
 
 <script lang="ts">
-  import Menu from '@/use/template/menu'
+  import useMenu from '@/use/template/menu'
   import {defineComponent} from '@nuxtjs/composition-api'
   import {AnyJson} from "~/types/types";
 
@@ -77,7 +77,7 @@
       }
     },
     setup() {
-      const menu: AnyJson = new Menu().useMenuConstruct()
+      const menu: AnyJson = new useMenu().useMenuConstruct()
 
       return {
         menu

+ 1 - 1
middleware/auth.ts

@@ -1,7 +1,7 @@
 import { Middleware } from '@nuxt/types'
 
 const auth: Middleware = async ({ store, redirect }) => {
-  // If the user is not authenticated
+  // Si l'utilisateur n'est pas connecté on le redirige vers la page login
   if (!store.state.profile.access) {
     return redirect('/login')
   }

+ 0 - 1
pages/index.vue

@@ -12,7 +12,6 @@
 
   export default defineComponent({
     setup() {
-
       return {
 
       }

+ 0 - 7
plugins/Queries/rest.ts

@@ -1,12 +1,5 @@
 import {Plugin} from '@nuxt/types'
 import  {$hydraParser} from '../../services/utils/hydraParser'
-import {AnyJson} from "~/types/types";
-
-declare module '@nuxt/types' {
-  interface Context {
-    $rest: AnyJson
-  }
-}
 
 const restPlugin: Plugin = (ctx) => {
 

+ 16 - 8
plugins/Rights/ability.ts

@@ -2,31 +2,39 @@ import { Plugin } from '@nuxt/types'
 import { Ability } from '@casl/ability'
 import { $abilitiesUtils } from "~/services/rights/abilitiesUtils";
 
-declare module '@nuxt/types' {
-  interface Context {
-    $ability(): Ability
-  }
-}
-
-export const ability = new Ability();
-
+/**
+ * Au moment de la phase D'init de Nuxt...
+ * @param ctx
+ */
 const abilityPlugin: Plugin = (ctx) => {
+  //Nécessaire pour que l'update des abilité soit correct après la phase SSR
   ability.update(ctx.store.state.profile.access.abilities);
 
+  /**
+   * Au moment où l'on effectue un SetProfile via le store Organization, il faut aller récupérer
+   * les différentes abilitées que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
+   */
   const unsubscribe = ctx.store.subscribeAction({
     after: (action, state) => {
       switch (action.type) {
         case 'profile/organization/setProfile':
+          //On récupère les abilités
           const abilitiesUtils = $abilitiesUtils(ctx.store, ability)
           const abilities = abilitiesUtils.getAbilities();
 
+          //On les store puis on update le service ability pour le mettre à jour.
           ctx.store.commit('profile/access/setAbilities', abilities)
           ability.update(abilities);
+          //Unsubscribe pour éviter les memory leaks
           unsubscribe()
           break;
       }
     }
   })
+
+  //Déclare un nouvel accesseur de service via le context Nuxt
   ctx.$ability = () => {return ability}
 }
+
 export default abilityPlugin
+export const ability = new Ability();

+ 25 - 2
store/index.js

@@ -7,7 +7,25 @@ export const plugins = [
 ];
 
 export const actions = {
-  async nuxtServerInit({commit, dispatch}, {req}) {
+  /**
+   * Méthode appelée lors de la phase d'initialisation de Nuxt coté serveur (SSR)
+   * @param commit
+   * @param dispatch
+   * @param req
+   * @return {Promise<void>}
+   */
+  async nuxtServerInit({dispatch}, {req}) {
+    const initCookie = await dispatch('initCookies', {req: req})
+    const updateProfile = await dispatch('updateProfile')
+  },
+
+  /**
+   * Récupère et Store les Cookies Bearer et XAccessId
+   * @param commit
+   * @param req
+   * @return {Promise<void>}
+   */
+  async initCookies({commit}, {req}){
     let bearer = null
     let accessId = null
     if (req.headers.cookie) {
@@ -26,9 +44,14 @@ export const actions = {
     }
     commit('profile/access/setBearer', bearer)
     commit('profile/access/setAccessId', accessId)
-    await dispatch('updateProfile')
   },
 
+  /**
+   * Récupère les informations du profile connecté et update le Store Profile
+   * @param dispatch
+   * @param state
+   * @return {Promise<void>}
+   */
   async updateProfile({dispatch, state}) {
     const my_profile = await this.$http.$get(`/api/my_profile/${state.profile.access.accessId}`)
     dispatch('profile/access/setProfile', my_profile)

+ 11 - 0
types/types.d.ts

@@ -1,6 +1,17 @@
 import {Store} from "vuex";
+import {Ability} from "@casl/ability";
 interface ItemsMenu extends Array<ItemMenu> {}
 
+/**
+ * Upgrade du @nuxt/types pour TypeScript
+ */
+declare module '@nuxt/types' {
+  interface Context {
+    $ability(): Ability,
+    $rest: AnyJson
+  }
+}
+
 interface ItemMenu {
   icon: string,
   title: string,

+ 29 - 10
use/template/menu.ts

@@ -2,11 +2,20 @@ import {ref, useContext} from "@nuxtjs/composition-api";
 import {ItemMenu, ItemsMenu} from "~/types/types";
 import {$organizationProfile} from "~/services/profile/organizationProfile";
 
-export default class Menu{
+/**
+ * @category Use/template
+ * @class Menu
+ * Use Classe pour la construction du Menu
+ */
+class Menu{
   private $ability:any;
   private $config:any;
   private $store:any;
 
+  /**
+   * @constructor
+   * Initialisation des services issues du context
+   */
   constructor() {
     const {$ability, $config, store} = useContext();
     this.$ability = $ability;
@@ -14,6 +23,9 @@ export default class Menu{
     this.$store = store;
   }
 
+  /**
+   * Construit le menu
+   */
   useMenuConstruct(){
     let menu:ItemsMenu = [ this.constructMenu('fa-home', 'welcome', '/dashboard', true) ]
 
@@ -33,7 +45,8 @@ export default class Menu{
   }
 
   /**
-   * Menu Répertoire
+   * Construit le menu Répertoire ou null si aucune page accessible
+   * @return {ItemMenu | null}
    */
   accessMenu():ItemMenu | null {
     const children:ItemsMenu = [];
@@ -68,7 +81,8 @@ export default class Menu{
   }
 
   /**
-   * Menu agenda
+   * Construit le menu Agenda ou null si aucune page accessible
+   * @return {ItemMenu | null}
    */
   agendaMenu():ItemMenu | null {
     const children:ItemsMenu = [];
@@ -88,14 +102,16 @@ export default class Menu{
   }
 
   /**
-   * Menu equipment
+   * Construit le menu Equipement ou null si aucune page accessible
+   * @return {ItemMenu | null}
    */
   equipmentMenu():ItemMenu | null {
     return this.constructMenu('fa-cube', 'equipment', '/equipment/list', true)
   }
 
   /**
-   * Menu suivi pédagogique
+   * Construit le menu Suivi pédagogique ou null si aucune page accessible
+   * @return {ItemMenu | null}
    */
   educationalMenu():ItemMenu | null {
     const children:ItemsMenu = [];
@@ -132,11 +148,12 @@ export default class Menu{
 
   /**
    * Construit un ItemMenu
-   * @param icon
-   * @param title
-   * @param link
-   * @param isOldLink
-   * @param children
+   * @param {string} icon
+   * @param {string} title titre qui sera traduit
+   * @param {string} link lien
+   * @param {boolean} isOldLink est-ce un lien renvoyant vers l'ancien admin ?
+   * @param {Array<ItemMenu>} children Tableau d'ItemMenu représentant les sous menu du menu principal
+   * @return {ItemMenu}
    */
   constructMenu(icon: string, title: string, link?: string, isOldLink?: boolean, children?: Array<ItemMenu>): ItemMenu{
     return children ? {
@@ -151,3 +168,5 @@ export default class Menu{
     }
   }
 }
+
+export default Menu