hydraParser.ts 3.2 KB

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