connection.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import {NuxtAxiosInstance} from '@nuxtjs/axios'
  2. import {AxiosRequestConfig, AxiosResponse} from 'axios'
  3. import {AnyJson, DataPersisterArgs, DataProviderArgs, FileArgs, UrlArgs} from '~/types/interfaces'
  4. import {HTTP_METHOD, QUERY_TYPE} from '~/types/enums'
  5. import TypesTesting from "~/services/utils/typesTesting";
  6. /**
  7. * @category Services/connection
  8. * @class Connection
  9. *
  10. * Classe Wrapper du connecteur de requête (Axios dans notre cas)
  11. */
  12. class Connection {
  13. static connector: NuxtAxiosInstance;
  14. /**
  15. * Initialisation du connecteur (Axios dans notre cas)
  16. * @param {NuxtAxiosInstance} connector
  17. */
  18. static initConnector (connector: NuxtAxiosInstance) {
  19. Connection.connector = connector
  20. }
  21. /**
  22. * Main méthode qui appellera les méthodes privées correspondantes (getItem, getCollection, put, post, delete)
  23. * @param {HTTP_METHOD} method Mode de requêtage (GET, PUT, DELETE...)
  24. * @param {string} url
  25. * @param {DataProviderArgs|DataPersisterArgs} args
  26. * @return {Promise<any>}
  27. */
  28. public static invoke (method: HTTP_METHOD, url: string, args: UrlArgs): Promise<any> {
  29. switch (method) {
  30. case HTTP_METHOD.GET:
  31. if (args.type === QUERY_TYPE.FILE) {
  32. return Connection.download(url, args.showProgress, args.params)
  33. }
  34. if (args.id) {
  35. return Connection.getItem(url, args.id, args.showProgress, args.params)
  36. } else {
  37. return Connection.getCollection(url, args.type, args.showProgress, args.params)
  38. }
  39. case HTTP_METHOD.PUT:
  40. case HTTP_METHOD.POST:
  41. if (!TypesTesting.isDataPersisterArgs(args)) {
  42. throw new Error('*args* is not a dataPersisterArgs')
  43. }
  44. if (!args.data) {
  45. throw new Error('*args* has no data')
  46. }
  47. switch (method) {
  48. case HTTP_METHOD.PUT:
  49. return Connection.put(url, args.id, args.data, args.showProgress, args.params)
  50. case HTTP_METHOD.POST:
  51. return Connection.post(url, args.data, args.showProgress, args.params)
  52. }
  53. break;
  54. case HTTP_METHOD.DELETE:
  55. return Connection.deleteItem(url, args.id, args.showProgress, args.params)
  56. }
  57. throw new Error('Unknown connection method was invoked')
  58. }
  59. /**
  60. * GET Item : préparation de la config pour la récupération d'un item
  61. * @param {string} url
  62. * @param {number} id
  63. * @param {boolean} showProgress
  64. * @param {AnyJson} params
  65. * @return {Promise<any>}
  66. */
  67. public static getItem (url: string, id: number, showProgress: boolean = true, params: AnyJson = {}): Promise<any> {
  68. const config: AxiosRequestConfig = {
  69. url: `${url}/${id}`,
  70. method: HTTP_METHOD.GET,
  71. progress: showProgress,
  72. params: params
  73. }
  74. return Connection.request(config)
  75. }
  76. /**
  77. * Get collection : préparation de la config pour la récupération d'une collection d'items
  78. * @param {string} url
  79. * @param {boolean} progress
  80. * @param {QUERY_TYPE} type
  81. * @param {AnyJson} params
  82. * @return {Promise<any>}
  83. */
  84. public static getCollection (url: string, type: QUERY_TYPE, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  85. let config: AxiosRequestConfig = {
  86. url: `${url}`,
  87. method: HTTP_METHOD.GET,
  88. progress,
  89. params: params
  90. }
  91. if(type === QUERY_TYPE.IMAGE)
  92. config = {...config, responseType: 'blob'}
  93. return Connection.request(config)
  94. }
  95. /**
  96. * GET dédié au téléchargement de fichiers
  97. * @param url
  98. * @param {number} id
  99. * @param {boolean} showProgress
  100. * @param {AnyJson} params
  101. * @return {Promise<any>}
  102. */
  103. public static download (url: string, showProgress: boolean = true, params: AnyJson = {}): Promise<any> {
  104. const config: AxiosRequestConfig = {
  105. url: `${url}`,
  106. method: HTTP_METHOD.GET,
  107. progress: showProgress,
  108. responseType: 'blob',
  109. params: params
  110. }
  111. return Connection.request(config)
  112. }
  113. /**
  114. * Post : préparation de la config pour la création d'un item
  115. * @param {string} url
  116. * @param {AnyJson} data
  117. * @param {boolean} progress
  118. * @param {AnyJson} params
  119. * @return {Promise<any>}
  120. */
  121. public static post(url: string, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  122. const config: AxiosRequestConfig = {
  123. url: `${url}`,
  124. method: HTTP_METHOD.POST,
  125. data,
  126. progress,
  127. params: params
  128. }
  129. return Connection.request(config)
  130. }
  131. /**
  132. * Put : préparation de la config pour la mise à jour d'un item
  133. * @param {string} url
  134. * @param {number} id
  135. * @param {AnyJson} data
  136. * @param {boolean} progress
  137. * @param {AnyJson} params
  138. * @return {Promise<any>}
  139. */
  140. public static put (url: string, id: number, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  141. const config: AxiosRequestConfig = {
  142. url: `${url}/${id}`,
  143. method: HTTP_METHOD.PUT,
  144. data,
  145. progress,
  146. params: params
  147. }
  148. return Connection.request(config)
  149. }
  150. /**
  151. * DELETE Item : préparation de la config pour la suppression d'un item
  152. * @param {string} url
  153. * @param {number} id
  154. * @param {boolean} progress
  155. * @param {AnyJson} params
  156. * @return {Promise<any>}
  157. */
  158. public static deleteItem (url: string, id: number, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  159. const config: AxiosRequestConfig = {
  160. url: `${url}/${id}`,
  161. method: HTTP_METHOD.DELETE,
  162. progress,
  163. params: params
  164. }
  165. return Connection.request(config)
  166. }
  167. /**
  168. * Exécute la requete
  169. * @param {AxiosRequestConfig} config
  170. * @return {Promise<any>}
  171. */
  172. public static async request (config: AxiosRequestConfig): Promise<AxiosResponse> {
  173. return await Connection.connector.$request(config)
  174. }
  175. }
  176. export default Connection