dataProvider.ts 1.9 KB

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