useAp2iRequestService.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import {FetchContext, FetchOptions} from "ohmyfetch";
  2. import {TYPE_ALERT} from "~/types/enum/enums";
  3. import {useRuntimeConfig} from "#app";
  4. import ApiRequestService from "~/services/data/apiRequestService";
  5. import {Ref} from "@vue/reactivity";
  6. import {usePageStore} from "~/stores/page";
  7. import UnauthorizedError from "~/services/error/UnauthorizedError";
  8. import {useAccessProfileStore} from "~/stores/accessProfile";
  9. import {AssociativeArray} from "~/types/data";
  10. /**
  11. * Retourne une instance de ApiRequestService configurée pour interroger l'api Ap2i
  12. *
  13. * @see https://github.com/unjs/ohmyfetch/blob/main/README.md#%EF%B8%8F-create-fetch-with-default-options
  14. */
  15. let apiRequestServiceClass:null|ApiRequestService = null
  16. export const useAp2iRequestService = () => {
  17. const runtimeConfig = useRuntimeConfig()
  18. const baseURL = runtimeConfig.baseUrl ?? runtimeConfig.public.baseUrl
  19. const pending: Ref<boolean> = ref(false)
  20. /**
  21. * Peuple les headers avant l'envoi de la requête
  22. *
  23. * @param request
  24. * @param options
  25. */
  26. const onRequest = async function ({ request, options }: FetchContext) {
  27. // @ts-ignore
  28. if(options && options.noXaccessId) {
  29. return
  30. }
  31. const accessProfileStore = useAccessProfileStore()
  32. const headers: AssociativeArray = {
  33. 'x-accessid': String(accessProfileStore.id),
  34. 'Authorization': 'BEARER ' + accessProfileStore.bearer,
  35. }
  36. if (accessProfileStore.switchId) {
  37. headers['x-switch-user'] = String(accessProfileStore.switchId)
  38. }
  39. options.headers = { ...options.headers, ...headers }
  40. pending.value = true
  41. console.log('Request : ' + request + ' (SSR: ' + process.server + ')')
  42. }
  43. const onRequestError = async function({ request, options, response }: FetchContext) {
  44. pending.value = false
  45. }
  46. /**
  47. * Server responded
  48. *
  49. * @param request
  50. * @param options
  51. * @param response
  52. */
  53. const onResponse = async function({ request, options, response }: FetchContext) {
  54. pending.value = false
  55. }
  56. /**
  57. * Gère les erreurs retournées par l'api
  58. *
  59. * @param request
  60. * @param response
  61. * @param error
  62. */
  63. const onResponseError = async function ({ request, response, error }: FetchContext) {
  64. pending.value = false
  65. if (response && response.status === 401) {
  66. throw new UnauthorizedError('Ap2i - Unauthorized')
  67. }
  68. else if (response && response.status === 403) {
  69. usePageStore().addAlert(TYPE_ALERT.ALERT, ['forbidden'])
  70. console.error('Forbidden')
  71. }
  72. else if (response && response.status >= 404) {
  73. // @see https://developer.mozilla.org/fr/docs/Web/HTTP/Status
  74. usePageStore().addAlert(TYPE_ALERT.ALERT, [error ? error.message : response.statusText])
  75. // console.error(error ?? response)
  76. }
  77. }
  78. const config : FetchOptions = {
  79. baseURL,
  80. onRequest,
  81. onRequestError,
  82. onResponse,
  83. onResponseError
  84. }
  85. //Avoid memory leak
  86. if (apiRequestServiceClass === null) {
  87. // Utilise la fonction `create` d'ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i
  88. const fetcher = $fetch.create(config)
  89. // @ts-ignore
  90. apiRequestServiceClass = new ApiRequestService(fetcher)
  91. }
  92. return { apiRequestService: apiRequestServiceClass, pending: pending }
  93. }