import { AnyJson, DataProviderArgs } from '~/types/interfaces' import { DENORMALIZER_TYPE, HTTP_METHOD, QUERY_TYPE } from '~/types/enums' import { processors } from '~/services/data/processor/_import' import UrlBuilder from '~/services/connection/urlBuilder' import Serializer from '~/services/serializer/serializer' import BaseDataManager from '~/services/data/baseDataManager' import { hooksProvider } from '~/services/data/hooks/hookProvider/_import' /** * Le DataProvider a pour rôle de fournir des données issues de l'API Opentalent * * Pour cela, le DataProvider envoie une requête GET, récupérer la réponse de l'API, * puis la désérialiser. * Enfin, il va itérer sur les différents Processor disponibles, jusqu'à trouver * un processeur adapté à la requête. Ce processeur va mettre en forme la réponse qui est enfin * retournée par le DataProvider. */ class DataProvider extends BaseDataManager { protected progress: boolean = false protected arguments!: DataProviderArgs protected hooks = hooksProvider; protected defaultArguments: object = { type: QUERY_TYPE.MODEL, showProgress: false } /** * Exécute la requête et retourne la réponse désérialisée */ protected async _invoke (): Promise { const url = UrlBuilder.build(this.arguments) const response = await DataProvider.request(url, HTTP_METHOD.GET, this.arguments) const data = await Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA) return await this.process(data, this.arguments) } public async process (data: AnyJson, args: DataProviderArgs) { const postProcessor = this.getProcessor(args) return await postProcessor.process(data) } /** * Iterate over the available providers and invoke * the first one that support the given args * @param args */ private getProcessor (args: DataProviderArgs): any { for (const processor of processors) { if (processor.support(args)) { // eslint-disable-next-line new-cap return new processor(this.ctx, args) } } } } export default DataProvider