useAp2iRequestService.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 {useAppConfig, useRuntimeConfig} from "#app";
  6. import OhMyFetchConnector from "~/services/data/connector/ohMyFetchConnector";
  7. import ApiRequestService from "~/services/data/apiRequestService";
  8. import {AssociativeArray} from "~/services/data/data";
  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. /**
  18. * Peuple les headers avant l'envoi de la requête
  19. *
  20. * @param request
  21. * @param options
  22. */
  23. const onRequest = async function ({ request, options }: FetchContext) {
  24. // @ts-ignore
  25. if(options && options.noXaccessId) {
  26. return
  27. }
  28. const profileAccessStore = useProfileAccessStore()
  29. const headers: AssociativeArray = {
  30. 'x-accessid': String(profileAccessStore.id),
  31. 'Authorization': 'BEARER ' + profileAccessStore.bearer,
  32. }
  33. if (profileAccessStore.switchId) {
  34. headers['x-switch-user'] = String(profileAccessStore.switchId)
  35. }
  36. options.headers = { ...options.headers, ...headers }
  37. console.log('Request : ' + request + ' (SSR: ' + process.server + ')')
  38. }
  39. /**
  40. * Gère les erreurs retournées par l'api
  41. *
  42. * @param request
  43. * @param response
  44. * @param error
  45. */
  46. const onResponseError = async function ({ request, response, error }: FetchContext) {
  47. if (response && response.status === 401) {
  48. // navigateTo('/login')
  49. console.error('Unauthorized')
  50. }
  51. if (response && response.status === 403) {
  52. new PageStore().addAlerts(TYPE_ALERT.ALERT, ['forbidden'])
  53. console.error('forbidden')
  54. }
  55. if (response && response.status === 500) {
  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. const connector = new OhMyFetchConnector(fetcher)
  68. return new ApiRequestService(connector)
  69. }