dataProvider.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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
  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. // build the url according to the url args
  30. const url = UrlBuilder.build(this.arguments)
  31. // send the GET request to the api and retrieve the response
  32. const response = await DataProvider.request(url, HTTP_METHOD.GET, this.arguments)
  33. // deserialize the response
  34. const data = await Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA)
  35. // post-process the data with the first supported processor
  36. return await this.process(data, this.arguments)
  37. }
  38. /**
  39. * Find the first supported post data processor, and process the data with it
  40. * @param data
  41. * @param args
  42. */
  43. public async process (data: AnyJson, args: DataProviderArgs) {
  44. const postProcessor = this.getProcessor(args)
  45. return await postProcessor.process(data)
  46. }
  47. /**
  48. * Iterate over the available data processors and return an instance of
  49. * the first one that support the given args
  50. * @param args
  51. */
  52. private getProcessor (args: DataProviderArgs): any {
  53. for (const processor of processors) {
  54. if (processor.support(args)) {
  55. // eslint-disable-next-line new-cap
  56. return new processor(this.ctx, args)
  57. }
  58. }
  59. }
  60. }
  61. export default DataProvider