Explorar o código

gestion des URLS et de leurs options

Vincent GUFFON %!s(int64=4) %!d(string=hai) anos
pai
achega
4314b3c821
Modificáronse 2 ficheiros con 80 adicións e 20 borrados
  1. 23 20
      services/connection/urlBuilder.ts
  2. 57 0
      services/connection/urlOptionsBuilder.ts

+ 23 - 20
services/connection/urlBuilder.ts

@@ -1,7 +1,9 @@
-import { Model } from '@vuex-orm/core'
-import {DataPersisterArgs, DataProviderArgs, ImageArgs, UrlArgs} from '~/types/interfaces'
-import { QUERY_TYPE } from '~/types/enums'
-import { repositoryHelper } from '~/services/store/repository'
+import {Model} from '@vuex-orm/core'
+import {ImageArgs, UrlArgs} from '~/types/interfaces'
+import {QUERY_TYPE} from '~/types/enums'
+import {repositoryHelper} from '~/services/store/repository'
+import TypesTesting from "~/services/utils/typesTesting";
+import UrlOptionsBuilder from "~/services/connection/urlOptionsBuilder";
 
 /**
  * Classe permettant de construire une URL pour l'interrogation d'une API externe
@@ -10,33 +12,42 @@ class UrlBuilder {
   static ROOT = '/api/'
 
   /**
-   * Main méthode qui appellera les méthode privées correspondantes (getDefaultUrl, getEnumUrl, getModelUrl)
+   * Main méthode qui appellera les méthode privées correspondantes (getDefaultUrl, getEnumUrl, getModelUrl, getImageUrl)
    * @param {UrlArgs} args
    * @return {string}
    */
   public static build (args: UrlArgs): string {
+    let url: string = ''
     switch (args.type) {
       case QUERY_TYPE.DEFAULT:
-        return UrlBuilder.getDefaultUrl(args.url)
+        url = UrlBuilder.getDefaultUrl(args.url)
+        break;
 
       case QUERY_TYPE.ENUM:
-        return UrlBuilder.getEnumUrl(args.enumType)
+        url = UrlBuilder.getEnumUrl(args.enumType)
+        break;
 
       case QUERY_TYPE.MODEL:
-        return UrlBuilder.getModelUrl(args.model, args.rootModel, args.rootId)
+        url = UrlBuilder.getModelUrl(args.model, args.rootModel, args.rootId)
+        break;
 
       case QUERY_TYPE.IMAGE:
-        if (!UrlBuilder.isDataProviderArgs(args)) {
+        if (!TypesTesting.isDataProviderArgs(args)) {
           throw new Error('*args* is not a dataProviderArgs')
         }
         if (!args.imgArgs) {
           throw new Error('*args* has no imgArgs')
         }
-        return UrlBuilder.getImageUrl(args.imgArgs, args.baseUrl)
+        url = UrlBuilder.getImageUrl(args.imgArgs, args.baseUrl)
+        break;
 
       default:
-        throw new Error('url, model or enum must be defined')
+        throw new Error('url, model, image or enum must be defined')
+        break;
     }
+
+    const options = UrlOptionsBuilder.build(args)
+    return options.length > 0 ? `${url}?${UrlOptionsBuilder.build(args).join('&')}` : url
   }
 
   /**
@@ -99,7 +110,7 @@ class UrlBuilder {
    * @return {string}
    */
   private static getImageUrl (imgArgs: ImageArgs, baseUrl: string = ''): string {
-    const downloadUrl = `files/${imgArgs.id}/download/${imgArgs.height}x${imgArgs.width}?${new Date().getTime()}`
+    const downloadUrl = `files/${imgArgs.id}/download/${imgArgs.height}x${imgArgs.width}`
     return UrlBuilder.concat(baseUrl, UrlBuilder.ROOT, downloadUrl)
   }
 
@@ -116,14 +127,6 @@ class UrlBuilder {
     })
     return url
   }
-
-  /**
-   * Test si l'argument est bien de type DataProviderArgs
-   * @param args
-   */
-  private static isDataProviderArgs (args: DataProviderArgs|DataPersisterArgs): args is DataProviderArgs {
-    return (args as DataProviderArgs).imgArgs !== undefined
-  }
 }
 
 export default UrlBuilder

+ 57 - 0
services/connection/urlOptionsBuilder.ts

@@ -0,0 +1,57 @@
+/**
+ * Classe permettant de construire les options d'une URL
+ */
+import TypesTesting from "~/services/utils/typesTesting";
+import {ListArgs, UrlArgs} from "~/types/interfaces";
+import {QUERY_TYPE} from "~/types/enums";
+
+class UrlOptionsBuilder {
+
+  /**
+   * Main méthode qui appellera les méthode privées correspondantes (getUrlOptionsImage, getUrlOptionsLists)
+   * @param {UrlArgs} args
+   * @return {string}
+   */
+  public static build(args: UrlArgs): Array<string> {
+    let options: Array<string> = []
+
+    if (args.type === QUERY_TYPE.IMAGE){
+      options = [...options, this.getUrlOptionsImage()]
+    }
+
+    if (TypesTesting.isDataProviderArgs(args) && args.listArgs !== undefined) {
+      options = [...options, ...this.getUrlOptionsLists(args.listArgs)]
+    }
+
+    return options
+  }
+
+  /**
+   * Une image doit toujours avoir le time en options pour éviter les problème de cache
+   * @private
+   */
+  private static getUrlOptionsImage(): string {
+    return new Date().getTime().toString()
+  }
+
+  /**
+   * Fonction renvoyant le tableau d'options d'une list
+   * @param listArgs
+   * @private
+   */
+  private static getUrlOptionsLists(listArgs: ListArgs): Array<string> {
+    const options: Array<string> = []
+
+    if (listArgs.itemsPerPage) {
+      options.push(`itemsPerPage=${listArgs.itemsPerPage}`)
+    }
+
+    if (listArgs.page) {
+      options.push(`page=${listArgs.page}`)
+    }
+
+    return options
+  }
+}
+
+export default UrlOptionsBuilder