hydra.ts 3.1 KB

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