hydra.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import {AnyJson, Denormalizer} from "~/types/interfaces";
  2. import BaseDenormalizer from "~/services/serializer/denormalizer/baseDenormalizer";
  3. import {DENORMALIZER_TYPE} from "~/types/enums";
  4. /**
  5. * @category Services/serializer/denormalizer
  6. * @class HydraParser
  7. * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
  8. */
  9. class Hydra extends BaseDenormalizer implements Denormalizer{
  10. static support(type: DENORMALIZER_TYPE): boolean {
  11. return type === DENORMALIZER_TYPE.DEFAULT
  12. }
  13. /**
  14. * Parcours une réponse Hydra pour retourner son équivalent en Json
  15. * @param {AnyJson} hydraData
  16. * @return {AnyJson} réponse parsée
  17. */
  18. public denormalize(hydraData: AnyJson): AnyJson {
  19. if (hydraData['hydra:member']) {
  20. hydraData.totalCount = hydraData['hydra:totalItems'];
  21. return this.parseCollection(hydraData);
  22. } else {
  23. return this.parseItem(hydraData);
  24. }
  25. }
  26. /**
  27. * Méthode de parsing appelé si on est dans un GET
  28. * @param {AnyJson} hydraData
  29. */
  30. private parseItem(hydraData: AnyJson): AnyJson {
  31. if (hydraData['hydra:previous']) {
  32. let iriParts = hydraData['hydra:previous'].split('/');
  33. hydraData.previous = iriParts[iriParts.length - 1];
  34. }
  35. if (hydraData['hydra:next']) {
  36. let iriParts = hydraData['hydra:next'].split('/');
  37. hydraData.next = iriParts[iriParts.length - 1];
  38. }
  39. if (hydraData['hydra:totalItems']) {
  40. hydraData.totalItems = hydraData['hydra:totalItems'];
  41. }
  42. if (hydraData['hydra:itemPosition']) {
  43. hydraData.itemPosition = hydraData['hydra:itemPosition'];
  44. }
  45. return hydraData;
  46. }
  47. /**
  48. * Méthode de parsing appelé si on est dans un GET Collection
  49. * @param {AnyJson} hydraData
  50. */
  51. private parseCollection(hydraData: AnyJson): AnyJson {
  52. let collectionResponse = hydraData['hydra:member'];
  53. collectionResponse.metadata = {};
  54. collectionResponse.order = {};
  55. collectionResponse.search = {};
  56. // Put metadata in a property of the collection
  57. for (const key in hydraData) {
  58. const value = hydraData[key];
  59. if ('hydra:member' !== key) {
  60. collectionResponse.metadata[key] = value;
  61. }
  62. }
  63. // Populate href property for all elements of the collection
  64. for (const key in collectionResponse) {
  65. const value = collectionResponse[key];
  66. this.populateAllData(value);
  67. }
  68. if ('undefined' !== typeof (hydraData['hydra:search'])) {
  69. let collectionSearch = hydraData['hydra:search']['hydra:mapping'];
  70. for (const key in collectionSearch) {
  71. const value = collectionSearch[key];
  72. if (value['variable'].indexOf("filter[order]") === 0) {
  73. collectionResponse.order[value['property']] = value;
  74. } else if (value['variable'].indexOf("filter[where]") === 0) {
  75. collectionResponse.search[value['property']] = value;
  76. }
  77. }
  78. }
  79. return collectionResponse;
  80. }
  81. /**
  82. * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
  83. * @param {AnyJson} data
  84. */
  85. private populateAllData(data: AnyJson):void {
  86. for (const key in data) {
  87. const value = data[key];
  88. if (value instanceof Object) {
  89. this.populateAllData(value);
  90. }
  91. }
  92. }
  93. }
  94. export default Hydra