hydraDenormalizer.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {AnyJson, ApiResponse, HydraMetadata} from '~/types/data'
  2. import UrlUtils from '~/services/utils/urlUtils'
  3. import {METADATA_TYPE} from '~/types/enum/data'
  4. /**
  5. * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
  6. */
  7. class HydraDenormalizer {
  8. /**
  9. * Parse une réponse Hydra pour retourner son équivalent en Json
  10. *
  11. * @param {AnyJson} hydraData
  12. * @return {AnyJson} réponse parsée
  13. */
  14. public static denormalize(hydraData: AnyJson): ApiResponse {
  15. return {
  16. data: HydraDenormalizer.getData(hydraData),
  17. metadata: HydraDenormalizer.getMetadata(hydraData)
  18. }
  19. }
  20. protected static getData(hydraData: AnyJson): AnyJson {
  21. return hydraData['@type'] === 'hydra:Collection' ? hydraData['hydra:member'] : hydraData
  22. }
  23. /**
  24. * Génère les métadonnées d'un item ou d'une collection
  25. *
  26. * @param data
  27. * @protected
  28. */
  29. protected static getMetadata(data: AnyJson): HydraMetadata {
  30. if (data['@type'] !== 'hydra:Collection') {
  31. // A single item, no metadata
  32. return { type: METADATA_TYPE.ITEM }
  33. }
  34. const metadata: HydraMetadata = {
  35. totalItems: data['hydra:totalItems']
  36. }
  37. if (data['hydra:view']) {
  38. /**
  39. * Extract the page number from the IRIs in the hydra:view section
  40. */
  41. const extractPageNumber = (pos: string, default_: number | undefined=undefined): number | undefined => {
  42. const iri = data['hydra:view']['hydra:' + pos]
  43. if (!iri) {
  44. return default_
  45. }
  46. return UrlUtils.getParameter(
  47. data['hydra:view']['hydra:' + pos],
  48. 'page',
  49. default_
  50. ) as number | undefined
  51. }
  52. // TODO: utile d'ajouter la page en cours?
  53. metadata.firstPage = extractPageNumber('first', 1)
  54. metadata.lastPage = extractPageNumber('last', 1)
  55. metadata.nextPage = extractPageNumber('next')
  56. metadata.previousPage = extractPageNumber('previous')
  57. }
  58. metadata.type = METADATA_TYPE.COLLECTION
  59. return metadata
  60. }
  61. }
  62. export default HydraDenormalizer