|
|
@@ -1,16 +1,22 @@
|
|
|
import { AnyJson, DataProviderArgs } from '~/types/interfaces'
|
|
|
import { DENORMALIZER_TYPE, HTTP_METHOD, QUERY_TYPE } from '~/types/enums'
|
|
|
-import { providers } from '~/services/dataProvider/provider/_import'
|
|
|
+import { processors } from '~/services/dataProvider/processor/_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
|
|
|
+ *
|
|
|
+ * 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 DataManager {
|
|
|
protected progress: boolean = false
|
|
|
+ protected arguments!: DataProviderArgs
|
|
|
protected defaultArguments: object = {
|
|
|
type: QUERY_TYPE.MODEL,
|
|
|
showProgress: false
|
|
|
@@ -18,34 +24,30 @@ class DataProvider extends DataManager {
|
|
|
|
|
|
/**
|
|
|
* Exécute la requête et retourne la réponse désérialisée
|
|
|
- * @param args
|
|
|
*/
|
|
|
- public async invoke (args: DataProviderArgs): Promise<any> {
|
|
|
- try {
|
|
|
- await super.invoke(args)
|
|
|
-
|
|
|
- const url = UrlBuilder.invoke(args)
|
|
|
-
|
|
|
- const response = await DataProvider.sendRequest(url, HTTP_METHOD.GET, args)
|
|
|
+ protected async _invoke (): Promise<any> {
|
|
|
+ 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)
|
|
|
|
|
|
- const deserializeResponse = await Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA)
|
|
|
+ return await this.process(data, this.arguments)
|
|
|
+ }
|
|
|
|
|
|
- return await this.provide(deserializeResponse, args)
|
|
|
- } catch (error) {
|
|
|
- throw new ApiError(500, error)
|
|
|
- }
|
|
|
+ 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 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)
|
|
|
+ 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)
|
|
|
}
|
|
|
}
|
|
|
}
|