hydraDenormalizer.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import {AnyJson, ApiResponse, HydraMetadata, METADATA_TYPE} from "~/types/data.d";
  2. /**
  3. * Classe permettant d'assurer la dé-normalization d'un objet Hydra en JSON
  4. */
  5. class HydraDenormalizer {
  6. /**
  7. * Parse une réponse Hydra pour retourner son équivalent en Json
  8. *
  9. * @param {AnyJson} data
  10. * @return {AnyJson} réponse parsée
  11. */
  12. public static denormalize (data: AnyJson): ApiResponse {
  13. if (data['hydra:member']) {
  14. return HydraDenormalizer.parseCollection(data)
  15. }
  16. return HydraDenormalizer.parseItem(data)
  17. }
  18. /**
  19. * Parse une réponse Hydra contenant un item
  20. *
  21. * @param hydraData
  22. * @private
  23. */
  24. private static parseItem (hydraData: AnyJson): ApiResponse {
  25. return {
  26. data: hydraData,
  27. metadata: HydraDenormalizer.definedMetadataForItem(hydraData)
  28. }
  29. }
  30. /**
  31. * Méthode de parsing appelé si on est dans un GET Collection
  32. *
  33. * @param {AnyJson} hydraData
  34. */
  35. private static parseCollection (hydraData: AnyJson): ApiResponse {
  36. const collectionResponse:ApiResponse = {
  37. data:hydraData['hydra:member'],
  38. metadata : HydraDenormalizer.definedMetadataForCollection(hydraData)
  39. }
  40. // collectionResponse.order = {}
  41. // collectionResponse.search = {}
  42. // Populate href property for all elements of the collection
  43. for (const key in collectionResponse.data) {
  44. const value = collectionResponse.data[key]
  45. HydraDenormalizer.populateAllData(value)
  46. }
  47. // if (typeof (hydraData['hydra:search']) !== 'undefined') {
  48. // const collectionSearch = hydraData['hydra:search']['hydra:mapping']
  49. // for (const key in collectionSearch) {
  50. // const value = collectionSearch[key]
  51. // if (value.variable.indexOf('filter[order]') === 0) {
  52. // collectionResponse.order[value.property] = value
  53. // } else if (value.variable.indexOf('filter[where]') === 0) {
  54. // collectionResponse.search[value.property] = value
  55. // }
  56. // }
  57. // }
  58. return collectionResponse
  59. }
  60. /**
  61. * Génère les metadonnées d'un item
  62. *
  63. * @param {AnyJson} hydraData
  64. */
  65. private static definedMetadataForItem (hydraData: AnyJson): AnyJson {
  66. const metadata: HydraMetadata = {}
  67. // if (hydraData['hydra:previous']) {
  68. // const iriParts = hydraData['hydra:previous'].split('/')
  69. // hydraData.previous = iriParts[iriParts.length - 1]
  70. // }
  71. // if (hydraData['hydra:next']) {
  72. // const iriParts = hydraData['hydra:next'].split('/')
  73. // hydraData.next = iriParts[iriParts.length - 1]
  74. // }
  75. // if (hydraData['hydra:totalItems']) {
  76. // hydraData.totalItems = hydraData['hydra:totalItems']
  77. // }
  78. // if (hydraData['hydra:itemPosition']) {
  79. // hydraData.itemPosition = hydraData['hydra:itemPosition']
  80. // }
  81. metadata.type = METADATA_TYPE.ITEM
  82. return metadata
  83. }
  84. /**
  85. * Génère les métadonnées d'une collection
  86. *
  87. * @param data
  88. * @private
  89. */
  90. private static definedMetadataForCollection(data:AnyJson){
  91. const metadata:HydraMetadata = {
  92. totalItems: data['hydra:totalItems']
  93. }
  94. if(data['hydra:view']){
  95. metadata.firstPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:first'])
  96. metadata.lastPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:last'])
  97. metadata.nextPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:next'])
  98. metadata.previousPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:previous'])
  99. }
  100. metadata.type = METADATA_TYPE.COLLECTION
  101. return metadata
  102. }
  103. /**
  104. * Parse an URI to retrieve the page number
  105. *
  106. * @param uri
  107. * @private
  108. */
  109. private static getPageNumber(uri:string):number {
  110. if(uri){
  111. const urlParams = new URLSearchParams(uri);
  112. const page = urlParams.get('page');
  113. return page ? parseInt(page) : 0
  114. }
  115. return 0
  116. }
  117. /**
  118. * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
  119. *
  120. * @param {AnyJson} data
  121. */
  122. private static populateAllData (data: AnyJson): void {
  123. for (const key in data) {
  124. const value = data[key]
  125. if (value instanceof Object) {
  126. HydraDenormalizer.populateAllData(value)
  127. }
  128. }
  129. }
  130. }
  131. export default HydraDenormalizer