hydraDenormalizer.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import {AnyJson, ApiResponse, HydraMetadata} from '~/types/interfaces'
  2. import BaseDenormalizer from '~/services/serializer/denormalizer/baseDenormalizer'
  3. import {DENORMALIZER_TYPE, METADATA_TYPE} from '~/types/enums'
  4. /**
  5. * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
  6. */
  7. class HydraDenormalizer 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 HydraDenormalizer.parseCollection(hydraData)
  21. } else {
  22. return HydraDenormalizer.parseItem(hydraData)
  23. }
  24. }
  25. private static parseItem (hydraData: AnyJson): ApiResponse {
  26. return {
  27. data: hydraData,
  28. metadata: HydraDenormalizer.definedMetadataForItem(hydraData)
  29. }
  30. }
  31. /**
  32. * Méthode de parsing appelé si on est dans un GET
  33. *
  34. * @param {AnyJson} hydraData
  35. */
  36. private static definedMetadataForItem (hydraData: AnyJson): AnyJson {
  37. const metadata:HydraMetadata = {}
  38. // if (hydraData['hydra:previous']) {
  39. // const iriParts = hydraData['hydra:previous'].split('/')
  40. // hydraData.previous = iriParts[iriParts.length - 1]
  41. // }
  42. // if (hydraData['hydra:next']) {
  43. // const iriParts = hydraData['hydra:next'].split('/')
  44. // hydraData.next = iriParts[iriParts.length - 1]
  45. // }
  46. // if (hydraData['hydra:totalItems']) {
  47. // hydraData.totalItems = hydraData['hydra:totalItems']
  48. // }
  49. // if (hydraData['hydra:itemPosition']) {
  50. // hydraData.itemPosition = hydraData['hydra:itemPosition']
  51. // }
  52. metadata.type = METADATA_TYPE.ITEM
  53. return metadata
  54. }
  55. /**
  56. * Méthode de parsing appelé si on est dans un GET Collection
  57. *
  58. * @param {AnyJson} hydraData
  59. */
  60. private static parseCollection (hydraData: AnyJson): ApiResponse {
  61. const collectionResponse:ApiResponse = {
  62. data:hydraData['hydra:member'],
  63. metadata : HydraDenormalizer.definedMetadataForCollection(hydraData)
  64. }
  65. // collectionResponse.order = {}
  66. // collectionResponse.search = {}
  67. // Populate href property for all elements of the collection
  68. for (const key in collectionResponse.data) {
  69. const value = collectionResponse.data[key]
  70. HydraDenormalizer.populateAllData(value)
  71. }
  72. // if (typeof (hydraData['hydra:search']) !== 'undefined') {
  73. // const collectionSearch = hydraData['hydra:search']['hydra:mapping']
  74. // for (const key in collectionSearch) {
  75. // const value = collectionSearch[key]
  76. // if (value.variable.indexOf('filter[order]') === 0) {
  77. // collectionResponse.order[value.property] = value
  78. // } else if (value.variable.indexOf('filter[where]') === 0) {
  79. // collectionResponse.search[value.property] = value
  80. // }
  81. // }
  82. // }
  83. return collectionResponse
  84. }
  85. private static definedMetadataForCollection(data:AnyJson){
  86. const metadata:HydraMetadata = {
  87. totalItems: data['hydra:totalItems']
  88. }
  89. if(data['hydra:view']){
  90. metadata.firstPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:first'])
  91. metadata.lastPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:last'])
  92. metadata.nextPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:next'])
  93. metadata.previousPage = HydraDenormalizer.getPageNumber(data['hydra:view']['hydra:previous'])
  94. }
  95. metadata.type = METADATA_TYPE.COLLECTION
  96. return metadata
  97. }
  98. private static getPageNumber(uri:string):number {
  99. if(uri){
  100. const number = uri.split('page=').pop()
  101. return number ? useParseInt(number) : 0
  102. }
  103. return 0
  104. }
  105. /**
  106. * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
  107. *
  108. * @param {AnyJson} data
  109. */
  110. private static populateAllData (data: AnyJson): void {
  111. for (const key in data) {
  112. const value = data[key]
  113. if (value instanceof Object) {
  114. HydraDenormalizer.populateAllData(value)
  115. }
  116. }
  117. }
  118. }
  119. export default HydraDenormalizer