import { request } from 'umi'; interface ActionParams { resourceKey?: string | number; // resourceName?: string; // associatedName?: string; associatedKey?: string | number; fields?: any; filter?: any; values?: any; page?: any; perPage?: any; [key: string]: any; } interface Resource { get: (params?: ActionParams) => Promise; list: (params?: ActionParams) => Promise; create: (params?: ActionParams) => Promise; update: (params?: ActionParams) => Promise; destroy: (params?: ActionParams) => Promise; [name: string]: (params?: ActionParams) => Promise; } class ApiClient { resource(name: string): Resource { const proxy: any = new Proxy({}, { get(target, method, receiver) { return (params: ActionParams = {}) => { const { associatedKey, resourceKey, ...restParams } = params; let url = `/${name}`; let options: any = {}; if (['list', 'get'].indexOf(method as string) !== -1) { options.method = 'get'; options.params = restParams; } else { options.method = 'post'; options.data = restParams; } if (associatedKey) { url = `/${name.split('.').join(`/${associatedKey}/`)}`; } url += `:${method as string}`; // console.log(name, name.split('.'), associatedKey, name.split('.').join(`/${associatedKey}/`)); if (resourceKey) { url += `/${resourceKey}`; } console.log({url, params}); return request(url, options); }; } }); return proxy; } } const api = new ApiClient(); export default api;