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()