import {useProfileAccessStore} from "~/store/profile/access"; import {FetchContext, FetchOptions} from "ohmyfetch"; import PageStore from "~/services/store/pageStoreHelper"; import {TYPE_ALERT} from "~/types/enums"; import {useAppConfig, useRuntimeConfig} from "#app"; import OhMyFetchConnector from "~/services/data/connector/ohMyFetchConnector"; import ApiRequestService from "~/services/data/apiRequestService"; import {AssociativeArray} from "~/services/data/data"; /** * Retourne une instance de ApiRequestService configurée pour interroger l'api Ap2i * * @see https://github.com/unjs/ohmyfetch/blob/main/README.md#%EF%B8%8F-create-fetch-with-default-options */ export const useAp2iRequestService = () => { const runtimeConfig = useRuntimeConfig() const baseURL = runtimeConfig.baseUrl ?? runtimeConfig.public.baseUrl /** * Peuple les headers avant l'envoi de la requête * * @param request * @param options */ const onRequest = async function ({ request, options }: FetchContext) { // @ts-ignore if(options && options.noXaccessId) { return } const profileAccessStore = useProfileAccessStore() const headers: AssociativeArray = { 'x-accessid': String(profileAccessStore.id), 'Authorization': 'BEARER ' + profileAccessStore.bearer, } if (profileAccessStore.switchId) { headers['x-switch-user'] = String(profileAccessStore.switchId) } options.headers = { ...options.headers, ...headers } console.log('Request : ' + request + ' (SSR: ' + process.server + ')') } /** * Gère les erreurs retournées par l'api * * @param request * @param response * @param error */ const onResponseError = async function ({ request, response, error }: FetchContext) { if (response && response.status === 401) { // navigateTo('/login') console.error('Unauthorized') } if (response && response.status === 403) { new PageStore().addAlerts(TYPE_ALERT.ALERT, ['forbidden']) console.error('forbidden') } if (response && response.status === 500) { new PageStore().addAlerts(TYPE_ALERT.ALERT, [error ? error.message : response.statusText]) console.error(error ? error.message : response.statusText) } } const config : FetchOptions = { baseURL, onRequest, onResponseError } // Utilise la fonction `create` de ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i const fetcher = $fetch.create(config) const connector = new OhMyFetchConnector(fetcher) return new ApiRequestService(connector) }