connection.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {NuxtAxiosInstance} from '@nuxtjs/axios'
  2. import {AxiosRequestConfig} from 'axios'
  3. import {AnyJson, DataPersisterArgs, DataProviderArgs, UrlArgs} from '~/types/interfaces'
  4. import {HTTP_METHOD, QUERY_TYPE} from '~/types/enums'
  5. /**
  6. * @category Services/connection
  7. * @class Connection
  8. *
  9. * Classe Wrapper du connecteur de requête (Axios dans notre cas)
  10. */
  11. class Connection {
  12. static connector: NuxtAxiosInstance;
  13. /**
  14. * Initialisation du connecteur (Axios dans notre cas)
  15. * @param {NuxtAxiosInstance} connector
  16. */
  17. static initConnector (connector: NuxtAxiosInstance) {
  18. Connection.connector = connector
  19. }
  20. /**
  21. * Main méthode qui appellera les méthodes privées correspondantes (getItem, getCollection, put, post, delete)
  22. * @param {HTTP_METHOD} method Mode de requêtage (GET, PUT, DELETE...)
  23. * @param {string} url
  24. * @param {DataProviderArgs|DataPersisterArgs} args
  25. * @return {Promise<any>}
  26. */
  27. public static invoke (method: HTTP_METHOD, url: string, args: UrlArgs): Promise<any> {
  28. switch (method) {
  29. case HTTP_METHOD.GET:
  30. if (args.id) {
  31. return Connection.getItem(url, args.id, args.showProgress)
  32. } else {
  33. return Connection.getCollection(url, args.showProgress, args.type)
  34. }
  35. case HTTP_METHOD.PUT:
  36. if (!Connection.isDataPersisterArgs(args)) {
  37. throw new Error('*args* is not a dataPersisterArgs')
  38. }
  39. if (!args.data) {
  40. throw new Error('*args* has no data')
  41. }
  42. return Connection.put(url, args.id, args.data, args.showProgress)
  43. case HTTP_METHOD.DELETE:
  44. return Connection.deleteItem(url, args.id, args.showProgress)
  45. }
  46. throw new Error('Unknown connection method was invoked')
  47. }
  48. /**
  49. * GET Item : préparation de la config pour la récupération d'un item
  50. * @param {string} url
  51. * @param {number} id
  52. * @param {boolean} showProgress
  53. * @return {Promise<any>}
  54. */
  55. public static getItem (url: string, id: number, showProgress: boolean = true): Promise<any> {
  56. const config: AxiosRequestConfig = {
  57. url: `${url}/${id}`,
  58. method: HTTP_METHOD.GET,
  59. progress: showProgress
  60. }
  61. return Connection.request(config)
  62. }
  63. /**
  64. * Get collection : préparation de la config pour la récupération d'une collection d'items
  65. * @param {string} url
  66. * @param {boolean} progress
  67. * @param {QUERY_TYPE} type
  68. * @return {Promise<any>}
  69. */
  70. public static getCollection (url: string, progress: boolean = true, type: QUERY_TYPE): Promise<any> {
  71. let config: AxiosRequestConfig = {
  72. url: `${url}`,
  73. method: HTTP_METHOD.GET,
  74. progress
  75. }
  76. if(type === QUERY_TYPE.IMAGE)
  77. config = {...config, responseType: 'blob'}
  78. return Connection.request(config)
  79. }
  80. /**
  81. * Put : préparation de la config pour la mise à jour d'un item
  82. * @param {string} url
  83. * @param {number} id
  84. * @param {AnyJson} data
  85. * @param {boolean} progress
  86. * @return {Promise<any>}
  87. */
  88. public static put (url: string, id: number, data: AnyJson, progress: boolean = true): Promise<any> {
  89. const config: AxiosRequestConfig = {
  90. url: `${url}/${id}`,
  91. method: HTTP_METHOD.PUT,
  92. data,
  93. progress
  94. }
  95. return Connection.request(config)
  96. }
  97. /**
  98. * DELETE Item : préparation de la config pour la suppression d'un item
  99. * @param {string} url
  100. * @param {number} id
  101. * @param {boolean} progress
  102. * @return {Promise<any>}
  103. */
  104. public static deleteItem (url: string, id: number, progress: boolean = true): Promise<any> {
  105. const config: AxiosRequestConfig = {
  106. url: `${url}/${id}`,
  107. method: HTTP_METHOD.DELETE,
  108. progress
  109. }
  110. return Connection.request(config)
  111. }
  112. /**
  113. * Exécute la requete
  114. * @param {AxiosRequestConfig} config
  115. * @return {Promise<any>}
  116. */
  117. public static async request (config: AxiosRequestConfig): Promise<any> {
  118. return await Connection.connector.$request(config)
  119. }
  120. /**
  121. * Test si l'argument est bien de type DataPersister
  122. * @param args
  123. */
  124. private static isDataPersisterArgs (args: DataProviderArgs|DataPersisterArgs): args is DataPersisterArgs {
  125. return (args as DataPersisterArgs).data !== undefined
  126. }
  127. }
  128. export default Connection