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.HYDRA
  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. 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. * @param {AnyJson} hydraData
  50. */
  51. private parseCollection (hydraData: AnyJson): AnyJson {
  52. const 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 (key !== 'hydra:member') {
  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 (typeof (hydraData['hydra:search']) !== 'undefined') {
  69. const 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