hydraDenormalizer.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import {AnyJson, ApiResponse, HydraMetadata} from '~/types/interfaces'
  2. import {METADATA_TYPE} from '~/types/enums'
  3. /**
  4. * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
  5. */
  6. class HydraDenormalizer {
  7. /**
  8. * Parcourt une réponse Hydra pour retourner son équivalent en Json
  9. *
  10. * @param {AnyJson} data
  11. * @return {AnyJson} réponse parsée
  12. */
  13. public static denormalize (data: AnyJson): AnyJson {
  14. if (data['hydra:member']) {
  15. data.totalCount = data['hydra:totalItems']
  16. return HydraDenormalizer.parseCollection(data)
  17. } else {
  18. return HydraDenormalizer.parseItem(data)
  19. }
  20. }
  21. private static parseItem (hydraData: AnyJson): ApiResponse {
  22. return {
  23. data: hydraData,
  24. metadata: HydraDenormalizer.definedMetadataForItem(hydraData)
  25. }
  26. }
  27. /**
  28. * Méthode de parsing appelé si on est dans un GET
  29. *
  30. * @param {AnyJson} hydraData
  31. */
  32. private static definedMetadataForItem (hydraData: AnyJson): AnyJson {
  33. const metadata:HydraMetadata = {}
  34. // if (hydraData['hydra:previous']) {
  35. // const iriParts = hydraData['hydra:previous'].split('/')
  36. // hydraData.previous = iriParts[iriParts.length - 1]
  37. // }
  38. // if (hydraData['hydra:next']) {
  39. // const iriParts = hydraData['hydra:next'].split('/')
  40. // hydraData.next = iriParts[iriParts.length - 1]
  41. // }
  42. // if (hydraData['hydra:totalItems']) {
  43. // hydraData.totalItems = hydraData['hydra:totalItems']
  44. // }
  45. // if (hydraData['hydra:itemPosition']) {
  46. // hydraData.itemPosition = hydraData['hydra:itemPosition']
  47. // }
  48. metadata.type = METADATA_TYPE.ITEM
  49. return metadata
  50. }
  51. /**
  52. * Méthode de parsing appelé si on est dans un GET Collection
  53. *
  54. * @param {AnyJson} hydraData
  55. */
  56. private static parseCollection (hydraData: AnyJson): ApiResponse {
  57. const collectionResponse:ApiResponse = {
  58. data:hydraData['hydra:member'],
  59. metadata : HydraDenormalizer.definedMetadataForCollection(hydraData)
  60. }
  61. // collectionResponse.order = {}
  62. // collectionResponse.search = {}
  63. // Populate href property for all elements of the collection
  64. for (const key in collectionResponse.data) {
  65. const value = collectionResponse.data[key]
  66. HydraDenormalizer.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. private static definedMetadataForCollection(data:AnyJson){
  82. const metadata:HydraMetadata = {
  83. totalItems: data['hydra:totalItems']
  84. }
  85. if(data['hydra:view']){
  86. metadata.firstPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:first'])
  87. metadata.lastPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:last'])
  88. metadata.nextPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:next'])
  89. metadata.previousPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:previous'])
  90. }
  91. metadata.type = METADATA_TYPE.COLLECTION
  92. return metadata
  93. }
  94. private static getPageNumber(uri:string):number {
  95. if(uri){
  96. const number = uri.split('page=').pop()
  97. return number ? parseInt(number) : 0
  98. }
  99. return 0
  100. }
  101. /**
  102. * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
  103. *
  104. * @param {AnyJson} data
  105. */
  106. private static populateAllData (data: AnyJson): void {
  107. for (const key in data) {
  108. const value = data[key]
  109. if (value instanceof Object) {
  110. HydraDenormalizer.populateAllData(value)
  111. }
  112. }
  113. }
  114. }
  115. export default HydraDenormalizer