useAp2iRequestService.ts 2.6 KB

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