useAp2iRequestService.ts 3.2 KB

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