dataProvider.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { AnyJson, DataProviderArgs } from '~/types/interfaces'
  2. import { DENORMALIZER_TYPE, HTTP_METHOD, QUERY_TYPE } from '~/types/enums'
  3. import { processors } from '~/services/data/processor/_import'
  4. import UrlBuilder from '~/services/connection/urlBuilder'
  5. import Serializer from '~/services/serializer/serializer'
  6. import BaseDataManager from '~/services/data/baseDataManager'
  7. import { hooksProvider } from '~/services/data/hooks/hookProvider/_import'
  8. /**
  9. * Le DataProvider a pour rôle de fournir des données issues de l'API Opentalent
  10. *
  11. * Pour cela, le DataProvider envoie une requête GET, récupérer la réponse de l'API,
  12. * puis la désérialiser.
  13. * Enfin, il va itérer sur les différents Processor disponibles, jusqu'à trouver
  14. * un processeur adapté à la requête. Ce processeur va mettre en forme la réponse qui est enfin
  15. * retournée par le DataProvider.
  16. */
  17. class DataProvider extends BaseDataManager {
  18. protected progress: boolean = false
  19. protected arguments!: DataProviderArgs
  20. protected hooks = hooksProvider;
  21. protected defaultArguments: object = {
  22. type: QUERY_TYPE.MODEL,
  23. showProgress: false
  24. }
  25. /**
  26. * Exécute la requête et retourne la réponse désérialisée
  27. */
  28. protected async _invoke (): Promise<any> {
  29. const url = UrlBuilder.build(this.arguments)
  30. const response = await DataProvider.request(url, HTTP_METHOD.GET, this.arguments)
  31. const data = await Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA)
  32. return await this.process(data, this.arguments)
  33. }
  34. public async process (data: AnyJson, args: DataProviderArgs) {
  35. const postProcessor = this.getProcessor(args)
  36. return await postProcessor.process(data)
  37. }
  38. /**
  39. * Iterate over the available providers and invoke
  40. * the first one that support the given args
  41. * @param args
  42. */
  43. private getProcessor (args: DataProviderArgs): any {
  44. for (const processor of processors) {
  45. if (processor.support(args)) {
  46. // eslint-disable-next-line new-cap
  47. return new processor(this.ctx, args)
  48. }
  49. }
  50. }
  51. }
  52. export default DataProvider