dataProvider.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 hooks = hooksProvider;
  20. protected defaultArguments: object = {
  21. type: QUERY_TYPE.MODEL,
  22. showProgress: false
  23. }
  24. /**
  25. * Exécute la requête et retourne la réponse désérialisée
  26. * @param {DataDeleterArgs} queryArguments
  27. */
  28. protected async _invoke (queryArguments:DataProviderArgs): Promise<any> {
  29. // build the url according to the url args
  30. const url = UrlBuilder.build(queryArguments)
  31. // send the GET request to the api and retrieve the response
  32. const response = await DataProvider.request(url, HTTP_METHOD.GET, queryArguments)
  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, queryArguments)
  37. }
  38. /**
  39. * Find the first supported post data processor, and process the data with it
  40. * @param {AnyJson} data
  41. * @param {DataProviderArgs} args
  42. */
  43. public async process (data: AnyJson, args: DataProviderArgs) {
  44. const postProcessor = this.getProcessor(args)
  45. if(!postProcessor) throw new Error('A processor need to be defined')
  46. return await postProcessor.process(data)
  47. }
  48. /**
  49. * Iterate over the available data processors and return an instance of
  50. * the first one that support the given args
  51. * @param {DataProviderArgs} args
  52. */
  53. private getProcessor (args: DataProviderArgs): any {
  54. for (const processor of processors) {
  55. if (processor.support(args)) {
  56. // eslint-disable-next-line new-cap
  57. return new processor(this.ctx, args)
  58. }
  59. }
  60. }
  61. }
  62. export default DataProvider