Skip to content

Commit 8b12a72

Browse files
authored
Merge pull request #635 from AffanShaikhsurab/patch-9
Added env variable support for form request body
2 parents 49bacb8 + 3382782 commit 8b12a72

File tree

7 files changed

+106
-105
lines changed

7 files changed

+106
-105
lines changed

lib/screens/common_widgets/envfield_cell.dart

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,9 @@ class EnvCellField extends StatelessWidget {
2727
style: kCodeStyle.copyWith(
2828
color: clrScheme.onSurface,
2929
),
30-
decoration: InputDecoration(
31-
hintStyle: kCodeStyle.copyWith(
32-
color: clrScheme.outlineVariant,
33-
),
30+
decoration: getTextFieldInputDecoration(
31+
clrScheme,
3432
hintText: hintText,
35-
contentPadding: const EdgeInsets.only(bottom: 12),
36-
focusedBorder: UnderlineInputBorder(
37-
borderSide: BorderSide(
38-
color: clrScheme.outlineVariant,
39-
),
40-
),
41-
enabledBorder: UnderlineInputBorder(
42-
borderSide: BorderSide(
43-
color: clrScheme.surfaceContainerHighest,
44-
),
45-
),
4633
),
4734
onChanged: onChanged,
4835
);

lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
66
import 'package:data_table_2/data_table_2.dart';
77
import 'package:apidash/providers/providers.dart';
8+
import 'package:apidash/screens/common_widgets/common_widgets.dart';
89
import 'package:apidash/widgets/widgets.dart';
910
import 'package:apidash/utils/utils.dart';
1011
import 'package:apidash/consts.dart';
@@ -82,7 +83,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
8283
key: ValueKey("$selectedId-$index-form-row-$seed"),
8384
cells: <DataCell>[
8485
DataCell(
85-
CellField(
86+
EnvCellField(
8687
keyId: "$selectedId-$index-form-k-$seed",
8788
initialValue: formRows[index].name,
8889
hintText: kHintAddFieldName,
@@ -138,7 +139,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
138139
},
139140
initialValue: formRows[index].value,
140141
)
141-
: CellField(
142+
: EnvCellField(
142143
keyId: "$selectedId-$index-form-v-$seed",
143144
initialValue: formRows[index].value,
144145
hintText: kHintAddValue,

lib/utils/envvar_utils.dart

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,59 +37,60 @@ List<EnvironmentVariableModel> getEnvironmentSecrets(
3737
}
3838

3939
String? substituteVariables(
40-
String? input,
41-
Map<String?, List<EnvironmentVariableModel>> envMap,
42-
String? activeEnvironmentId) {
40+
String? input,
41+
Map<String, String> envVarMap,
42+
) {
4343
if (input == null) return null;
44-
45-
final Map<String, String> combinedMap = {};
46-
final activeEnv = envMap[activeEnvironmentId] ?? [];
47-
final globalEnv = envMap[kGlobalEnvironmentId] ?? [];
48-
49-
for (var variable in globalEnv) {
50-
combinedMap[variable.key] = variable.value;
51-
}
52-
for (var variable in activeEnv) {
53-
combinedMap[variable.key] = variable.value;
44+
if (envVarMap.keys.isEmpty) {
45+
return input;
5446
}
47+
final regex = RegExp("{{(${envVarMap.keys.join('|')})}}");
5548

56-
String result = input.replaceAllMapped(kEnvVarRegEx, (match) {
49+
String result = input.replaceAllMapped(regex, (match) {
5750
final key = match.group(1)?.trim() ?? '';
58-
return combinedMap[key] ?? '';
51+
return envVarMap[key] ?? '{{$key}}';
5952
});
6053

6154
return result;
6255
}
6356

6457
HttpRequestModel substituteHttpRequestModel(
65-
HttpRequestModel httpRequestModel,
66-
Map<String?, List<EnvironmentVariableModel>> envMap,
67-
String? activeEnvironmentId) {
58+
HttpRequestModel httpRequestModel,
59+
Map<String?, List<EnvironmentVariableModel>> envMap,
60+
String? activeEnvironmentId,
61+
) {
62+
final Map<String, String> combinedEnvVarMap = {};
63+
final activeEnv = envMap[activeEnvironmentId] ?? [];
64+
final globalEnv = envMap[kGlobalEnvironmentId] ?? [];
65+
66+
for (var variable in globalEnv) {
67+
combinedEnvVarMap[variable.key] = variable.value;
68+
}
69+
for (var variable in activeEnv) {
70+
combinedEnvVarMap[variable.key] = variable.value;
71+
}
72+
6873
var newRequestModel = httpRequestModel.copyWith(
69-
url: substituteVariables(
70-
httpRequestModel.url,
71-
envMap,
72-
activeEnvironmentId,
73-
)!,
74+
url: substituteVariables(httpRequestModel.url, combinedEnvVarMap)!,
7475
headers: httpRequestModel.headers?.map((header) {
7576
return header.copyWith(
76-
name:
77-
substituteVariables(header.name, envMap, activeEnvironmentId) ?? "",
78-
value: substituteVariables(header.value, envMap, activeEnvironmentId),
77+
name: substituteVariables(header.name, combinedEnvVarMap) ?? "",
78+
value: substituteVariables(header.value, combinedEnvVarMap),
7979
);
8080
}).toList(),
8181
params: httpRequestModel.params?.map((param) {
8282
return param.copyWith(
83-
name:
84-
substituteVariables(param.name, envMap, activeEnvironmentId) ?? "",
85-
value: substituteVariables(param.value, envMap, activeEnvironmentId),
83+
name: substituteVariables(param.name, combinedEnvVarMap) ?? "",
84+
value: substituteVariables(param.value, combinedEnvVarMap),
85+
);
86+
}).toList(),
87+
formData: httpRequestModel.formData?.map((formData) {
88+
return formData.copyWith(
89+
name: substituteVariables(formData.name, combinedEnvVarMap) ?? "",
90+
value: substituteVariables(formData.value, combinedEnvVarMap) ?? "",
8691
);
8792
}).toList(),
88-
body: substituteVariables(
89-
httpRequestModel.body,
90-
envMap,
91-
activeEnvironmentId,
92-
),
93+
body: substituteVariables(httpRequestModel.body, combinedEnvVarMap),
9394
);
9495
return newRequestModel;
9596
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:flutter/material.dart';
2+
import '../tokens/tokens.dart';
3+
4+
InputDecoration getTextFieldInputDecoration(
5+
ColorScheme clrScheme, {
6+
Color? fillColor,
7+
String? hintText,
8+
TextStyle? hintTextStyle,
9+
double? hintTextFontSize,
10+
Color? hintTextColor,
11+
EdgeInsetsGeometry? contentPadding,
12+
Color? focussedBorderColor,
13+
Color? enabledBorderColor,
14+
bool? isDense,
15+
}) {
16+
return InputDecoration(
17+
filled: true,
18+
fillColor: fillColor ?? clrScheme.surfaceContainerLowest,
19+
hintStyle: hintTextStyle ??
20+
kCodeStyle.copyWith(
21+
fontSize: hintTextFontSize,
22+
color: hintTextColor ?? clrScheme.outlineVariant,
23+
),
24+
hintText: hintText,
25+
contentPadding: contentPadding ?? kP10,
26+
focusedBorder: OutlineInputBorder(
27+
borderSide: BorderSide(
28+
color: focussedBorderColor ?? clrScheme.outline,
29+
),
30+
),
31+
enabledBorder: OutlineInputBorder(
32+
borderSide: BorderSide(
33+
color: enabledBorderColor ?? clrScheme.surfaceContainerHighest,
34+
),
35+
),
36+
isDense: isDense,
37+
);
38+
}

packages/apidash_design_system/lib/widgets/textfield_outlined.dart

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import '../tokens/tokens.dart';
3+
import 'decoration_input_textfield.dart';
34

45
class ADOutlinedTextField extends StatelessWidget {
56
const ADOutlinedTextField({
@@ -65,26 +66,16 @@ class ADOutlinedTextField extends StatelessWidget {
6566
fontSize: textFontSize,
6667
color: textColor ?? clrScheme.onSurface,
6768
),
68-
decoration: InputDecoration(
69-
filled: true,
70-
fillColor: fillColor ?? clrScheme.surfaceContainerLowest,
71-
hintStyle: hintTextStyle ??
72-
kCodeStyle.copyWith(
73-
fontSize: hintTextFontSize,
74-
color: hintTextColor ?? clrScheme.outlineVariant,
75-
),
69+
decoration: getTextFieldInputDecoration(
70+
clrScheme,
71+
fillColor: fillColor,
7672
hintText: hintText,
77-
contentPadding: contentPadding ?? kP10,
78-
focusedBorder: OutlineInputBorder(
79-
borderSide: BorderSide(
80-
color: focussedBorderColor ?? clrScheme.outline,
81-
),
82-
),
83-
enabledBorder: OutlineInputBorder(
84-
borderSide: BorderSide(
85-
color: enabledBorderColor ?? clrScheme.surfaceContainerHighest,
86-
),
87-
),
73+
hintTextStyle: hintTextStyle,
74+
hintTextFontSize: hintTextFontSize,
75+
hintTextColor: hintTextColor,
76+
contentPadding: contentPadding,
77+
focussedBorderColor: focussedBorderColor,
78+
enabledBorderColor: enabledBorderColor,
8879
isDense: isDense,
8980
),
9081
onChanged: onChanged,

packages/apidash_design_system/lib/widgets/widgets.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export 'button_filled.dart';
22
export 'button_icon.dart';
33
export 'button_text.dart';
44
export 'checkbox.dart';
5+
export 'decoration_input_textfield.dart';
56
export 'dropdown.dart';
67
export 'popup_menu.dart';
78
export 'snackbar.dart';

test/utils/envvar_utils_test.dart

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ const globalVars = [
4848
EnvironmentVariableModel(key: "num", value: "5670000"),
4949
EnvironmentVariableModel(key: "token", value: "token"),
5050
];
51+
final globalVarsMap = {for (var item in globalVars) item.key: item.value};
5152
const activeEnvVars = [
5253
EnvironmentVariableModel(key: "url", value: "api.apidash.dev"),
5354
EnvironmentVariableModel(key: "num", value: "8940000"),
5455
];
56+
final activeEnvVarsMap = {for (var item in activeEnvVars) item.key: item.value};
57+
final combinedEnvVarsMap = mergeMaps(globalVarsMap, activeEnvVarsMap);
5558

5659
void main() {
5760
group("Testing getEnvironmentTitle function", () {
@@ -125,66 +128,45 @@ void main() {
125128
group("Testing substituteVariables function", () {
126129
test("Testing substituteVariables with null", () {
127130
String? input;
128-
Map<String?, List<EnvironmentVariableModel>> envMap = {};
129-
String? activeEnvironmentId;
130-
expect(substituteVariables(input, envMap, activeEnvironmentId), null);
131+
Map<String, String> envMap = {};
132+
expect(substituteVariables(input, envMap), null);
131133
});
132134

133135
test("Testing substituteVariables with empty input", () {
134136
String input = "";
135-
Map<String?, List<EnvironmentVariableModel>> envMap = {};
136-
String? activeEnvironmentId;
137-
expect(substituteVariables(input, envMap, activeEnvironmentId), "");
137+
Map<String, String> envMap = {};
138+
expect(substituteVariables(input, envMap), "");
138139
});
139140

140141
test("Testing substituteVariables with empty envMap", () {
141142
String input = "{{url}}/humanize/social?num={{num}}";
142-
Map<String?, List<EnvironmentVariableModel>> envMap = {};
143-
String? activeEnvironmentId;
144-
String expected = "/humanize/social?num=";
145-
expect(substituteVariables(input, envMap, activeEnvironmentId), expected);
143+
Map<String, String> envMap = {};
144+
String expected = "{{url}}/humanize/social?num={{num}}";
145+
expect(substituteVariables(input, envMap), expected);
146146
});
147147

148148
test("Testing substituteVariables with empty activeEnvironmentId", () {
149149
String input = "{{url}}/humanize/social?num={{num}}";
150-
Map<String?, List<EnvironmentVariableModel>> envMap = {
151-
kGlobalEnvironmentId: globalVars,
152-
};
153150
String expected = "api.foss42.com/humanize/social?num=5670000";
154-
expect(substituteVariables(input, envMap, null), expected);
151+
expect(substituteVariables(input, globalVarsMap), expected);
155152
});
156153

157154
test("Testing substituteVariables with non-empty activeEnvironmentId", () {
158155
String input = "{{url}}/humanize/social?num={{num}}";
159-
Map<String?, List<EnvironmentVariableModel>> envMap = {
160-
kGlobalEnvironmentId: globalVars,
161-
"activeEnvId": activeEnvVars,
162-
};
163-
String? activeEnvId = "activeEnvId";
164156
String expected = "api.apidash.dev/humanize/social?num=8940000";
165-
expect(substituteVariables(input, envMap, activeEnvId), expected);
157+
expect(substituteVariables(input, combinedEnvVarsMap), expected);
166158
});
167159

168160
test("Testing substituteVariables with incorrect paranthesis", () {
169161
String input = "{{url}}}/humanize/social?num={{num}}";
170-
Map<String?, List<EnvironmentVariableModel>> envMap = {
171-
kGlobalEnvironmentId: globalVars,
172-
"activeEnvId": activeEnvVars,
173-
};
174-
String? activeEnvId = "activeEnvId";
175162
String expected = "api.apidash.dev}/humanize/social?num=8940000";
176-
expect(substituteVariables(input, envMap, activeEnvId), expected);
163+
expect(substituteVariables(input, combinedEnvVarsMap), expected);
177164
});
178165

179166
test("Testing substituteVariables function with unavailable variables", () {
180167
String input = "{{url1}}/humanize/social?num={{num}}";
181-
Map<String?, List<EnvironmentVariableModel>> envMap = {
182-
kGlobalEnvironmentId: globalVars,
183-
"activeEnvId": activeEnvVars,
184-
};
185-
String? activeEnvironmentId = "activeEnvId";
186-
String expected = "/humanize/social?num=8940000";
187-
expect(substituteVariables(input, envMap, activeEnvironmentId), expected);
168+
String expected = "{{url1}}/humanize/social?num=8940000";
169+
expect(substituteVariables(input, combinedEnvVarsMap), expected);
188170
});
189171
});
190172

@@ -251,9 +233,9 @@ void main() {
251233
};
252234
String? activeEnvironmentId = "activeEnvId";
253235
const expected = HttpRequestModel(
254-
url: "/humanize/social",
236+
url: "{{url1}}/humanize/social",
255237
headers: [
256-
NameValueModel(name: "Authorization", value: "Bearer "),
238+
NameValueModel(name: "Authorization", value: "Bearer {{token1}}"),
257239
],
258240
params: [
259241
NameValueModel(name: "num", value: "8940000"),

0 commit comments

Comments
 (0)