Skip to content

Commit 572688c

Browse files
authored
Merge pull request #855 from Udhay-Adithya/basic-auth
add basic authentication features
2 parents 991d486 + 1dea1b4 commit 572688c

File tree

78 files changed

+8710
-169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+8710
-169
lines changed

doc/dev_guide/api_endpoints_for_testing.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,14 @@ A List of API endpoints that can be used for testing API Dash
4747
## SSE
4848

4949
- https://sse.dev
50+
51+
## Auth
52+
- **Bearer**
53+
- https://httpbin.org/bearer
54+
55+
- **Basic Auth**
56+
- https://httpbin.org/basic-auth/{username}/{password}
57+
58+
- **Digest Auth**
59+
- https://httpbin.org/digest-auth/{qop}/{usenamer}/{password}/{algorithm}
60+

lib/consts.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ const kLabelURLParams = "Params";
448448
const kLabelHeaders = "Headers";
449449
const kLabelBody = "Body";
450450
const kLabelScripts = "Scripts";
451+
const kLabelAuth = "Auth";
451452
const kLabelQuery = "Query";
452453
const kNameCheckbox = "Checkbox";
453454
const kNameURLParam = "URL Parameter";

lib/models/history_request_model.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class HistoryRequestModel with _$HistoryRequestModel {
1818
required HttpResponseModel httpResponseModel,
1919
String? preRequestScript,
2020
String? postRequestScript,
21+
AuthModel? authModel,
2122
}) = _HistoryRequestModel;
2223

2324
factory HistoryRequestModel.fromJson(Map<String, Object?> json) =>

lib/models/history_request_model.freezed.dart

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ mixin _$HistoryRequestModel {
2626
HttpResponseModel get httpResponseModel => throw _privateConstructorUsedError;
2727
String? get preRequestScript => throw _privateConstructorUsedError;
2828
String? get postRequestScript => throw _privateConstructorUsedError;
29+
AuthModel? get authModel => throw _privateConstructorUsedError;
2930

3031
/// Serializes this HistoryRequestModel to a JSON map.
3132
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@@ -49,11 +50,13 @@ abstract class $HistoryRequestModelCopyWith<$Res> {
4950
HttpRequestModel httpRequestModel,
5051
HttpResponseModel httpResponseModel,
5152
String? preRequestScript,
52-
String? postRequestScript});
53+
String? postRequestScript,
54+
AuthModel? authModel});
5355

5456
$HistoryMetaModelCopyWith<$Res> get metaData;
5557
$HttpRequestModelCopyWith<$Res> get httpRequestModel;
5658
$HttpResponseModelCopyWith<$Res> get httpResponseModel;
59+
$AuthModelCopyWith<$Res>? get authModel;
5760
}
5861

5962
/// @nodoc
@@ -77,6 +80,7 @@ class _$HistoryRequestModelCopyWithImpl<$Res, $Val extends HistoryRequestModel>
7780
Object? httpResponseModel = null,
7881
Object? preRequestScript = freezed,
7982
Object? postRequestScript = freezed,
83+
Object? authModel = freezed,
8084
}) {
8185
return _then(_value.copyWith(
8286
historyId: null == historyId
@@ -103,6 +107,10 @@ class _$HistoryRequestModelCopyWithImpl<$Res, $Val extends HistoryRequestModel>
103107
? _value.postRequestScript
104108
: postRequestScript // ignore: cast_nullable_to_non_nullable
105109
as String?,
110+
authModel: freezed == authModel
111+
? _value.authModel
112+
: authModel // ignore: cast_nullable_to_non_nullable
113+
as AuthModel?,
106114
) as $Val);
107115
}
108116

@@ -135,6 +143,20 @@ class _$HistoryRequestModelCopyWithImpl<$Res, $Val extends HistoryRequestModel>
135143
return _then(_value.copyWith(httpResponseModel: value) as $Val);
136144
});
137145
}
146+
147+
/// Create a copy of HistoryRequestModel
148+
/// with the given fields replaced by the non-null parameter values.
149+
@override
150+
@pragma('vm:prefer-inline')
151+
$AuthModelCopyWith<$Res>? get authModel {
152+
if (_value.authModel == null) {
153+
return null;
154+
}
155+
156+
return $AuthModelCopyWith<$Res>(_value.authModel!, (value) {
157+
return _then(_value.copyWith(authModel: value) as $Val);
158+
});
159+
}
138160
}
139161

140162
/// @nodoc
@@ -151,14 +173,17 @@ abstract class _$$HistoryRequestModelImplCopyWith<$Res>
151173
HttpRequestModel httpRequestModel,
152174
HttpResponseModel httpResponseModel,
153175
String? preRequestScript,
154-
String? postRequestScript});
176+
String? postRequestScript,
177+
AuthModel? authModel});
155178

156179
@override
157180
$HistoryMetaModelCopyWith<$Res> get metaData;
158181
@override
159182
$HttpRequestModelCopyWith<$Res> get httpRequestModel;
160183
@override
161184
$HttpResponseModelCopyWith<$Res> get httpResponseModel;
185+
@override
186+
$AuthModelCopyWith<$Res>? get authModel;
162187
}
163188

164189
/// @nodoc
@@ -180,6 +205,7 @@ class __$$HistoryRequestModelImplCopyWithImpl<$Res>
180205
Object? httpResponseModel = null,
181206
Object? preRequestScript = freezed,
182207
Object? postRequestScript = freezed,
208+
Object? authModel = freezed,
183209
}) {
184210
return _then(_$HistoryRequestModelImpl(
185211
historyId: null == historyId
@@ -206,6 +232,10 @@ class __$$HistoryRequestModelImplCopyWithImpl<$Res>
206232
? _value.postRequestScript
207233
: postRequestScript // ignore: cast_nullable_to_non_nullable
208234
as String?,
235+
authModel: freezed == authModel
236+
? _value.authModel
237+
: authModel // ignore: cast_nullable_to_non_nullable
238+
as AuthModel?,
209239
));
210240
}
211241
}
@@ -220,7 +250,8 @@ class _$HistoryRequestModelImpl implements _HistoryRequestModel {
220250
required this.httpRequestModel,
221251
required this.httpResponseModel,
222252
this.preRequestScript,
223-
this.postRequestScript});
253+
this.postRequestScript,
254+
this.authModel});
224255

225256
factory _$HistoryRequestModelImpl.fromJson(Map<String, dynamic> json) =>
226257
_$$HistoryRequestModelImplFromJson(json);
@@ -237,10 +268,12 @@ class _$HistoryRequestModelImpl implements _HistoryRequestModel {
237268
final String? preRequestScript;
238269
@override
239270
final String? postRequestScript;
271+
@override
272+
final AuthModel? authModel;
240273

241274
@override
242275
String toString() {
243-
return 'HistoryRequestModel(historyId: $historyId, metaData: $metaData, httpRequestModel: $httpRequestModel, httpResponseModel: $httpResponseModel, preRequestScript: $preRequestScript, postRequestScript: $postRequestScript)';
276+
return 'HistoryRequestModel(historyId: $historyId, metaData: $metaData, httpRequestModel: $httpRequestModel, httpResponseModel: $httpResponseModel, preRequestScript: $preRequestScript, postRequestScript: $postRequestScript, authModel: $authModel)';
244277
}
245278

246279
@override
@@ -259,13 +292,22 @@ class _$HistoryRequestModelImpl implements _HistoryRequestModel {
259292
(identical(other.preRequestScript, preRequestScript) ||
260293
other.preRequestScript == preRequestScript) &&
261294
(identical(other.postRequestScript, postRequestScript) ||
262-
other.postRequestScript == postRequestScript));
295+
other.postRequestScript == postRequestScript) &&
296+
(identical(other.authModel, authModel) ||
297+
other.authModel == authModel));
263298
}
264299

265300
@JsonKey(includeFromJson: false, includeToJson: false)
266301
@override
267-
int get hashCode => Object.hash(runtimeType, historyId, metaData,
268-
httpRequestModel, httpResponseModel, preRequestScript, postRequestScript);
302+
int get hashCode => Object.hash(
303+
runtimeType,
304+
historyId,
305+
metaData,
306+
httpRequestModel,
307+
httpResponseModel,
308+
preRequestScript,
309+
postRequestScript,
310+
authModel);
269311

270312
/// Create a copy of HistoryRequestModel
271313
/// with the given fields replaced by the non-null parameter values.
@@ -291,7 +333,8 @@ abstract class _HistoryRequestModel implements HistoryRequestModel {
291333
required final HttpRequestModel httpRequestModel,
292334
required final HttpResponseModel httpResponseModel,
293335
final String? preRequestScript,
294-
final String? postRequestScript}) = _$HistoryRequestModelImpl;
336+
final String? postRequestScript,
337+
final AuthModel? authModel}) = _$HistoryRequestModelImpl;
295338

296339
factory _HistoryRequestModel.fromJson(Map<String, dynamic> json) =
297340
_$HistoryRequestModelImpl.fromJson;
@@ -308,6 +351,8 @@ abstract class _HistoryRequestModel implements HistoryRequestModel {
308351
String? get preRequestScript;
309352
@override
310353
String? get postRequestScript;
354+
@override
355+
AuthModel? get authModel;
311356

312357
/// Create a copy of HistoryRequestModel
313358
/// with the given fields replaced by the non-null parameter values.

lib/models/history_request_model.g.dart

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/providers/collection_providers.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class CollectionStateNotifier
207207
String? id,
208208
HTTPVerb? method,
209209
APIType? apiType,
210+
AuthModel? authModel,
210211
String? url,
211212
String? name,
212213
String? description,
@@ -242,6 +243,7 @@ class CollectionStateNotifier
242243
url: url ?? currentHttpRequestModel.url,
243244
headers: headers ?? currentHttpRequestModel.headers,
244245
params: params ?? currentHttpRequestModel.params,
246+
authModel: authModel ?? currentHttpRequestModel.authModel,
245247
isHeaderEnabledList:
246248
isHeaderEnabledList ?? currentHttpRequestModel.isHeaderEnabledList,
247249
isParamEnabledList:
@@ -315,6 +317,7 @@ class CollectionStateNotifier
315317
var responseRec = await sendHttpRequest(
316318
requestId,
317319
apiType,
320+
requestModel.httpRequestModel?.authModel,
318321
substitutedHttpRequestModel,
319322
defaultUriScheme: defaultUriScheme,
320323
noSSL: noSSL,
@@ -356,8 +359,11 @@ class CollectionStateNotifier
356359
httpResponseModel: httpResponseModel,
357360
preRequestScript: requestModel.preRequestScript,
358361
postRequestScript: requestModel.postRequestScript,
362+
authModel: requestModel.httpRequestModel?.authModel,
359363
);
360364

365+
ref.read(historyMetaStateNotifier.notifier).addHistoryRequest(model);
366+
361367
if (!requestModel.postRequestScript.isNullOrEmpty()) {
362368
newRequestModel = await handlePostResponseScript(
363369
newRequestModel,
@@ -373,7 +379,6 @@ class CollectionStateNotifier
373379
},
374380
);
375381
}
376-
ref.read(historyMetaStateNotifier.notifier).addHistoryRequest(model);
377382
}
378383

379384
// update state with response data
@@ -444,6 +449,7 @@ class CollectionStateNotifier
444449
: (state?[id]?.copyWith(httpResponseModel: null))?.toJson(),
445450
);
446451
}
452+
447453
await hiveHandler.removeUnused();
448454
ref.read(saveDataStateProvider.notifier).state = false;
449455
ref.read(hasUnsavedChangesProvider.notifier).state = false;
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:apidash_core/apidash_core.dart';
3+
import 'package:apidash_design_system/apidash_design_system.dart';
4+
import 'package:apidash/widgets/widgets.dart';
5+
import 'consts.dart';
6+
7+
class ApiKeyAuthFields extends StatefulWidget {
8+
final AuthModel? authData;
9+
final bool readOnly;
10+
final Function(AuthModel?)? updateAuth;
11+
12+
const ApiKeyAuthFields(
13+
{super.key,
14+
required this.authData,
15+
this.updateAuth,
16+
this.readOnly = false});
17+
18+
@override
19+
State<ApiKeyAuthFields> createState() => _ApiKeyAuthFieldsState();
20+
}
21+
22+
class _ApiKeyAuthFieldsState extends State<ApiKeyAuthFields> {
23+
late TextEditingController _keyController;
24+
late TextEditingController _nameController;
25+
late String _addKeyTo;
26+
27+
@override
28+
void initState() {
29+
super.initState();
30+
final apiAuth = widget.authData?.apikey;
31+
_keyController = TextEditingController(text: apiAuth?.key ?? '');
32+
_nameController =
33+
TextEditingController(text: apiAuth?.name ?? kApiKeyHeaderName);
34+
_addKeyTo = apiAuth?.location ?? kAddToDefaultLocation;
35+
}
36+
37+
@override
38+
Widget build(BuildContext context) {
39+
return Column(
40+
crossAxisAlignment: CrossAxisAlignment.start,
41+
children: [
42+
Text(
43+
kLabelAddTo,
44+
style: TextStyle(
45+
fontWeight: FontWeight.normal,
46+
fontSize: 14,
47+
),
48+
),
49+
SizedBox(
50+
height: 4,
51+
),
52+
ADPopupMenu<String>(
53+
value: kAddToLocationsMap[_addKeyTo],
54+
values: kAddToLocations,
55+
tooltip: kTooltipApiKeyAuth,
56+
isOutlined: true,
57+
onChanged: widget.readOnly
58+
? null
59+
: (String? newLocation) {
60+
if (newLocation != null) {
61+
setState(() {
62+
_addKeyTo = newLocation;
63+
});
64+
_updateApiKeyAuth();
65+
}
66+
},
67+
),
68+
const SizedBox(height: 16),
69+
AuthTextField(
70+
readOnly: widget.readOnly,
71+
controller: _nameController,
72+
hintText: kHintTextFieldName,
73+
onChanged: (value) => _updateApiKeyAuth(),
74+
),
75+
const SizedBox(height: 16),
76+
AuthTextField(
77+
readOnly: widget.readOnly,
78+
controller: _keyController,
79+
title: kLabelApiKey,
80+
hintText: kHintTextKey,
81+
isObscureText: true,
82+
onChanged: (value) => _updateApiKeyAuth(),
83+
),
84+
],
85+
);
86+
}
87+
88+
void _updateApiKeyAuth() {
89+
final apiKey = AuthApiKeyModel(
90+
key: _keyController.text.trim(),
91+
name: _nameController.text.trim(),
92+
location: _addKeyTo,
93+
);
94+
widget.updateAuth?.call(widget.authData?.copyWith(
95+
type: APIAuthType.apiKey,
96+
apikey: apiKey,
97+
) ??
98+
AuthModel(
99+
type: APIAuthType.apiKey,
100+
apikey: apiKey,
101+
));
102+
}
103+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export 'api_key_auth_fields.dart';
2+
export 'auth_page.dart';
3+
export 'basic_auth_fields.dart';
4+
export 'bearer_auth_fields.dart';
5+
export 'digest_auth_fields.dart';
6+
export 'jwt_auth_fields.dart';

0 commit comments

Comments
 (0)