connection.ts 3.8 KB

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