import {AnyJson, DataProviderArgs, DataProviders} from "~/types/interfaces"; import {DENORMALIZER_TYPE, HTTP_METHOD} from "~/types/enums"; import {providers} from "~/services/dataProvider/provider/_import"; import ConstructUrl from "~/services/connection/constructUrl"; import Connection from "~/services/connection/connection"; import Serializer from "~/services/serializer/serializer"; import {Context} from "@nuxt/types/app"; import ApiError from "~/services/utils/apiError"; class DataProvider{ private ctx !: Context; private arguments!: DataProviderArgs; constructor() { } setArguments(args: DataProviderArgs){ this.arguments = args } initCtx(ctx:Context){ Connection.initConnector(ctx.$axios) this.ctx = ctx } async invoke(args:DataProviderArgs): Promise{ this.setArguments(args) try{ const url = this.constructUrl() const response = await this.connection(url) const deserializeResponse = await this.deserialization(response) return await this.provide(deserializeResponse) }catch(error){ throw new ApiError(500, error) } } constructUrl(): string{ const constructUrl = new ConstructUrl(); return constructUrl.invoke(this.arguments) } connection(url: string): Promise{ const connection = new Connection() return connection.invoke(HTTP_METHOD.GET, url, this.arguments) } provide(data: AnyJson): any{ for(const provider of providers){ if(provider.support(this.arguments)){ return new provider(this.ctx, this.arguments).invoke(data); } } } deserialization(data: AnyJson): AnyJson{ const serializer = new Serializer() return serializer.denormalize(data, DENORMALIZER_TYPE.HYDRA) } } export default DataProvider