import { AnyJson, DataPersisterArgs, DataProviderArgs } from '~/types/interfaces' import UrlBuilder from '~/services/connection/urlBuilder' import { DENORMALIZER_TYPE, HTTP_METHOD } from '~/types/enums' import Serializer from '~/services/serializer/serializer' import ApiError from '~/services/utils/apiError' import DataProvider from '~/services/dataProvider/dataProvider' import DataManager from '~/services/connection/dataManager' /** * Le DataPersisteer a pour rôle de mettre à jour les données via de l'API Opentalent */ class DataPersister extends DataManager { /** * Exécute la requête et retourne la réponse désérialisée * @param args */ public async invoke (args: DataPersisterArgs): Promise { try { await super.invoke(args) args.data = Serializer.normalize(args) const url = UrlBuilder.invoke(args) const response = await DataPersister.sendRequest(url, args.id ? HTTP_METHOD.PUT : HTTP_METHOD.POST, args) await this.provideResponse(response, args) } catch (error) { throw new ApiError(error.response.status, error.response.data.detail) } } /** * ? * @param response * @param args */ private async provideResponse (response: AnyJson, args: DataPersisterArgs) { const deserializedResponse = Serializer.denormalize(response, DENORMALIZER_TYPE.HYDRA) const dataProvider = new DataProvider() dataProvider.initCtx(this.ctx) const dataProviderArgs: DataProviderArgs = { type: args.type, url: args.url, enumType: args.enumType, model: args.model, rootModel: args.rootModel, id: args.id, rootId: args.rootId } return await dataProvider.provide(deserializedResponse, dataProviderArgs) } } export default DataPersister