|
|
@@ -1,64 +1,62 @@
|
|
|
import {AnyJson} from "~/types/types";
|
|
|
|
|
|
-export default class HydraParser {
|
|
|
- constructor() {
|
|
|
- }
|
|
|
-
|
|
|
- parse(response: AnyJson): AnyJson {
|
|
|
- if (response['hydra:member']) {
|
|
|
- response.totalCount = response['hydra:totalItems'];
|
|
|
- return this.parseCollection(response);
|
|
|
+/**
|
|
|
+ * @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(response);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- populateId(data: AnyJson) {
|
|
|
- if (data['@id'] && data['@id'] instanceof String) {
|
|
|
- var iriParts = data['@id'].split('/');
|
|
|
- data.id = iriParts[iriParts.length - 1];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- populateAllData(data: AnyJson):void {
|
|
|
- this.populateId(data);
|
|
|
- for (const key in data) {
|
|
|
- const value = data[key];
|
|
|
- if (value instanceof Object) {
|
|
|
- this.populateAllData(value);
|
|
|
- }
|
|
|
+ return this.parseItem(hydraData);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- parseItem(data: AnyJson): AnyJson {
|
|
|
- this.populateId(data);
|
|
|
+ /**
|
|
|
+ * Méthode de parsing appelé si on est dans un GET
|
|
|
+ * @param {AnyJson} hydraData
|
|
|
+ */
|
|
|
+ parseItem(hydraData: AnyJson): AnyJson {
|
|
|
+ this.populateId(hydraData);
|
|
|
|
|
|
- if (data['hydra:previous']) {
|
|
|
- let iriParts = data['hydra:previous'].split('/');
|
|
|
- data.previous = iriParts[iriParts.length - 1];
|
|
|
+ if (hydraData['hydra:previous']) {
|
|
|
+ let iriParts = hydraData['hydra:previous'].split('/');
|
|
|
+ hydraData.previous = iriParts[iriParts.length - 1];
|
|
|
}
|
|
|
- if (data['hydra:next']) {
|
|
|
- let iriParts = data['hydra:next'].split('/');
|
|
|
- data.next = iriParts[iriParts.length - 1];
|
|
|
+ if (hydraData['hydra:next']) {
|
|
|
+ let iriParts = hydraData['hydra:next'].split('/');
|
|
|
+ hydraData.next = iriParts[iriParts.length - 1];
|
|
|
}
|
|
|
- if (data['hydra:totalItems']) {
|
|
|
- data.totalItems = data['hydra:totalItems'];
|
|
|
+ if (hydraData['hydra:totalItems']) {
|
|
|
+ hydraData.totalItems = hydraData['hydra:totalItems'];
|
|
|
}
|
|
|
- if (data['hydra:itemPosition']) {
|
|
|
- data.itemPosition = data['hydra:itemPosition'];
|
|
|
+ if (hydraData['hydra:itemPosition']) {
|
|
|
+ hydraData.itemPosition = hydraData['hydra:itemPosition'];
|
|
|
}
|
|
|
- return data;
|
|
|
+ return hydraData;
|
|
|
}
|
|
|
|
|
|
- parseCollection(data: AnyJson): AnyJson {
|
|
|
- let collectionResponse = data['hydra:member'];
|
|
|
+ /**
|
|
|
+ * 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 data) {
|
|
|
- const value = data[key];
|
|
|
+ for (const key in hydraData) {
|
|
|
+ const value = hydraData[key];
|
|
|
if ('hydra:member' !== key) {
|
|
|
collectionResponse.metadata[key] = value;
|
|
|
}
|
|
|
@@ -70,8 +68,8 @@ export default class HydraParser {
|
|
|
this.populateAllData(value);
|
|
|
}
|
|
|
|
|
|
- if ('undefined' !== typeof (data['hydra:search'])) {
|
|
|
- let collectionSearch = data['hydra:search']['hydra:mapping'];
|
|
|
+ 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) {
|
|
|
@@ -83,4 +81,32 @@ export default class HydraParser {
|
|
|
}
|
|
|
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()
|