/
service.ts
126 lines (107 loc) · 3.4 KB
/
service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { notification } from 'antd';
import { isNil, omitBy, omit, pick, cloneDeep } from 'lodash';
import { formatMessage, request } from 'umi';
/**
* Because we have some `custom` field in Upstream Form, like custom.tls/custom.checks.active etc,
* we need to transform data that doesn't have `custom` field to data contains `custom` field
*/
export const convertToFormData = (originData: UpstreamComponent.ResponseData) => {
if (originData === undefined) {
// NOTE: When binding Service without Upstream configuration (None), originData === undefined
return undefined
}
const data = cloneDeep(originData)
data.custom = {}
data.upstream_id = "Custom"
if (data.checks) {
data.custom.checks = {}
if (data.checks.active) {
data.custom.checks.active = true
}
if (data.checks.passive) {
data.custom.checks.passive = true
}
}
if (data.tls) {
data.custom.tls = "enable"
}
if (data.id) {
data.upstream_id = data.id;
}
return data
}
/**
* Transform Upstream Form data from custom data to API needed data
*/
export const convertToRequestData = (
formData: UpstreamModule.RequestBody,
): UpstreamModule.RequestBody | undefined | { upstream_id: string } => {
let data = omitBy(formData, isNil) as UpstreamModule.RequestBody;
data = omit(data, 'custom');
const {
type,
hash_on,
key,
nodes,
pass_host,
upstream_host,
upstream_id = "Custom",
checks
} = data;
if (!["Custom", "None"].includes(upstream_id)) {
return { upstream_id };
}
data = omit(data, "upstream_id") as any
if (type === 'chash') {
if (!hash_on) {
return undefined;
}
if (hash_on !== 'consumer' && !key) {
return undefined;
}
}
if (pass_host === 'rewrite' && !upstream_host) {
return undefined;
}
if (checks?.passive && !checks.active) {
notification.error({
message: formatMessage({id: 'component.upstream.other.health-check.invalid'}),
description: formatMessage({id: 'component.upstream.other.health-check.passive-only'})
})
return undefined
}
/**
* nodes will be [] or node list
* when upstream_id === none, None === undefined
*/
if (nodes) {
// NOTE: https://github.com/ant-design/ant-design/issues/27396
data.nodes = nodes?.map((item) => {
return pick(item, ['host', 'port', 'weight']);
});
return data;
}
return undefined;
};
export const fetchUpstreamList = () => {
return request<Res<ResListData<UpstreamComponent.ResponseData>>>('/upstreams').then(({ data }) => ({
data: data.rows.map(row => convertToFormData(row)),
total: data.total_size,
}));
};