hydraDenormalizer.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. * Normalisation et dé-normalisation ddu format de données Hydra
  6. */
  7. class HydraDenormalizer {
  8. /**
  9. * Parse une réponse Hydra et retourne un objet ApiResponse
  10. *
  11. * @param {AnyJson} data
  12. * @return {AnyJson} réponse parsée
  13. */
  14. public static denormalize(data: AnyJson): ApiResponse {
  15. return {
  16. data: HydraDenormalizer.getData(data),
  17. metadata: HydraDenormalizer.getMetadata(data)
  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