Selaa lähdekoodia

refactor folder structure for data services and hooks

Olivier Massot 4 vuotta sitten
vanhempi
commit
f34323f692
33 muutettua tiedostoa jossa 126 lisäystä ja 75 poistoa
  1. 5 0
      notes_relecture.md
  2. 1 1
      plugins/Data/dataDeleter.ts
  3. 1 1
      plugins/Data/dataPersister.ts
  4. 1 1
      plugins/Data/dataProvider.ts
  5. 5 5
      services/connection/connection.ts
  6. 1 0
      services/connection/urlBuilder.ts
  7. 0 0
      services/data/__mocks__/__dataProvider.ts
  8. 4 4
      services/data/baseDataManager.ts
  9. 4 2
      services/data/dataDeleter.ts
  10. 5 3
      services/data/dataPersister.ts
  11. 5 3
      services/data/dataProvider.ts
  12. 6 5
      services/data/hookable.ts
  13. 2 2
      services/data/hooks/baseHook.ts
  14. 5 0
      services/data/hooks/hookDeleter/_import.ts
  15. 18 0
      services/data/hooks/hookDeleter/hookDeleterExample.ts
  16. 5 0
      services/data/hooks/hookPersister/_import.ts
  17. 17 0
      services/data/hooks/hookPersister/hookPersisterExample.ts
  18. 5 0
      services/data/hooks/hookProvider/_import.ts
  19. 17 0
      services/data/hooks/hookProvider/hookProviderExample.ts
  20. 9 0
      services/data/processor/_import.ts
  21. 1 1
      services/data/processor/baseProcessor.ts
  22. 1 1
      services/data/processor/defaultProcessor.ts
  23. 1 1
      services/data/processor/enumProcessor.ts
  24. 1 1
      services/data/processor/modelProcessor.ts
  25. 0 5
      services/dataDeleter/hook/_import.ts
  26. 0 5
      services/dataPersister/hook/_import.ts
  27. 0 9
      services/dataProvider/processor/_import.ts
  28. 0 5
      services/dataProvider/processor/hook/_import.ts
  29. 0 14
      services/hooks/hookExample.ts
  30. 1 1
      tests/unit/use/form/useChecker.spec.ts
  31. 1 1
      tests/unit/use/updater/useMyProfileUpdater.spec.ts
  32. 3 3
      types/interfaces.d.ts
  33. 1 1
      use/updater/useMyProfileUpdater.ts

+ 5 - 0
notes_relecture.md

@@ -19,3 +19,8 @@
 * manquerait pas un await dans middleware/auth.js?
 * un intérêt à utiliser les extensions .client.js et .server.js pour les plugins? (https://fr.nuxtjs.org/docs/2.x/directory-structure/plugins#convention-pour-le-nommage-des-plugins)
 * DatesUtils.sortDates: est-ce qu'un sort standard ne suffirait pas?
+
+## Questions
+
+* classe Connection.ts: pqoi AxiosRequestConfig accepte le mot clé progress et pas showPogress?
+* 

+ 1 - 1
plugins/Data/dataDeleter.ts

@@ -1,5 +1,5 @@
 import {Plugin} from '@nuxt/types'
-import DataDeleter from '~/services/dataDeleter/dataDeleter'
+import DataDeleter from '~/services/data/dataDeleter'
 
 const dataDeleterPlugin: Plugin = (ctx) => {
   const dataDeleter = new DataDeleter()

+ 1 - 1
plugins/Data/dataPersister.ts

@@ -1,5 +1,5 @@
 import { Plugin } from '@nuxt/types'
-import DataPersister from '~/services/dataPersister/dataPersister'
+import DataPersister from '~/services/data/dataPersister'
 
 const dataPersisterPlugin: Plugin = (ctx) => {
   const dataPersister = new DataPersister()

+ 1 - 1
plugins/Data/dataProvider.ts

@@ -1,5 +1,5 @@
 import { Plugin } from '@nuxt/types'
-import DataProvider from '~/services/dataProvider/dataProvider'
+import DataProvider from '~/services/data/dataProvider'
 
 const dataProviderPlugin: Plugin = (ctx) => {
   const dataProvider = new DataProvider()

+ 5 - 5
services/connection/connection.ts

@@ -60,7 +60,7 @@ class Connection {
    * @return {Promise<any>}
    */
   public static getItem (url: string, id: number, progress: boolean = true): Promise<any> {
-    const config:AxiosRequestConfig = {
+    const config: AxiosRequestConfig = {
       url: `${url}/${id}`,
       method: HTTP_METHOD.GET,
       progress
@@ -75,7 +75,7 @@ class Connection {
    * @return {Promise<any>}
    */
   public static getCollection (url: string, progress: boolean = true): Promise<any> {
-    const config:AxiosRequestConfig = {
+    const config: AxiosRequestConfig = {
       url: `${url}`,
       method: HTTP_METHOD.GET,
       progress
@@ -92,7 +92,7 @@ class Connection {
    * @return {Promise<any>}
    */
   public static put (url: string, id: number, data: AnyJson, progress: boolean = true): Promise<any> {
-    const config:AxiosRequestConfig = {
+    const config: AxiosRequestConfig = {
       url: `${url}/${id}`,
       method: HTTP_METHOD.PUT,
       data,
@@ -109,7 +109,7 @@ class Connection {
    * @return {Promise<any>}
    */
   public static deleteItem (url: string, id: number, progress: boolean = true): Promise<any> {
-    const config:AxiosRequestConfig = {
+    const config: AxiosRequestConfig = {
       url: `${url}/${id}`,
       method: HTTP_METHOD.DELETE,
       progress
@@ -130,7 +130,7 @@ class Connection {
    * Test si l'argument est bien de type DataPersister
    * @param args
    */
-  private static isDataPersisterArgs (args:DataProviderArgs|DataPersisterArgs): args is DataPersisterArgs {
+  private static isDataPersisterArgs (args: DataProviderArgs|DataPersisterArgs): args is DataPersisterArgs {
     return (args as DataPersisterArgs).data !== undefined
   }
 }

+ 1 - 0
services/connection/urlBuilder.ts

@@ -6,6 +6,7 @@ import { repositoryHelper } from '~/services/store/repository'
 /**
  * @category Services/connection
  * @class UrlBuilder
+ *
  * Classe permettant de construire une URL pour l'interrogation d'une API externe
  */
 class UrlBuilder {

+ 0 - 0
services/dataProvider/__mocks__/__dataProvider.ts → services/data/__mocks__/__dataProvider.ts


+ 4 - 4
services/connection/dataManager.ts → services/data/baseDataManager.ts

@@ -1,14 +1,14 @@
 import { Context } from '@nuxt/types/app'
 import { UrlArgs } from '~/types/interfaces'
 import Connection from '~/services/connection/connection'
-import Hookable from '~/services/hooks/hookable'
+import Hookable from '~/services/data/hookable'
 import { HTTP_METHOD, QUERY_TYPE } from '~/types/enums'
 import ApiError from '~/services/utils/apiError'
 
 /**
  * Base class for data providers, persisters or deleters
  */
-class DataManager extends Hookable implements DataManager {
+abstract class BaseDataManager extends Hookable implements BaseDataManager {
   protected ctx!: Context
   protected arguments!: UrlArgs
   protected defaultArguments: object = {
@@ -40,7 +40,7 @@ class DataManager extends Hookable implements DataManager {
    */
   public async invoke (args: UrlArgs): Promise<any> {
     this.arguments = { ...this.defaultArguments, ...args }
-    DataManager.startLoading(this.arguments)
+    BaseDataManager.startLoading(this.arguments)
 
     await this.triggerHooks(args)
 
@@ -73,4 +73,4 @@ class DataManager extends Hookable implements DataManager {
   }
 }
 
-export default DataManager
+export default BaseDataManager

+ 4 - 2
services/dataDeleter/dataDeleter.ts → services/data/dataDeleter.ts

@@ -1,12 +1,14 @@
 import { DataDeleterArgs } from '~/types/interfaces'
-import DataManager from '~/services/connection/dataManager'
+import BaseDataManager from '~/services/data/baseDataManager'
 import { repositoryHelper } from '~/services/store/repository'
+import { hooksDeleter } from '~/services/data/hooks/hookDeleter/_import'
 
 /**
  * Le DataDeleter a pour rôle de supprimer des enregistrements via l'API Opentalent
  */
-class DataDeleter extends DataManager {
+class DataDeleter extends BaseDataManager {
   protected arguments!: DataDeleterArgs
+  protected hooks = hooksDeleter;
 
   /**
    * Exécute la requête

+ 5 - 3
services/dataPersister/dataPersister.ts → services/data/dataPersister.ts

@@ -2,8 +2,9 @@ import { AnyJson, DataPersisterArgs, DataProviderArgs } from '~/types/interfaces
 import UrlBuilder from '~/services/connection/urlBuilder'
 import { DENORMALIZER_TYPE, HTTP_METHOD } from '~/types/enums'
 import Serializer from '~/services/serializer/serializer'
-import DataProvider from '~/services/dataProvider/dataProvider'
-import DataManager from '~/services/connection/dataManager'
+import DataProvider from '~/services/data/dataProvider'
+import BaseDataManager from '~/services/data/baseDataManager'
+import { hooksPersister } from '~/services/data/hooks/hookPersister/_import'
 
 /**
  * Le DataPersister a pour rôle de mettre à jour les données via de l'API Opentalent
@@ -12,8 +13,9 @@ import DataManager from '~/services/connection/dataManager'
  * PUT ou POST, selon les cas. Il fait ensuite appel au DataProvider pour traiter la
  * réponse de l'API et la retourner.
  */
-class DataPersister extends DataManager {
+class DataPersister extends BaseDataManager {
   protected arguments!: DataPersisterArgs
+  protected hooks = hooksPersister;
 
   /**
    * Exécute la requête et retourne la réponse désérialisée

+ 5 - 3
services/dataProvider/dataProvider.ts → services/data/dataProvider.ts

@@ -1,9 +1,10 @@
 import { AnyJson, DataProviderArgs } from '~/types/interfaces'
 import { DENORMALIZER_TYPE, HTTP_METHOD, QUERY_TYPE } from '~/types/enums'
-import { processors } from '~/services/dataProvider/processor/_import'
+import { processors } from '~/services/data/processor/_import'
 import UrlBuilder from '~/services/connection/urlBuilder'
 import Serializer from '~/services/serializer/serializer'
-import DataManager from '~/services/connection/dataManager'
+import BaseDataManager from '~/services/data/baseDataManager'
+import { hooksProvider } from '~/services/data/hooks/hookProvider/_import'
 
 /**
  * Le DataProvider a pour rôle de fournir des données issues de l'API Opentalent
@@ -14,9 +15,10 @@ import DataManager from '~/services/connection/dataManager'
  * un processeur adapté à la requête. Ce processeur va mettre en forme la réponse qui est enfin
  * retournée par le DataProvider.
  */
-class DataProvider extends DataManager {
+class DataProvider extends BaseDataManager {
   protected progress: boolean = false
   protected arguments!: DataProviderArgs
+  protected hooks = hooksProvider;
   protected defaultArguments: object = {
     type: QUERY_TYPE.MODEL,
     showProgress: false

+ 6 - 5
services/hooks/hookable.ts → services/data/hookable.ts

@@ -1,16 +1,17 @@
-import { hooks } from '~/services/dataDeleter/hook/_import'
 import { UrlArgs } from '~/types/interfaces'
 
 /**
  * Base class for an object which support hooks
  */
-class Hookable {
+abstract class Hookable {
+  protected hooks: Array<any> = []; // how could we replace 'any'?
+
   /**
    * Iterate over the available hooks and invoke the ones
    * that support the given args
    */
   protected async triggerHooks (args: UrlArgs) {
-    for (const Hook of Hookable.sortedHooks()) {
+    for (const Hook of this.sortedHooks()) {
       if (Hook.support(args)) {
         await new Hook().invoke(args)
       }
@@ -21,8 +22,8 @@ class Hookable {
    * Sort the available hooks by priority
    * @private
    */
-  private static sortedHooks (): Iterable<any> {
-    return hooks.sort(function (a, b) {
+  private sortedHooks (): Iterable<any> {
+    return this.hooks.sort(function (a, b) {
       if (a.priority > b.priority) { return 1 }
       if (a.priority < b.priority) { return -1 }
       return 0

+ 2 - 2
services/hooks/baseHook.ts → services/data/hooks/baseHook.ts

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

+ 5 - 0
services/data/hooks/hookDeleter/_import.ts

@@ -0,0 +1,5 @@
+import HookDeleterExample from '~/services/data/hooks/hookDeleter/hookDeleterExample'
+
+export const hooksDeleter = [
+  HookDeleterExample
+]

+ 18 - 0
services/data/hooks/hookDeleter/hookDeleterExample.ts

@@ -0,0 +1,18 @@
+import BaseHook from '~/services/data/hooks/baseHook'
+import { DataDeleterArgs, HookDeleter } from '~/types/interfaces'
+
+class HookDeleterExample extends BaseHook implements HookDeleter {
+  static priority = 10
+
+  // eslint-disable-next-line @typescript-eslint/no-unused-vars
+  async invoke (args: DataDeleterArgs): Promise<any> {
+    // eslint-disable-next-line no-console
+    await console.log('This is a deleter hook')
+  }
+
+  static support (_args: DataDeleterArgs): boolean {
+    return false
+  }
+}
+
+export default HookDeleterExample

+ 5 - 0
services/data/hooks/hookPersister/_import.ts

@@ -0,0 +1,5 @@
+import HookPersisterExample from '~/services/data/hooks/hookPersister/hookPersisterExample'
+
+export const hooksPersister = [
+  HookPersisterExample
+]

+ 17 - 0
services/data/hooks/hookPersister/hookPersisterExample.ts

@@ -0,0 +1,17 @@
+import { DataPersisterArgs, HookPersister } from '~/types/interfaces'
+import BaseHook from '~/services/data/hooks/baseHook'
+
+class HookPersisterExample extends BaseHook implements HookPersister {
+  static priority = 10
+
+  async invoke (_args: DataPersisterArgs): Promise<any> {
+    // eslint-disable-next-line no-console
+    await console.log('This is a persister hook')
+  }
+
+  static support (_args: DataPersisterArgs): boolean {
+    return false
+  }
+}
+
+export default HookPersisterExample

+ 5 - 0
services/data/hooks/hookProvider/_import.ts

@@ -0,0 +1,5 @@
+import HookProviderExample from '~/services/data/hooks/hookProvider/hookProviderExample'
+
+export const hooksProvider = [
+  HookProviderExample
+]

+ 17 - 0
services/data/hooks/hookProvider/hookProviderExample.ts

@@ -0,0 +1,17 @@
+import BaseHook from '~/services/data/hooks/baseHook'
+import { DataProviderArgs, HookProvider } from '~/types/interfaces'
+
+class HookProviderExample extends BaseHook implements HookProvider {
+  priority = 10
+
+  async invoke (_args: DataProviderArgs): Promise<any> {
+    // eslint-disable-next-line no-console
+    await console.log('This is a provider hook')
+  }
+
+  static support (_args: DataProviderArgs): boolean {
+    return false
+  }
+}
+
+export default HookProviderExample

+ 9 - 0
services/data/processor/_import.ts

@@ -0,0 +1,9 @@
+import ModelProcessor from '~/services/data/processor/modelProcessor'
+import EnumProcessor from '~/services/data/processor/enumProcessor'
+import DefaultProcessor from '~/services/data/processor/defaultProcessor'
+
+export const processors = [
+  DefaultProcessor,
+  ModelProcessor,
+  EnumProcessor
+]

+ 1 - 1
services/dataProvider/processor/baseProcessor.ts → services/data/processor/baseProcessor.ts

@@ -1,6 +1,6 @@
 import { Context } from '@nuxt/types/app'
 import { AnyJson, DataProviderArgs } from '~/types/interfaces'
-import Hookable from '~/services/hooks/hookable'
+import Hookable from '~/services/data/hookable'
 
 class BaseProcessor extends Hookable {
   protected arguments!: DataProviderArgs;

+ 1 - 1
services/dataProvider/processor/defaultProcessor.ts → services/data/processor/defaultProcessor.ts

@@ -1,5 +1,5 @@
 import { AnyJson, DataProviderArgs, Processor } from '~/types/interfaces'
-import BaseProcessor from '~/services/dataProvider/processor/baseProcessor'
+import BaseProcessor from '~/services/data/processor/baseProcessor'
 import { QUERY_TYPE } from '~/types/enums'
 
 class DefaultProcessor extends BaseProcessor implements Processor {

+ 1 - 1
services/dataProvider/processor/enumProcessor.ts → services/data/processor/enumProcessor.ts

@@ -1,6 +1,6 @@
 import * as _ from 'lodash'
 import { AnyJson, DataProviderArgs, EnumChoice, EnumChoices, Processor } from '~/types/interfaces'
-import BaseProcessor from '~/services/dataProvider/processor/baseProcessor'
+import BaseProcessor from '~/services/data/processor/baseProcessor'
 import { QUERY_TYPE } from '~/types/enums'
 
 class EnumProcessor extends BaseProcessor implements Processor {

+ 1 - 1
services/dataProvider/processor/modelProcessor.ts → services/data/processor/modelProcessor.ts

@@ -1,6 +1,6 @@
 import * as _ from 'lodash'
 import { AnyJson, DataProviderArgs, Processor } from '~/types/interfaces'
-import BaseProcessor from '~/services/dataProvider/processor/baseProcessor'
+import BaseProcessor from '~/services/data/processor/baseProcessor'
 import { QUERY_TYPE } from '~/types/enums'
 import { repositoryHelper } from '~/services/store/repository'
 

+ 0 - 5
services/dataDeleter/hook/_import.ts

@@ -1,5 +0,0 @@
-import HookExample from '~/services/hooks/hookExample';
-
-export const hooks = [
-  HookExample
-]

+ 0 - 5
services/dataPersister/hook/_import.ts

@@ -1,5 +0,0 @@
-import HookExample from '~/services/hooks/hookExample'
-
-export const hooks = [
-  HookExample
-]

+ 0 - 9
services/dataProvider/processor/_import.ts

@@ -1,9 +0,0 @@
-import ModelProcessor from '~/services/dataProvider/processor/modelProcessor'
-import EnumProcessor from '~/services/dataProvider/processor/enumProcessor'
-import DefaultProcessor from '~/services/dataProvider/processor/defaultProcessor'
-
-export const processors = [
-  DefaultProcessor,
-  ModelProcessor,
-  EnumProcessor
-]

+ 0 - 5
services/dataProvider/processor/hook/_import.ts

@@ -1,5 +0,0 @@
-import HookExample from '~/services/hooks/hookExample'
-
-export const hooks = [
-  HookExample
-]

+ 0 - 14
services/hooks/hookExample.ts

@@ -1,14 +0,0 @@
-import { DataPersisterArgs, HookPersister } from '~/types/interfaces'
-import BaseHook from '~/services/hooks/baseHook'
-
-class HookExample extends BaseHook implements HookPersister {
-  static priority = 10
-
-  async invoke (_args: DataPersisterArgs): Promise<any> {}
-
-  static support (_args:DataPersisterArgs): boolean {
-    return false
-  }
-}
-
-export default HookExample

+ 1 - 1
tests/unit/use/form/useChecker.spec.ts

@@ -1,6 +1,6 @@
 import VueI18n from 'vue-i18n'
 import UseChecker from '~/use/form/useChecker'
-import DataProvider from '~/services/dataProvider/dataProvider'
+import DataProvider from '~/services/data/dataProvider'
 
 jest.mock('~/services/dataProvider/dataProvider')
 const DataProviderMock = DataProvider as jest.MockedClass<typeof DataProvider>

+ 1 - 1
tests/unit/use/updater/useMyProfileUpdater.spec.ts

@@ -1,6 +1,6 @@
 import { createStore } from '~/tests/unit/Helpers'
 import { accessState, AnyStore } from '~/types/interfaces'
-import DataPersister from '~/services/dataPersister/dataPersister'
+import DataPersister from '~/services/data/dataPersister'
 import { UseMyProfileUpdater } from '~/use/updater/useMyProfileUpdater'
 import { repositoryHelper } from '~/services/store/repository'
 

+ 3 - 3
types/interfaces.d.ts

@@ -2,9 +2,9 @@ import { Model } from '@vuex-orm/core'
 import { Ability } from '@casl/ability'
 import { Store } from 'vuex'
 import { Context } from '@nuxt/types/app'
-import DataPersister from '~/services/dataPersister/dataPersister'
-import DataProvider from '~/services/dataProvider/dataProvider'
-import DataDeleter from '~/services/dataDeleter/dataDeleter'
+import DataPersister from '~/services/data/dataPersister'
+import DataProvider from '~/services/data/dataProvider'
+import DataDeleter from '~/services/data/dataDeleter'
 import { ABILITIES, GENDER, QUERY_TYPE, TYPE_ALERT } from '~/types/enums'
 
 /**

+ 1 - 1
use/updater/useMyProfileUpdater.ts

@@ -3,7 +3,7 @@ import { Item, Model } from '@vuex-orm/core'
 import { repositoryHelper } from '~/services/store/repository'
 import { QUERY_TYPE } from '~/types/enums'
 import { accessState, AnyJson, AnyStore, Historical } from '~/types/interfaces'
-import DataPersister from '~/services/dataPersister/dataPersister'
+import DataPersister from '~/services/data/dataPersister'
 import { MyProfile } from '~/models/Access/MyProfile'
 
 /**