dataPersister.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { AnyJson, DataPersisterArgs, DataProviderArgs } from '~/types/interfaces'
  2. import UrlBuilder from '~/services/connection/urlBuilder'
  3. import { DENORMALIZER_TYPE, HTTP_METHOD } from '~/types/enums'
  4. import Serializer from '~/services/serializer/serializer'
  5. import DataProvider from '~/services/data/dataProvider'
  6. import BaseDataManager from '~/services/data/baseDataManager'
  7. import { hooksPersister } from '~/services/data/hooks/hookPersister/_import'
  8. /**
  9. * Le DataPersister a pour rôle de mettre à jour les données via de l'API
  10. *
  11. * Il sérialise les données et les envoie à l'API sous la forme d'une requête
  12. * PUT ou POST, selon les cas. Il fait ensuite appel au DataProvider pour traiter la
  13. * réponse de l'API et la retourner.
  14. */
  15. class DataPersister extends BaseDataManager {
  16. protected arguments!: DataPersisterArgs
  17. protected hooks = hooksPersister;
  18. /**
  19. * Exécute la requête et retourne la réponse désérialisée
  20. */
  21. protected async _invoke (): Promise<any> {
  22. // serialize the data to persist and attach it to the request arguments
  23. this.arguments.data = Serializer.normalize(this.arguments)
  24. // build the url according to the url args
  25. const url = UrlBuilder.build(this.arguments)
  26. // send the POST / PUT request to the api and retrieve the response
  27. const response = await DataPersister.request(
  28. url,
  29. this.arguments.id ? HTTP_METHOD.PUT : HTTP_METHOD.POST,
  30. this.arguments
  31. )
  32. // Deserialize, post-process and return the response
  33. return await this.provideResponse(response, this.arguments)
  34. }
  35. /**
  36. * Use a data provider to deserialize, post-process and return the response
  37. *
  38. * @param response
  39. * @param args
  40. */
  41. private async provideResponse (response: AnyJson, args: DataPersisterArgs) {
  42. const deserializedResponse = Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA)
  43. const dataProvider = new DataProvider()
  44. dataProvider.initCtx(this.ctx)
  45. const dataProviderArgs: DataProviderArgs = {
  46. type: args.type,
  47. url: args.url,
  48. enumType: args.enumType,
  49. model: args.model,
  50. rootModel: args.rootModel,
  51. id: args.id,
  52. rootId: args.rootId
  53. }
  54. return await dataProvider.process(deserializedResponse, dataProviderArgs)
  55. }
  56. }
  57. export default DataPersister