import { AnyJson, DataProviderArgs } from '~/types/interfaces' import { DENORMALIZER_TYPE, HTTP_METHOD, QUERY_TYPE } from '~/types/enums' import { providers } from '~/services/dataProvider/provider/_import' import UrlBuilder from '~/services/connection/urlBuilder' import Serializer from '~/services/serializer/serializer' import ApiError from '~/services/utils/apiError' import DataManager from '~/services/connection/dataManager' /** * Le DataProvider a pour rôle de fournir des données issues de l'API Opentalent */ class DataProvider extends DataManager { protected progress: boolean = false protected defaultArguments: object = { type: QUERY_TYPE.MODEL, showProgress: false } /** * Exécute la requête et retourne la réponse désérialisée * @param args */ public async invoke (args: DataProviderArgs): Promise { try { await super.invoke(args) const url = UrlBuilder.invoke(args) const response = await DataProvider.sendRequest(url, HTTP_METHOD.GET, args) const deserializeResponse = await Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA) return await this.provide(deserializeResponse, args) } catch (error) { throw new ApiError(500, error) } } /** * Iterate over the available providers and invoke * the first one that support the given args * @param data * @param args */ public provide (data: AnyJson, args: DataProviderArgs): any { for (const Provider of providers) { if (Provider.support(args)) { return new Provider(this.ctx, args).invoke(data) } } } } export default DataProvider