2020-12-13 00:09:25 +08:00
|
|
|
import { values } from 'lodash';
|
2020-12-11 15:09:39 +08:00
|
|
|
import { stringify } from 'querystring';
|
2020-11-13 22:01:14 +08:00
|
|
|
import { request } from 'umi';
|
|
|
|
|
2020-12-01 20:11:39 +08:00
|
|
|
interface ActionParams {
|
2020-11-13 22:01:14 +08:00
|
|
|
resourceKey?: string | number;
|
|
|
|
// resourceName?: string;
|
|
|
|
// associatedName?: string;
|
|
|
|
associatedKey?: string | number;
|
|
|
|
fields?: any;
|
|
|
|
filter?: any;
|
2020-12-01 20:11:39 +08:00
|
|
|
values?: any;
|
|
|
|
page?: any;
|
|
|
|
perPage?: any;
|
2020-11-21 23:49:59 +08:00
|
|
|
[key: string]: any;
|
2020-11-13 22:01:14 +08:00
|
|
|
}
|
|
|
|
|
2020-12-01 20:11:39 +08:00
|
|
|
interface Resource {
|
|
|
|
get: (params?: ActionParams) => Promise<any>;
|
|
|
|
list: (params?: ActionParams) => Promise<any>;
|
|
|
|
create: (params?: ActionParams) => Promise<any>;
|
|
|
|
update: (params?: ActionParams) => Promise<any>;
|
|
|
|
destroy: (params?: ActionParams) => Promise<any>;
|
|
|
|
[name: string]: (params?: ActionParams) => Promise<any>;
|
2020-11-13 22:01:14 +08:00
|
|
|
}
|
|
|
|
|
2020-12-01 20:11:39 +08:00
|
|
|
class ApiClient {
|
|
|
|
resource(name: string): Resource {
|
2021-03-28 13:34:51 +08:00
|
|
|
const proxy: any = new Proxy(
|
|
|
|
{},
|
|
|
|
{
|
|
|
|
get(target, method, receiver) {
|
|
|
|
return (params: ActionParams = {}) => {
|
|
|
|
let {
|
|
|
|
associatedKey,
|
|
|
|
resourceKey,
|
|
|
|
filter,
|
|
|
|
sorter,
|
|
|
|
sort = [],
|
|
|
|
values,
|
|
|
|
...restParams
|
|
|
|
} = params;
|
|
|
|
let url = `/${name}`;
|
|
|
|
sort = sort || [];
|
|
|
|
let options: any = {
|
|
|
|
params: {},
|
|
|
|
};
|
|
|
|
if (['list', 'get'].indexOf(method as string) !== -1) {
|
|
|
|
options.method = 'get';
|
|
|
|
options.params = restParams;
|
|
|
|
} else {
|
|
|
|
options.method = 'post';
|
|
|
|
options.params = restParams;
|
|
|
|
options.data = values;
|
|
|
|
}
|
|
|
|
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}`;
|
|
|
|
}
|
|
|
|
if (filter) {
|
|
|
|
options.params['filter'] = JSON.stringify(filter);
|
|
|
|
}
|
|
|
|
if (sorter) {
|
|
|
|
const arr = Array.isArray(sorter) ? sorter : [sorter];
|
|
|
|
arr.forEach(({ order, field }) => {
|
|
|
|
if (order === 'descend') {
|
|
|
|
sort.push(`-${field}`);
|
|
|
|
} else if (order === 'ascend') {
|
|
|
|
sort.push(field);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (sort.length === 0) {
|
|
|
|
delete options.params['sort'];
|
|
|
|
} else {
|
|
|
|
options.params['sort'] = sort.join(',');
|
|
|
|
}
|
|
|
|
console.log({ url, params });
|
|
|
|
return request(url, options);
|
2020-12-11 15:09:39 +08:00
|
|
|
};
|
2021-03-28 13:34:51 +08:00
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
2020-12-01 20:11:39 +08:00
|
|
|
return proxy;
|
2020-11-13 22:01:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-01 20:11:39 +08:00
|
|
|
const api = new ApiClient();
|
2020-11-13 22:01:14 +08:00
|
|
|
|
|
|
|
export default api;
|