connection.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {NuxtAxiosInstance} from '@nuxtjs/axios'
  2. import {AxiosRequestConfig, AxiosResponse} from 'axios'
  3. import {AnyJson, DataPersisterArgs, DataProviderArgs, 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.id) {
  32. return Connection.getItem(url, args.id, args.showProgress, args.params)
  33. } else {
  34. return Connection.getCollection(url, args.type, args.showProgress, args.params)
  35. }
  36. case HTTP_METHOD.PUT:
  37. case HTTP_METHOD.POST:
  38. if (!TypesTesting.isDataPersisterArgs(args)) {
  39. throw new Error('*args* is not a dataPersisterArgs')
  40. }
  41. if (!args.data) {
  42. throw new Error('*args* has no data')
  43. }
  44. switch (method) {
  45. case HTTP_METHOD.PUT:
  46. return Connection.put(url, args.id, args.data, args.showProgress, args.params)
  47. case HTTP_METHOD.POST:
  48. return Connection.post(url, args.data, args.showProgress, args.params)
  49. }
  50. break;
  51. case HTTP_METHOD.DELETE:
  52. return Connection.deleteItem(url, args.id, args.showProgress, args.params)
  53. }
  54. throw new Error('Unknown connection method was invoked')
  55. }
  56. /**
  57. * GET Item : préparation de la config pour la récupération d'un item
  58. * @param {string} url
  59. * @param {number} id
  60. * @param {boolean} showProgress
  61. * @param {AnyJson} params
  62. * @return {Promise<any>}
  63. */
  64. public static getItem (url: string, id: number, showProgress: boolean = true, params: AnyJson = {}): Promise<any> {
  65. const config: AxiosRequestConfig = {
  66. url: `${url}/${id}`,
  67. method: HTTP_METHOD.GET,
  68. progress: showProgress,
  69. params: params
  70. }
  71. return Connection.request(config)
  72. }
  73. /**
  74. * Get collection : préparation de la config pour la récupération d'une collection d'items
  75. * @param {string} url
  76. * @param {boolean} progress
  77. * @param {QUERY_TYPE} type
  78. * @param {AnyJson} params
  79. * @return {Promise<any>}
  80. */
  81. public static getCollection (url: string, type: QUERY_TYPE, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  82. let config: AxiosRequestConfig = {
  83. url: `${url}`,
  84. method: HTTP_METHOD.GET,
  85. progress,
  86. params: params
  87. }
  88. if(type === QUERY_TYPE.IMAGE)
  89. config = {...config, responseType: 'blob'}
  90. return Connection.request(config)
  91. }
  92. /**
  93. * Post : préparation de la config pour la création d'un item
  94. * @param {string} url
  95. * @param {AnyJson} data
  96. * @param {boolean} progress
  97. * @param {AnyJson} params
  98. * @return {Promise<any>}
  99. */
  100. public static post(url: string, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  101. const config: AxiosRequestConfig = {
  102. url: `${url}`,
  103. method: HTTP_METHOD.POST,
  104. data,
  105. progress,
  106. params: params
  107. }
  108. return Connection.request(config)
  109. }
  110. /**
  111. * Put : préparation de la config pour la mise à jour d'un item
  112. * @param {string} url
  113. * @param {number} id
  114. * @param {AnyJson} data
  115. * @param {boolean} progress
  116. * @param {AnyJson} params
  117. * @return {Promise<any>}
  118. */
  119. public static put (url: string, id: number, data: AnyJson, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  120. const config: AxiosRequestConfig = {
  121. url: `${url}/${id}`,
  122. method: HTTP_METHOD.PUT,
  123. data,
  124. progress,
  125. params: params
  126. }
  127. return Connection.request(config)
  128. }
  129. /**
  130. * DELETE Item : préparation de la config pour la suppression d'un item
  131. * @param {string} url
  132. * @param {number} id
  133. * @param {boolean} progress
  134. * @param {AnyJson} params
  135. * @return {Promise<any>}
  136. */
  137. public static deleteItem (url: string, id: number, progress: boolean = true, params: AnyJson = {}): Promise<any> {
  138. const config: AxiosRequestConfig = {
  139. url: `${url}/${id}`,
  140. method: HTTP_METHOD.DELETE,
  141. progress,
  142. params: params
  143. }
  144. return Connection.request(config)
  145. }
  146. /**
  147. * Exécute la requete
  148. * @param {AxiosRequestConfig} config
  149. * @return {Promise<any>}
  150. */
  151. public static async request (config: AxiosRequestConfig): Promise<AxiosResponse> {
  152. return await Connection.connector.$request(config)
  153. }
  154. }
  155. export default Connection