import axios, { AxiosError } from 'axios'; import { GetProcessOptions, GetProcessesOptions, HttpEmddClient, HttpGetParams, HttpReader, Id, PaginationParams, } from '@digigov-oss/emdd-api-client'; import EmddProcessTransformer from './emdd-process-transformer'; import axiosRetry, { IAxiosRetryConfig } from 'axios-retry'; import { Cache } from './defs'; interface CacheConfig { cache: Cache; ttl: number; cacheKeyPrefix?: string; } const DEFAULT_RETRY_CONFIG: IAxiosRetryConfig = { retries: 4, retryDelay: (...arg) => axiosRetry.exponentialDelay(...arg, 300), retryCondition(error: AxiosError) { if (error.response) switch (error.response.status) { //retry only if status is 500 or 501 or 503 case 500: case 501: case 503: return true; default: return false; } return false; }, onRetry: (retryCount, error) => { console.log(`retry count: ${retryCount} ${error.response?.config.url}`); console.log(error.response?.config.params); }, }; const axiosReader: HttpReader = { get: async (url: string, config?: HttpGetParams) => { return axios.get(url, config).then((r) => { return r.data; }); }, }; class EkepHttpEmddClient { processTransformer: EmddProcessTransformer; private readonly client: HttpEmddClient; constructor(opts: { apiUrl?: string; apiKey?: string; maxRequestsPerSecond?: number; cacheConfig?: CacheConfig; axiosRetryConfig?: IAxiosRetryConfig; }) { this.client = new HttpEmddClient(axiosReader, { apiKey: opts.apiKey, apiUrl: opts.apiUrl, maxRequestsPerSecond: opts.maxRequestsPerSecond, }); this.processTransformer = new EmddProcessTransformer( this.client, opts.cacheConfig, ); axiosRetry(axios, opts?.axiosRetryConfig ?? DEFAULT_RETRY_CONFIG); } getProcess = async (id: Id, opts?: GetProcessOptions) => { return this.client .getProcess(id, opts) .then((r) => this.processTransformer.transformProcess(r)); }; getExtendedProcess = async (id: Id, opts?: GetProcessOptions) => { return this.client .getExtendedProcess(id, opts) .then((r) => this.processTransformer.transformExtendedProcess(r)); }; getUnits = (params?: PaginationParams) => this.client.getUnits(params); getOrganizations = (params?: PaginationParams) => this.client.getOrganizations(params); getRegistries = (params?: PaginationParams) => this.client.getRegistries(params); getEvidences = () => this.client.getEvidences(); getProcesses = (opts?: GetProcessesOptions) => this.client.getProcesses(opts); getProvisionOrgGroups = (params?: PaginationParams) => this.client.getProvisionOrgGroups(params); getUnit = (id: Id) => this.client.getUnit(id); getSdgCode = (id: Id) => this.client.getSdgCode(id); getNaceCode = (id: Id) => this.client.getNaceCode(id); getOrganization = (id: Id) => this.client.getOrganization(id); getRegistry = (id: Id) => this.client.getRegistry(id); getEvidence = (id: Id) => this.client.getEvidence(id); getProvisionOrgGroup = (id: Id) => this.client.getProvisionOrgGroup(id); } export default EkepHttpEmddClient;