Sfoglia il codice sorgente

move data.d.ts into ~/types

Olivier Massot 3 anni fa
parent
commit
6592e9c0b0

+ 2 - 2
services/data/apiRequestService.ts

@@ -1,10 +1,10 @@
-import {AssociativeArray, Connector, HTTP_METHOD} from "./data.d";
-
 /**
  * A basic api request service
  *
  * It will send basic http requests and returns raw results
  */
+import {AssociativeArray, Connector, HTTP_METHOD} from "~/types/data.d";
+
 class ApiRequestService {
     private connector: Connector;
 

+ 1 - 1
services/data/connector/ohMyFetchConnector.ts

@@ -1,6 +1,6 @@
-import {AssociativeArray, Connector, HTTP_METHOD} from "../data.d";
 import {$Fetch} from "nitropack";
 import {FetchOptions} from "ohmyfetch";
+import {AssociativeArray, Connector, HTTP_METHOD} from "~/types/data.d";
 
 /**
  * Connector for the ohmyfetch library

+ 0 - 20
services/data/data.d.ts

@@ -1,20 +0,0 @@
-export const enum HTTP_METHOD {
-    POST = 'POST',
-    PUT = 'PUT',
-    GET = 'GET',
-    DELETE = 'DELETE'
-}
-
-interface AssociativeArray {
-    [key: string]: any;
-}
-
-interface Connector {
-    request(
-        method: HTTP_METHOD,
-        url: string,
-        body: null | any,
-        params: null | AssociativeArray,
-        query: null | AssociativeArray
-    )
-}

+ 1 - 1
services/data/entityManager.ts

@@ -1,5 +1,4 @@
 import ApiRequestService from "./apiRequestService";
-import {AssociativeArray} from "./data";
 import {Repository, useRepo} from "pinia-orm";
 import UrlBuilder from "~/services/utils/urlBuilder";
 import ModelNormalizer from "./serializer/normalizer/modelNormalizer";
@@ -9,6 +8,7 @@ import {useProfileAccessStore} from "~/store/profile/access";
 import ApiResource from "~/models/ApiResource";
 import {MyProfile} from "~/models/Access/MyProfile";
 import { v4 as uuid4 } from 'uuid';
+import {AssociativeArray} from "~/types/data.d";
 
 /**
  * Entity manager: make operations on the models defined with the Pinia-Orm library

+ 1 - 1
services/data/enumManager.ts

@@ -1,7 +1,7 @@
 import ApiRequestService from "./apiRequestService";
 import UrlBuilder from "~/services/utils/urlBuilder";
 import HydraDenormalizer from "~/services/data/serializer/denormalizer/hydraDenormalizer";
-import {AssociativeArray} from "~/services/data/data";
+import {AssociativeArray} from "~/types/data.d";
 
 class EnumManager {
     private apiRequestService: ApiRequestService;

+ 57 - 39
services/data/serializer/denormalizer/hydraDenormalizer.ts

@@ -1,58 +1,34 @@
-import {AnyJson, ApiResponse, HydraMetadata} from '~/types/interfaces'
-import {METADATA_TYPE} from '~/types/enums'
+import {AnyJson, ApiResponse, HydraMetadata, METADATA_TYPE} from "~/types/data.d";
 
 /**
- * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
+ * Classe permettant d'assurer la dé-normalization d'un objet Hydra en JSON
  */
 class HydraDenormalizer {
   /**
-   * Parcourt une réponse Hydra pour retourner son équivalent en Json
+   * Parse une réponse Hydra pour retourner son équivalent en Json
    *
    * @param {AnyJson} data
    * @return {AnyJson} réponse parsée
    */
-  public static denormalize (data: AnyJson): AnyJson {
+  public static denormalize (data: AnyJson): ApiResponse {
     if (data['hydra:member']) {
-      data.totalCount = data['hydra:totalItems']
       return HydraDenormalizer.parseCollection(data)
-    } else {
-      return HydraDenormalizer.parseItem(data)
     }
+
+    return HydraDenormalizer.parseItem(data)
   }
 
+  /**
+   * Parse une réponse Hydra contenant un item
+   *
+   * @param hydraData
+   * @private
+   */
   private static parseItem (hydraData: AnyJson): ApiResponse {
     return {
       data: hydraData,
       metadata: HydraDenormalizer.definedMetadataForItem(hydraData)
     }
-  }
-    /**
-   * Méthode de parsing appelé si on est dans un GET
-   *
-   * @param {AnyJson} hydraData
-   */
-  private static definedMetadataForItem (hydraData: AnyJson): AnyJson {
-    const metadata:HydraMetadata = {}
-
-    // if (hydraData['hydra:previous']) {
-    //   const iriParts = hydraData['hydra:previous'].split('/')
-    //   hydraData.previous = iriParts[iriParts.length - 1]
-    // }
-    // if (hydraData['hydra:next']) {
-    //   const 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']
-    // }
-
-    metadata.type = METADATA_TYPE.ITEM
-
-    return metadata
-
   }
 
   /**
@@ -91,6 +67,41 @@ class HydraDenormalizer {
     return collectionResponse
   }
 
+  /**
+   * Génère les metadonnées d'un item
+   *
+   * @param {AnyJson} hydraData
+   */
+  private static definedMetadataForItem (hydraData: AnyJson): AnyJson {
+    const metadata: HydraMetadata = {}
+
+    // if (hydraData['hydra:previous']) {
+    //   const iriParts = hydraData['hydra:previous'].split('/')
+    //   hydraData.previous = iriParts[iriParts.length - 1]
+    // }
+    // if (hydraData['hydra:next']) {
+    //   const 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']
+    // }
+
+    metadata.type = METADATA_TYPE.ITEM
+
+    return metadata
+
+  }
+
+  /**
+   * Génère les métadonnées d'une collection
+   *
+   * @param data
+   * @private
+   */
   private static  definedMetadataForCollection(data:AnyJson){
     const metadata:HydraMetadata = {
       totalItems: data['hydra:totalItems']
@@ -108,10 +119,17 @@ class HydraDenormalizer {
     return metadata
   }
 
-  private static  getPageNumber(uri:string):number {
+  /**
+   * Parse an URI to retrieve the page number
+   *
+   * @param uri
+   * @private
+   */
+  private static getPageNumber(uri:string):number {
     if(uri){
-      const number = uri.split('page=').pop()
-      return number ? parseInt(number) : 0
+      const urlParams = new URLSearchParams(uri);
+      const page = urlParams.get('page');
+      return page ? parseInt(page) : 0
     }
     return 0
   }

+ 1 - 0
services/utils/urlBuilder.ts

@@ -84,6 +84,7 @@ class UrlBuilder {
 
   /**
    * Fonction renvoyant le tableau d'options d'une list
+   *
    * @param listArgs
    * @private
    */

+ 2 - 1
tsconfig.json

@@ -16,7 +16,8 @@
     "typeRoots": [
       "./types/types.d.ts",
       "./types/interfaces.d.ts",
-      "./types/enums.d.ts"
+      "./types/enums.d.ts",
+      "./types/data.d.ts",
     ]
   }
 }

+ 49 - 0
types/data.d.ts

@@ -0,0 +1,49 @@
+
+type AnyJson = Record<string, any>
+
+export const enum HTTP_METHOD {
+    POST = 'POST',
+    PUT = 'PUT',
+    GET = 'GET',
+    DELETE = 'DELETE'
+}
+
+interface AssociativeArray {
+    [key: string]: any;
+}
+
+interface Connector {
+    request(
+        method: HTTP_METHOD,
+        url: string,
+        body: null | any,
+        params: null | AssociativeArray,
+        query: null | AssociativeArray
+    )
+}
+
+export const enum METADATA_TYPE {
+    ITEM,
+    COLLECTION
+}
+
+interface HydraMetadata {
+    readonly totalItems?: number
+    firstPage?: number
+    lastPage?: number
+    nextPage?: number
+    previousPage?: number
+    type?: METADATA_TYPE
+}
+
+interface ApiResponse {
+    data: AnyJson
+    metadata: HydraMetadata
+}
+
+interface ApiCollection extends ApiResponse {
+    data: AnyJson
+    metadata: HydraMetadata
+}
+
+

+ 0 - 11
types/enums.ts

@@ -2,12 +2,6 @@ export const enum FORM_STATUS {
   CREATE = 'CREATE',
   EDIT = 'EDIT'
 }
-export const enum HTTP_METHOD {
-  POST = 'POST',
-  PUT = 'PUT',
-  GET = 'GET',
-  DELETE = 'DELETE'
-}
 
 export const enum DENORMALIZER_TYPE {
   HYDRA,
@@ -39,11 +33,6 @@ export const enum GENDER {
   MISS = 'MISS'
 }
 
-export const enum METADATA_TYPE {
-  ITEM,
-  COLLECTION
-}
-
 export const enum NOTIFICATION_TYPE {
   MESSAGE= 'MESSAGE',
   FILE= 'FILE',

+ 0 - 15
types/interfaces.d.ts

@@ -163,7 +163,6 @@ interface organizationState extends baseOrganizationState {
   parents: Array<baseOrganizationState>
 }
 
-type AnyJson = Record<string, any>
 type AnyStore = Store<any>
 
 interface EnumChoice {
@@ -292,20 +291,6 @@ interface MobytUserStatus {
   money: number
 }
 
-interface HydraMetadata {
-  readonly totalItems?: number
-  firstPage?: number
-  lastPage?: number
-  nextPage?: number
-  previousPage?: number
-  type?: METADATA_TYPE
-}
-
-interface ApiResponse {
-  data: AnyJson
-  metadata: HydraMetadata
-}
-
 interface MercureEntityUpdate {
   iri: string
   operation: 'create' | 'delete' | 'update'