Skip to content

Commit 4284238

Browse files
authored
chore(api): update endpoint config to use ApiOutputs instead of AWSApiConfig type (#5193)
1 parent 26b970f commit 4284238

File tree

15 files changed

+222
-146
lines changed

15 files changed

+222
-146
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import 'package:amplify_core/amplify_core.dart';
5+
6+
/// {@template amplify_core.amplify_outputs.data_outputs}
7+
/// The Rest API and GraphQL category Outputs.
8+
/// {@endtemplate}
9+
abstract interface class ApiOutputs {
10+
String get awsRegion;
11+
String get url;
12+
String? get apiKey;
13+
APIAuthorizationType get authorizationType;
14+
ApiType get apiType;
15+
}
16+
17+
enum ApiType {
18+
rest,
19+
graphQL,
20+
}

packages/amplify_core/lib/src/config/amplify_outputs/data/data_outputs.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import 'package:amplify_core/amplify_core.dart';
5+
import 'package:amplify_core/src/config/amplify_outputs/api_outputs.dart';
56

67
part 'data_outputs.g.dart';
78

@@ -10,7 +11,8 @@ part 'data_outputs.g.dart';
1011
/// {@endtemplate}
1112
@zAmplifyOutputsSerializable
1213
class DataOutputs
13-
with AWSEquatable<DataOutputs>, AWSSerializable, AWSDebuggable {
14+
with AWSEquatable<DataOutputs>, AWSSerializable, AWSDebuggable
15+
implements ApiOutputs {
1416
/// {@macro amplify_core.amplify_outputs.data_outputs}
1517
const DataOutputs({
1618
required this.awsRegion,
@@ -24,12 +26,15 @@ class DataOutputs
2426
_$DataOutputsFromJson(json);
2527

2628
/// The AWS region of Amazon AppSync resources.
29+
@override
2730
final String awsRegion;
2831

2932
/// The AppSync endpoint URL.
33+
@override
3034
final String url;
3135

3236
/// The AppSync API Key.
37+
@override
3338
final String? apiKey;
3439

3540
/// The default authorization type for AWS AppSync.
@@ -38,6 +43,15 @@ class DataOutputs
3843
/// List of supported authorization types for AWS AppSync.
3944
final List<APIAuthorizationType> authorizationTypes;
4045

46+
/// The GraphQL Api type.
47+
@override
48+
ApiType get apiType => ApiType.graphQL;
49+
50+
/// The default authorization type.
51+
@override
52+
APIAuthorizationType<AmplifyAuthProvider> get authorizationType =>
53+
defaultAuthorizationType;
54+
4155
@override
4256
List<Object?> get props => [
4357
awsRegion,

packages/amplify_core/lib/src/config/amplify_outputs/rest_api/rest_api_outputs.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import 'package:amplify_core/amplify_core.dart';
5+
import 'package:amplify_core/src/config/amplify_outputs/api_outputs.dart';
56

67
part 'rest_api_outputs.g.dart';
78

@@ -13,7 +14,8 @@ part 'rest_api_outputs.g.dart';
1314
/// {@endtemplate}
1415
@zAmplifyOutputsSerializable
1516
class RestApiOutputs
16-
with AWSEquatable<RestApiOutputs>, AWSSerializable, AWSDebuggable {
17+
with AWSEquatable<RestApiOutputs>, AWSSerializable, AWSDebuggable
18+
implements ApiOutputs {
1719
/// {@macro amplify_core.amplify_outputs.rest_api_outputs}
1820
const RestApiOutputs({
1921
required this.awsRegion,
@@ -25,18 +27,26 @@ class RestApiOutputs
2527
factory RestApiOutputs.fromJson(Map<String, Object?> json) =>
2628
_$RestApiOutputsFromJson(json);
2729

28-
/// The AWS region of Amazon AWS Gateway resources.
30+
/// The AWS region of Amazon API Gateway resources.
31+
@override
2932
final String awsRegion;
3033

31-
/// The AWS Gateway endpoint URL.
34+
/// The Amazon API Gateway endpoint URL.
35+
@override
3236
final String url;
3337

34-
/// The AppSync API Key.
38+
/// The Amazon API Gateway API Key.
39+
@override
3540
final String? apiKey;
3641

3742
/// The authorization type.
43+
@override
3844
final APIAuthorizationType authorizationType;
3945

46+
/// The Rest Api type.
47+
@override
48+
ApiType get apiType => ApiType.rest;
49+
4050
@override
4151
List<Object?> get props => [
4252
awsRegion,

packages/amplify_core/test/config/amplify_outputs_mapping/amplify_outputs_mapping_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
import 'dart:convert';
25

36
import 'package:amplify_core/amplify_core.dart';

packages/api/amplify_api_dart/lib/src/api_plugin_impl.dart

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import 'package:amplify_api_dart/src/util/amplify_api_config.dart';
1515
import 'package:amplify_api_dart/src/util/amplify_authorization_rest_client.dart';
1616
import 'package:amplify_core/amplify_core.dart';
1717
// ignore: implementation_imports
18+
import 'package:amplify_core/src/config/amplify_outputs/api_outputs.dart';
19+
// ignore: implementation_imports
1820
import 'package:amplify_core/src/config/amplify_outputs/data/data_outputs.dart';
1921
// ignore: implementation_imports
2022
import 'package:amplify_core/src/config/amplify_outputs/rest_api/rest_api_outputs.dart';
@@ -162,7 +164,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
162164
/// Use [apiName] if there are multiple endpoints of the same type.
163165
@visibleForTesting
164166
AWSHttpClient getHttpClient(
165-
EndpointType type, {
167+
ApiType type, {
166168
String? apiName,
167169
APIAuthorizationType? authorizationMode,
168170
}) {
@@ -181,8 +183,8 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
181183
);
182184
}
183185

184-
EndpointConfig _getEndpointConfig(EndpointType type, String? apiName) {
185-
if (type == EndpointType.graphQL) {
186+
EndpointConfig _getEndpointConfig(ApiType type, String? apiName) {
187+
if (type == ApiType.graphQL) {
186188
if (_dataConfig == null) {
187189
throw ConfigurationError(
188190
'No GraphQL API endpoint found.',
@@ -210,16 +212,10 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
210212
}
211213
return EndpointConfig(
212214
apiName,
213-
AWSApiConfig(
214-
region: config.awsRegion,
215-
endpoint: config.url,
216-
endpointType: EndpointType.graphQL,
217-
authorizationType: config.defaultAuthorizationType,
218-
apiKey: config.apiKey,
219-
),
215+
config,
220216
);
221217
}
222-
if (type == EndpointType.rest) {
218+
if (type == ApiType.rest) {
223219
if (_restConfig == null) {
224220
throw ConfigurationError(
225221
'No REST API endpoint found.',
@@ -247,13 +243,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
247243
}
248244
return EndpointConfig(
249245
apiName,
250-
AWSApiConfig(
251-
region: config.awsRegion,
252-
endpoint: config.url,
253-
endpointType: EndpointType.rest,
254-
authorizationType: config.authorizationType,
255-
apiKey: config.apiKey,
256-
),
246+
config,
257247
);
258248
}
259249
throw ConfigurationError(
@@ -263,7 +253,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
263253

264254
WebSocketBloc _webSocketBloc({String? apiName}) {
265255
final endpoint = _getEndpointConfig(
266-
EndpointType.graphQL,
256+
ApiType.graphQL,
267257
apiName,
268258
);
269259

@@ -292,7 +282,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
292282

293283
Uri _getGraphQLUri(String? apiName) {
294284
final endpoint = _getEndpointConfig(
295-
EndpointType.graphQL,
285+
ApiType.graphQL,
296286
apiName,
297287
);
298288
return endpoint.getUri();
@@ -304,7 +294,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
304294
Map<String, dynamic>? queryParameters,
305295
) {
306296
final endpoint = _getEndpointConfig(
307-
EndpointType.rest,
297+
ApiType.rest,
308298
apiName,
309299
);
310300
return endpoint.getUri(path: path, queryParameters: queryParameters);
@@ -317,7 +307,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
317307
@override
318308
GraphQLOperation<T> query<T>({required GraphQLRequest<T> request}) {
319309
final graphQLClient = getHttpClient(
320-
EndpointType.graphQL,
310+
ApiType.graphQL,
321311
apiName: request.apiName,
322312
authorizationMode: request.authorizationMode,
323313
);
@@ -333,7 +323,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
333323
@override
334324
GraphQLOperation<T> mutate<T>({required GraphQLRequest<T> request}) {
335325
final graphQLClient = getHttpClient(
336-
EndpointType.graphQL,
326+
ApiType.graphQL,
337327
apiName: request.apiName,
338328
authorizationMode: request.authorizationMode,
339329
);
@@ -366,7 +356,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
366356
String? apiName,
367357
}) {
368358
final uri = _getRestUri(path, apiName, queryParameters);
369-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
359+
final client = getHttpClient(ApiType.rest, apiName: apiName);
370360
return RestOperation.fromHttpOperation(
371361
AWSStreamedHttpRequest.delete(
372362
uri,
@@ -384,7 +374,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
384374
String? apiName,
385375
}) {
386376
final uri = _getRestUri(path, apiName, queryParameters);
387-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
377+
final client = getHttpClient(ApiType.rest, apiName: apiName);
388378
return RestOperation.fromHttpOperation(
389379
AWSHttpRequest.get(
390380
uri,
@@ -401,7 +391,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
401391
String? apiName,
402392
}) {
403393
final uri = _getRestUri(path, apiName, queryParameters);
404-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
394+
final client = getHttpClient(ApiType.rest, apiName: apiName);
405395
return RestOperation.fromHttpOperation(
406396
AWSHttpRequest.head(
407397
uri,
@@ -419,7 +409,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
419409
String? apiName,
420410
}) {
421411
final uri = _getRestUri(path, apiName, queryParameters);
422-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
412+
final client = getHttpClient(ApiType.rest, apiName: apiName);
423413
return RestOperation.fromHttpOperation(
424414
AWSStreamedHttpRequest.patch(
425415
uri,
@@ -438,7 +428,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
438428
String? apiName,
439429
}) {
440430
final uri = _getRestUri(path, apiName, queryParameters);
441-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
431+
final client = getHttpClient(ApiType.rest, apiName: apiName);
442432
return RestOperation.fromHttpOperation(
443433
AWSStreamedHttpRequest.post(
444434
uri,
@@ -457,7 +447,7 @@ class AmplifyAPIDart extends APIPluginInterface with AWSDebuggable {
457447
String? apiName,
458448
}) {
459449
final uri = _getRestUri(path, apiName, queryParameters);
460-
final client = getHttpClient(EndpointType.rest, apiName: apiName);
450+
final client = getHttpClient(ApiType.rest, apiName: apiName);
461451
return RestOperation.fromHttpOperation(
462452
AWSStreamedHttpRequest.put(
463453
uri,

packages/api/amplify_api_dart/lib/src/decorators/authorize_http_request.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import 'dart:async';
55

66
import 'package:amplify_api_dart/src/graphql/providers/app_sync_api_key_auth_provider.dart';
77
import 'package:amplify_core/amplify_core.dart';
8+
// ignore: implementation_imports
9+
import 'package:amplify_core/src/config/amplify_outputs/api_outputs.dart';
810
import 'package:meta/meta.dart';
911

1012
/// Transforms an HTTP request according to auth providers that match the endpoint
1113
/// configuration.
1214
@internal
1315
Future<AWSBaseHttpRequest> authorizeHttpRequest(
1416
AWSBaseHttpRequest request, {
15-
required AWSApiConfig endpointConfig,
17+
required ApiOutputs endpointConfig,
1618
required AmplifyAuthProviderRepository authProviderRepo,
1719
APIAuthorizationType? authorizationMode,
1820
}) async {
@@ -49,7 +51,7 @@ Future<AWSBaseHttpRequest> authorizeHttpRequest(
4951
.getAuthProvider(APIAuthorizationType.iam.authProviderToken),
5052
authType,
5153
);
52-
final isGraphQL = endpointConfig.endpointType == EndpointType.graphQL;
54+
final isGraphQL = endpointConfig.apiType == ApiType.graphQL;
5355
final service = isGraphQL
5456
? AWSService.appSync
5557
: AWSService.apiGatewayManagementApi; // resolves to "execute-api"
@@ -60,7 +62,7 @@ Future<AWSBaseHttpRequest> authorizeHttpRequest(
6062
final authorizedRequest = await authProvider.authorizeRequest(
6163
request,
6264
options: IamAuthProviderOptions(
63-
region: endpointConfig.region,
65+
region: endpointConfig.awsRegion,
6466
service: service,
6567
serviceConfiguration: serviceConfiguration,
6668
),

packages/api/amplify_api_dart/lib/src/decorators/web_socket_auth_utils.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import 'dart:convert';
99
import 'package:amplify_api_dart/src/decorators/authorize_http_request.dart';
1010
import 'package:amplify_api_dart/src/graphql/web_socket/types/web_socket_types.dart';
1111
import 'package:amplify_core/amplify_core.dart';
12+
// ignore: implementation_imports
13+
import 'package:amplify_core/src/config/amplify_outputs/api_outputs.dart';
1214
import 'package:meta/meta.dart';
1315

1416
const _appSyncHostPortion = 'appsync-api';
@@ -31,7 +33,7 @@ const _emptyBody = <String, dynamic>{};
3133
///
3234
/// See https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html#handshake-details-to-establish-the-websocket-connection=
3335
Future<Uri> generateConnectionUri(
34-
AWSApiConfig config,
36+
ApiOutputs config,
3537
AmplifyAuthProviderRepository authRepo,
3638
) async {
3739
// First, generate auth query parameters.
@@ -48,7 +50,7 @@ Future<Uri> generateConnectionUri(
4850
'payload': base64.encode(utf8.encode(json.encode(_emptyBody))),
4951
};
5052
// Conditionally format the URI for a) AppSync domain b) custom domain.
51-
var endpointUriHost = Uri.parse(config.endpoint).host;
53+
var endpointUriHost = Uri.parse(config.url).host;
5254
String path;
5355
if (endpointUriHost.contains(_appSyncHostPortion) &&
5456
endpointUriHost.endsWith(_appSyncHostSuffix)) {
@@ -78,7 +80,7 @@ Future<Uri> generateConnectionUri(
7880
/// See https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html#subscription-registration-message
7981
Future<WebSocketSubscriptionRegistrationMessage>
8082
generateSubscriptionRegistrationMessage<T>(
81-
AWSApiConfig config, {
83+
ApiOutputs config, {
8284
required String id,
8385
required AmplifyAuthProviderRepository authRepo,
8486
required GraphQLRequest<T> request,
@@ -113,21 +115,21 @@ Future<WebSocketSubscriptionRegistrationMessage>
113115
/// the HTTP request are reformatted and returned. This logic applies for all auth
114116
/// modes as determined by [authRepo] parameter.
115117
Future<Map<String, String>> _generateAuthorizationHeaders(
116-
AWSApiConfig config, {
118+
ApiOutputs config, {
117119
required bool isConnectionInit,
118120
required AmplifyAuthProviderRepository authRepo,
119121
required Map<String, dynamic> body,
120122
APIAuthorizationType? authorizationMode,
121123
Map<String, String>? customHeaders,
122124
}) async {
123-
final endpointHost = Uri.parse(config.endpoint).host;
125+
final endpointHost = Uri.parse(config.url).host;
124126
// Create canonical HTTP request to authorize but never send.
125127
//
126128
// The canonical request URL is a little different depending on if authorizing
127129
// connection URI or start message (subscription registration).
128130
final maybeConnect = isConnectionInit ? '/connect' : '';
129131
final canonicalHttpRequest = AWSStreamedHttpRequest.post(
130-
Uri.parse('${config.endpoint}$maybeConnect'),
132+
Uri.parse('${config.url}$maybeConnect'),
131133
headers: {
132134
...?customHeaders,
133135
..._requiredHeaders,

0 commit comments

Comments
 (0)