| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import {AnyJson} from "~/types/types";
- /**
- * @category Services/utils
- * @class HydraParser
- * Classe permettant d'assurer le parsing d'une réponse Hydra
- */
- class HydraParser {
- /**
- * Parcours une réponse Hydra pour retourner son équivalent en Json
- * @param {AnyJson} hydraData
- * @return {AnyJson} réponse parsée
- */
- parse(hydraData: AnyJson): AnyJson {
- if (hydraData['hydra:member']) {
- hydraData.totalCount = hydraData['hydra:totalItems'];
- return this.parseCollection(hydraData);
- } else {
- return this.parseItem(hydraData);
- }
- }
- /**
- * Méthode de parsing appelé si on est dans un GET
- * @param {AnyJson} hydraData
- */
- parseItem(hydraData: AnyJson): AnyJson {
- this.populateId(hydraData);
- if (hydraData['hydra:previous']) {
- let iriParts = hydraData['hydra:previous'].split('/');
- hydraData.previous = iriParts[iriParts.length - 1];
- }
- if (hydraData['hydra:next']) {
- let iriParts = hydraData['hydra:next'].split('/');
- hydraData.next = iriParts[iriParts.length - 1];
- }
- if (hydraData['hydra:totalItems']) {
- hydraData.totalItems = hydraData['hydra:totalItems'];
- }
- if (hydraData['hydra:itemPosition']) {
- hydraData.itemPosition = hydraData['hydra:itemPosition'];
- }
- return hydraData;
- }
- /**
- * Méthode de parsing appelé si on est dans un GET Collection
- * @param {AnyJson} hydraData
- */
- parseCollection(hydraData: AnyJson): AnyJson {
- let collectionResponse = hydraData['hydra:member'];
- collectionResponse.metadata = {};
- collectionResponse.order = {};
- collectionResponse.search = {};
- // Put metadata in a property of the collection
- for (const key in hydraData) {
- const value = hydraData[key];
- if ('hydra:member' !== key) {
- collectionResponse.metadata[key] = value;
- }
- }
- // Populate href property for all elements of the collection
- for (const key in collectionResponse) {
- const value = collectionResponse[key];
- this.populateAllData(value);
- }
- if ('undefined' !== typeof (hydraData['hydra:search'])) {
- let collectionSearch = hydraData['hydra:search']['hydra:mapping'];
- for (const key in collectionSearch) {
- const value = collectionSearch[key];
- if (value['variable'].indexOf("filter[order]") === 0) {
- collectionResponse.order[value['property']] = value;
- } else if (value['variable'].indexOf("filter[where]") === 0) {
- collectionResponse.search[value['property']] = value;
- }
- }
- }
- return collectionResponse;
- }
- /**
- * Hydrate l'objet Json avec la valeur id correspondant à l'uri de l'objet
- * @param {AnyJson} data
- */
- populateId(data: AnyJson): void{
- if (data['@id'] && data['@id'] instanceof String) {
- var iriParts = data['@id'].split('/');
- data.id = iriParts[iriParts.length - 1];
- }
- }
- /**
- * Hydrate l'objet JSON de façon récursive (afin de gérer les objet nested)
- * @param {AnyJson} data
- */
- populateAllData(data: AnyJson):void {
- this.populateId(data);
- for (const key in data) {
- const value = data[key];
- if (value instanceof Object) {
- this.populateAllData(value);
- }
- }
- }
- }
- export const $hydraParser = new HydraParser()
|