Olivier Massot 4 лет назад
Родитель
Сommit
e3f01f8179

+ 1 - 1
config/nuxtConfig/env.js

@@ -6,7 +6,7 @@ export default {
     artist_premium_product: 'artist-premium',
     manager_product: 'manager',
     cmf_network: 'CMF',
-    ffec_network: 'FFEC',
+    ffec_network: 'FFEC'
   },
   publicRuntimeConfig: {
     http: {

+ 1 - 1
services/data/dataDeleter.ts

@@ -18,7 +18,7 @@ class DataDeleter extends BaseDataManager {
    */
   protected async _invoke (): Promise<any> {
     // build the url according to the url args
-    const url = UrlBuilder.invoke(this.arguments)
+    const url = UrlBuilder.build(this.arguments)
 
     // send the DELETE request to the api
     await Connection.invoke(HTTP_METHOD.DELETE, url, this.arguments)

+ 2 - 1
services/data/hookable.ts

@@ -1,10 +1,11 @@
 import { UrlArgs } from '~/types/interfaces'
+import BaseHook from '~/services/data/hooks/baseHook'
 
 /**
  * Base class for an object which support hooks
  */
 abstract class Hookable {
-  protected hooks: Array<any> = []; // how could we replace 'any'?
+  protected hooks: Array<typeof BaseHook> = []; // how could we replace 'any'?
 
   /**
    * Iterate over the available hooks and invoke the ones

+ 1 - 1
services/data/hooks/baseHook.ts

@@ -1,7 +1,7 @@
 import { DataProviderArgs } from '~/types/interfaces'
 
 abstract class BaseHook {
-  public priority = 255
+  public static priority = 255
 
   // eslint-disable-next-line require-await
   async invoke (_args: DataProviderArgs): Promise<any> {

+ 1 - 1
services/data/hooks/hookDeleter/hookDeleterExample.ts

@@ -2,7 +2,7 @@ import BaseHook from '~/services/data/hooks/baseHook'
 import { DataDeleterArgs, HookDeleter } from '~/types/interfaces'
 
 class HookDeleterExample extends BaseHook implements HookDeleter {
-  static priority = 10
+  public static priority = 10
 
   // eslint-disable-next-line @typescript-eslint/no-unused-vars
   async invoke (args: DataDeleterArgs): Promise<any> {

+ 1 - 1
services/data/hooks/hookPersister/hookPersisterExample.ts

@@ -2,7 +2,7 @@ import { DataPersisterArgs, HookPersister } from '~/types/interfaces'
 import BaseHook from '~/services/data/hooks/baseHook'
 
 class HookPersisterExample extends BaseHook implements HookPersister {
-  static priority = 10
+  public static  priority = 10
 
   async invoke (_args: DataPersisterArgs): Promise<any> {
     // eslint-disable-next-line no-console

+ 1 - 1
services/data/hooks/hookProvider/hookProviderExample.ts

@@ -2,7 +2,7 @@ import BaseHook from '~/services/data/hooks/baseHook'
 import { DataProviderArgs, HookProvider } from '~/types/interfaces'
 
 class HookProviderExample extends BaseHook implements HookProvider {
-  priority = 10
+  public static  priority = 10
 
   async invoke (_args: DataProviderArgs): Promise<any> {
     // eslint-disable-next-line no-console

+ 10 - 6
services/profile/accessProfile.ts

@@ -2,9 +2,9 @@ import { Ability } from '@casl/ability'
 import { AbilitiesType, accessState, AccessStore, AnyJson } from '~/types/interfaces'
 
 /**
- * @category Services/profiles
- * @class AccessProfile
- * Classe répondant aux différentes questions que l'on peut se poser sur l'access connecté
+ * L'AccessProfile regroupe toutes les informations concernant l'Access qui peuvent
+ * être nécessaires pour l'affichage de chacune des pages de l'application
+ * (ex: rôles, habilités, ...etc)
  */
 class AccessProfile {
   private accessProfile: accessState
@@ -12,6 +12,7 @@ class AccessProfile {
 
   /**
    * @constructor
+   *
    * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur
    * @param {Ability} ability Plugin $ability
    */
@@ -21,8 +22,9 @@ class AccessProfile {
   }
 
   /**
-   * Est-ce que l'utilisateur possède le role.
-   * @param {Array<string>} roles roles à tester
+   * Est-ce que l'utilisateur possède le rôle donné?
+   *
+   * @param {Array<string>} roles Rôles à tester
    * @return {boolean}
    */
   hasRole (roles: Array<string>): boolean {
@@ -40,7 +42,8 @@ class AccessProfile {
   }
 
   /**
-   * Est-ce que l'utilisateur possède l'habilité
+   * Est-ce que l'utilisateur possède l'habilité?
+   *
    * @param {Array<AbilitiesType>} ability habilité à tester
    * @return {boolean}
    */
@@ -58,6 +61,7 @@ class AccessProfile {
 
   /**
    * Factory
+   *
    * @return {AnyJson} retourne les fonction rendues publiques
    */
   handler (): AnyJson {

+ 37 - 31
services/profile/organizationProfile.ts

@@ -1,9 +1,10 @@
 import { AnyJson, organizationState, OrganizationStore } from '~/types/interfaces'
 
 /**
- * @category Services/profiles
- * @class OrganizationProfile
- * Classe répondant aux différentes questions que l'on peut se poser sur l'organization de l'access connecté
+ * L'AccessProfile regroupe toutes les informations concernant l'Organization auquel
+ * l'access courant est connecté et qui peuvent  être nécessaires pour l'affichage
+ * de chacune des pages de l'application
+ * (ex: modules, produit, ...etc)
  */
 class OrganizationProfile {
   private organizationProfile: organizationState
@@ -17,7 +18,8 @@ class OrganizationProfile {
   }
 
   /**
-   * Est-ce que l'organisation possède le module
+   * Est-ce que l'organisation possède le module donné
+   *
    * @param {Array<string>} modules Modules à tester
    * @return {boolean}
    */
@@ -31,6 +33,7 @@ class OrganizationProfile {
 
   /**
    * L'organization fait-elle partie d'un réseau ?
+   *
    * @return {boolean}
    */
   isInsideNetwork (): boolean {
@@ -38,45 +41,46 @@ class OrganizationProfile {
   }
 
   /**
-   * L'organization fait-elle partie du réseau CMF ?
+   * L'organization fait-elle partie du réseau CMF?
+   *
    * @return {boolean}
    */
   isCmf (): boolean {
-    const networks = this.organizationProfile.networks.filter((network:string) => {
-      return network == process.env.cmf_network
-    })
-    return networks.length > 0
+    return this.organizationProfile.networks.filter((network: string) => {
+      return network === process.env.cmf_network
+    }).length > 0
   }
 
   /**
-   * L'organization fait-elle partie du réseau FFEC ?
+   * L'organization fait-elle partie du réseau FFEC?
+   *
    * @return {boolean}
    */
   isFfec (): boolean {
-    const networks = this.organizationProfile.networks.filter((network:string) => {
-      return network == process.env.ffec_network
-    })
-    return networks.length > 0
+    return this.organizationProfile.networks.filter((network: string) => {
+      return network === process.env.ffec_network
+    }).length > 0
   }
 
   /**
-   * L'organization possède t'elle un produit school ou school premium
+   * L'organization possède t'elle un produit premium
    * @return {boolean}
    */
-  isSchool (): boolean {
-    return this.isSchoolProduct() || this.isSchoolPremiumProduct()
+  isArtistProduct (): boolean {
+    return this.organizationProfile.product === process.env.artist_product
   }
 
   /**
-   * L'organization possède t'elle un produit artiste ou artiste premium
+   * L'organization possède t'elle un produit artiste premium
    * @return {boolean}
    */
-  isArtist (): boolean {
-    return this.isArtistProduct() || this.isArtistPremiumProduct()
+  isArtistPremiumProduct (): boolean {
+    return this.organizationProfile.product === process.env.artist_premium_product
   }
 
   /**
-   * L'organization possède t'elle un produit school
+   * L'organization possède-t-elle un produit school?
+   *
    * @return {boolean}
    */
   isSchoolProduct (): boolean {
@@ -84,7 +88,8 @@ class OrganizationProfile {
   }
 
   /**
-   * L'organization possède t'elle un produit school premium
+   * L'organization possède-t-elle un produit school-premium?
+   *
    * @return {boolean}
    */
   isSchoolPremiumProduct (): boolean {
@@ -92,19 +97,19 @@ class OrganizationProfile {
   }
 
   /**
-   * L'organization possède t'elle un produit premium
+   * L'organization possède-t-elle un produit school ou school-premium
    * @return {boolean}
    */
-  isArtistProduct (): boolean {
-    return this.organizationProfile.product === process.env.artist_product
+  isSchool (): boolean {
+    return this.isSchoolProduct() || this.isSchoolPremiumProduct()
   }
 
   /**
-   * L'organization possède t'elle un produit artiste premium
+   * L'organization possède t'elle un produit artiste ou artiste premium
    * @return {boolean}
    */
-  isArtistPremiumProduct (): boolean {
-    return this.organizationProfile.product === process.env.artist_premium_product
+  isArtist (): boolean {
+    return this.isArtistProduct() || this.isArtistPremiumProduct()
   }
 
   /**
@@ -116,15 +121,16 @@ class OrganizationProfile {
   }
 
   /**
-   * L'organization possède t'elledes enfants
+   * L'organization possède-t-elle des enfants
    * @return {boolean|null}
    */
-  isOrganizationWithChildren (): any {
+  hasChildren (): any {
     return this.organizationProfile.hasChildren
   }
 
   /**
    * Factory
+   *
    * @return {AnyJson} retourne les fonction rendues publiques
    */
   handler (): AnyJson {
@@ -133,7 +139,7 @@ class OrganizationProfile {
       isSchool: this.isSchool.bind(this),
       isArtist: this.isArtist.bind(this),
       isManagerProduct: this.isManagerProduct.bind(this),
-      isOrganizationWithChildren: this.isOrganizationWithChildren.bind(this),
+      isOrganizationWithChildren: this.hasChildren.bind(this),
       isCmf: this.isCmf.bind(this)
     }
   }

+ 12 - 8
services/rights/abilitiesUtils.ts

@@ -8,13 +8,11 @@ import Serializer from '~/services/serializer/serializer'
 import { DENORMALIZER_TYPE } from '~/types/enums'
 
 /**
- * @category Services/droits
- * @class AbilitiesUtils
  * Classe permettant de mener des opérations sur les habilités
  */
 class AbilitiesUtils {
-  private $store: AnyStore = {} as AnyStore
-  private $ability: Ability = {} as Ability
+  private readonly $store: AnyStore = {} as AnyStore
+  private readonly $ability: Ability = {} as Ability
   private factory: AnyJson = {}
 
   /**
@@ -26,7 +24,8 @@ class AbilitiesUtils {
   }
 
   /**
-   * retourne la factory des services
+   * Retourne la factory des services
+   *
    * @return {AnyJson} factory
    */
   getFactory () {
@@ -44,7 +43,7 @@ class AbilitiesUtils {
   }
 
   /**
-   * Set les abilities de l'utilisateur à chaque fois qu'on update son profile
+   * Définit les abilities de l'utilisateur à chaque fois qu'on met à jour son profile
    */
   setAbilities () {
     // Nécessaire pour que l'update des habilités soit correcte après la phase SSR
@@ -71,7 +70,8 @@ class AbilitiesUtils {
   }
 
   /**
-   * Récupération de l'ensemble des abilities qu'elles soient par Roles ou par Config.
+   * Récupération de l'ensemble des abilities, qu'elles soient par Roles ou par Config
+   *
    * @return {Array<AbilitiesType>}
    */
   getAbilities (): Array<AbilitiesType> {
@@ -83,6 +83,7 @@ class AbilitiesUtils {
 
   /**
    * Adaptation et transformations des roles en abilities
+   *
    * @param {Array<string>} roles
    * @return {Array<AbilitiesType>}
    */
@@ -92,7 +93,7 @@ class AbilitiesUtils {
   }
 
   /**
-   * - Parcours la config d'abilities en Yaml
+   * - Parcourt la config d'abilities en Yaml
    * - filtres la config pour ne garder que les abilities autorisées
    * - transform la config restante en Object Abilities
    * @param {string} configPath
@@ -113,6 +114,7 @@ class AbilitiesUtils {
 
   /**
    * Filtre toutes les abilities possible suivant si l'utilisateur est autorisé ou non à les posséder
+   *
    * @param {AnyJson} abilitiesAvailable
    * @return {AnyJson}
    */
@@ -125,6 +127,7 @@ class AbilitiesUtils {
 
   /**
    * Transform une config d'abilities en un tableau d'Abilities
+   *
    * @param {AnyJson} abilitiesAvailable
    * @return {Array<AbilitiesType>}
    */
@@ -142,6 +145,7 @@ class AbilitiesUtils {
 
   /**
    * Parcourt les fonctions par services et établit si oui ou non l'habilité est autorisée
+   *
    * @param {AnyJson} functionByServices
    * @return {boolean}
    */

+ 11 - 5
services/rights/roleUtils.ts

@@ -46,23 +46,27 @@ const actionMap: AnyJson = {
 }
 
 /**
- * @category Services/droits
- * @class RoleUtils
  * Classe permettant de mener des opérations sur les rôles
  */
 class RoleUtils {
   /**
-   * Test si une personne possède un profil suivant ses roles
+   * Teste si une personne possède un profil suivant ses rôles
+   *
    * @param {string} profileName
    * @param {Array<string>} roles
    * @return {boolean}
    */
   isA (profileName: string, roles: Array<string>): boolean {
+    profileName = profileName.toUpperCase()
+    if (!profileName.match(/[A-Z_]+/)) {
+      throw new Error('invalid role name')
+    }
     return roles.includes('ROLE_' + profileName + '_CORE')
   }
 
   /**
-   * Filtre les roles afin d'en exclure les "Roles fonctions"
+   * Filtre les rôles afin d'en exclure les "Roles fonctions"
+   *
    * @param {Array<string>} roles
    * @return {Array<string>}
    */
@@ -73,7 +77,8 @@ class RoleUtils {
   }
 
   /**
-   * Fix en attendant la migration complète, quelques roles disposent d'underscore en trop, on corrige cela...
+   * Fix en attendant la migration complète, quelques rôles disposent d'underscore en trop, on corrige cela...
+   *
    * @param {Array<string>} roles
    * @return {Array<string>}
    */
@@ -96,6 +101,7 @@ class RoleUtils {
 
   /**
    * On transforme les ROLES Symfony en Abilities
+   *
    * @param {Array<string>} roles
    * @return {Array<AbilitiesType>}
    */

+ 4 - 2
services/serializer/denormalizer/hydra.ts

@@ -3,8 +3,6 @@ import BaseDenormalizer from '~/services/serializer/denormalizer/baseDenormalize
 import { DENORMALIZER_TYPE } from '~/types/enums'
 
 /**
- * @category Services/serializer/denormalizer
- * @class HydraParser
  * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
  */
 class Hydra extends BaseDenormalizer {
@@ -14,6 +12,7 @@ class Hydra extends BaseDenormalizer {
 
   /**
    * Parcourt une réponse Hydra pour retourner son équivalent en Json
+   *
    * @param {AnyJson} hydraData
    * @return {AnyJson} réponse parsée
    */
@@ -28,6 +27,7 @@ class Hydra extends BaseDenormalizer {
 
   /**
    * Méthode de parsing appelé si on est dans un GET
+   *
    * @param {AnyJson} hydraData
    */
   private static parseItem (hydraData: AnyJson): AnyJson {
@@ -50,6 +50,7 @@ class Hydra extends BaseDenormalizer {
 
   /**
    * Méthode de parsing appelé si on est dans un GET Collection
+   *
    * @param {AnyJson} hydraData
    */
   private static parseCollection (hydraData: AnyJson): AnyJson {
@@ -88,6 +89,7 @@ class Hydra extends BaseDenormalizer {
 
   /**
    * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
+   *
    * @param {AnyJson} data
    */
   private static populateAllData (data: AnyJson): void {

+ 3 - 3
services/serializer/denormalizer/yaml.ts

@@ -1,12 +1,10 @@
 import { read } from 'yaml-import'
-import { AnyJson, Denormalizer } from '~/types/interfaces'
+import { AnyJson } from '~/types/interfaces'
 import BaseDenormalizer from '~/services/serializer/denormalizer/baseDenormalizer'
 import { DENORMALIZER_TYPE } from '~/types/enums'
 const yaml = require('js-yaml')
 
 /**
- * @category Services/utils
- * @class YamlParser
  * Classe permettant d'assurer la dénormalization d'un fichier JSON en JSON
  */
 class Yaml extends BaseDenormalizer {
@@ -16,11 +14,13 @@ class Yaml extends BaseDenormalizer {
 
   /**
    * Parse un fichier Yaml pour en retourner son équivalent en Json
+   *
    * @param {AnyJson} data
    * @return {AnyJson}
    */
   public static denormalize (data: AnyJson): AnyJson {
     try {
+      // noinspection TypeScriptValidateJSTypes,JSVoidFunctionReturnValueUsed
       return yaml.load(yaml.dump(read(data.path)))
     } catch (e) {
       throw new Error(e.message)

+ 5 - 2
services/store/query.ts

@@ -4,13 +4,12 @@ import { $objectProperties } from '~/services/utils/objectProperties'
 import { AnyJson } from '~/types/interfaces'
 
 /**
- * @category Services/store
- * @class Query
  * Classe Wrapper pour assurer les opérations les plus communes des Query de VuexORM
  */
 class Query {
   /**
    * Récupération de l'Item souhaité
+   *
    * @param {VuexQuery} query
    * @param {number} id
    * @return {Item} l'Item
@@ -23,6 +22,7 @@ class Query {
 
   /**
    * Récupération du premier item
+   *
    * @param {VuexQuery} query
    * @return {Item} l'Item
    */
@@ -34,6 +34,7 @@ class Query {
 
   /**
    * Récupération la collection de la Query
+   *
    * @param {VuexQuery} query
    * @return {Collection} Array d'Item
    */
@@ -43,6 +44,7 @@ class Query {
 
   /**
    * Récupération de l'Item souhaité puis transformation en JSON aplati
+   *
    * @param {VuexQuery} query
    * @param {number} id
    * @return {AnyJson} réponse
@@ -53,6 +55,7 @@ class Query {
 
   /**
    * Récupération la collection de la Query puis transformation en JSON aplati
+   *
    * @param {VuexQuery} query
    * @return {Array<AnyJson>} réponse
    */

+ 9 - 2
services/store/repository.ts

@@ -5,8 +5,6 @@ import { $objectProperties } from '~/services/utils/objectProperties'
 import { AnyJson } from '~/types/interfaces'
 
 /**
- * @category Services/store
- * @class Repository
  * Classe Wrapper pour assurer les opérations les plus communes des Repository de VuexORM
  */
 class Repository {
@@ -14,6 +12,7 @@ class Repository {
 
   /**
    * Set le store
+   *
    * @param {Store<any>} store
    */
   public setStore (store: Store<any>) {
@@ -22,6 +21,7 @@ class Repository {
 
   /**
    * Récupération du repository du Model
+   *
    * @param {Model} model
    * @return {VuexRepository<Model>} le repository
    */
@@ -35,6 +35,7 @@ class Repository {
 
   /**
    * Récupération du nom de l'entité du model
+   *
    * @param {Model} model
    * @return {string} l'entité
    */
@@ -44,6 +45,7 @@ class Repository {
 
   /**
    * Persist l'entry dans le repository
+   *
    * @param {Model} model
    * @param {AnyJson} entry
    */
@@ -55,6 +57,7 @@ class Repository {
 
   /**
    * Effectue une mise à jour du store après la modification d'un champ de l'entry
+   *
    * @param {Model} model
    * @param {AnyJson} entry
    * @param {any} value
@@ -69,6 +72,7 @@ class Repository {
 
   /**
    * Récupération de l'Item du Model souhaité
+   *
    * @param {Model} model
    * @param {number} id
    * @return {Item} l'Item
@@ -83,6 +87,7 @@ class Repository {
 
   /**
    * Récupération de la Collection du Model souhaité
+   *
    * @param {Model} model
    * @return {Collection} la collection
    */
@@ -93,6 +98,7 @@ class Repository {
 
   /**
    * Supprime l'Item du repository
+   *
    * @param {Model} model
    * @param {number} id
    */
@@ -103,6 +109,7 @@ class Repository {
 
   /**
    * Supprime tous les Items du repository
+   *
    * @param {VuexRepository} repository
    */
   public cleanRepository (repository: VuexRepository) {

+ 1 - 0
services/utils/datesUtils.ts

@@ -9,6 +9,7 @@ export default class DatesUtils {
 
   /**
    * Formate la ou les dates au format donné
+   *
    * @param dates
    * @param format
    */