Skip to content

Commit

Permalink
chore: update configure apis to use AmplifyOutputs instead of Amplify…
Browse files Browse the repository at this point in the history
…Config
  • Loading branch information
Nika Hassani committed Jun 18, 2024
1 parent 56f4980 commit f58b6ae
Show file tree
Hide file tree
Showing 41 changed files with 497 additions and 208 deletions.
37 changes: 29 additions & 8 deletions packages/amplify_core/lib/src/amplify_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,22 +113,43 @@ abstract class AmplifyClass {
}

late AmplifyConfig amplifyConfig;
late AmplifyOutputs amplifyOutputs;
Map<String, Object?> json;
try {
try {
final json = jsonDecode(configuration) as Map;
amplifyConfig = AmplifyConfig.fromJson(json.cast());
json = jsonDecode(configuration) as Map<String, Object?>;
} on Object catch (e) {
throw ConfigurationError(
'The provided configuration is not a valid json. '
'Check underlyingException.',
recoverySuggestion:
'Inspect your amplifyconfiguration.dart and ensure that '
'the string is proper json',
'Inspect your amplify_output.dart or amplifyconfiguration.dart '
'and ensure that the string is proper json',
underlyingException: e,
);
}
await _configurePlugins(amplifyConfig);
_configCompleter.complete(amplifyConfig.toAmplifyOutputs());
try {
amplifyOutputs = AmplifyOutputs.fromJson(json);
} on Object {
try {
amplifyConfig = AmplifyConfig.fromJson(json);
amplifyOutputs = amplifyConfig.toAmplifyOutputs();
} on Object catch (e) {
throw ConfigurationError(
'The provided configuration can not be decoded to AmplifyOutputs '
'or AmplifyConfig. '
'Check underlyingException.',
recoverySuggestion:
'If using Amplify Gen 2 ensure that the json string '
'can be decoded to AmplifyOutputs type. '
'If using Amplify Gen 1 ensure that the json '
'string can be decoded to AmplifyConfig type.',
underlyingException: e,
);
}
}
await _configurePlugins(amplifyOutputs);
_configCompleter.complete(amplifyOutputs);
} on ConfigurationError catch (e, st) {
// Complete with the configuration error and reset the completer so
// that 1) `configure` can be called again and 2) listeners registered
Expand All @@ -146,14 +167,14 @@ abstract class AmplifyClass {
// handled by the developer, but since they are unrelated to
// configuration, listeners to `Amplify.asyncConfig` should be allowed to
// proceed with the validated configuration.
_configCompleter.complete(amplifyConfig.toAmplifyOutputs());
_configCompleter.complete(amplifyOutputs);
_configCompleter = Completer();
rethrow;
}
}

/// Configures all plugins in topologically-sorted order.
Future<void> _configurePlugins(AmplifyConfig config) async {
Future<void> _configurePlugins(AmplifyOutputs config) async {
await Future.wait(_addPluginFutures);
_addPluginFutures.clear();
final categories = <Category, AmplifyCategory>{
Expand Down
42 changes: 42 additions & 0 deletions packages/amplify_core/lib/src/config/auth/cognito/oauth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
// SPDX-License-Identifier: Apache-2.0

import 'package:amplify_core/amplify_core.dart';
import 'package:amplify_core/src/config/amplify_outputs/auth/auth_outputs.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:meta/meta.dart';

part 'oauth.g.dart';

Expand All @@ -27,6 +29,46 @@ class CognitoOAuthConfig
this.tokenUriQueryParameters,
});

@internal
factory CognitoOAuthConfig.fromAuthOutputs(AuthOutputs authOutputs) {
if (authOutputs.userPoolClientId == null) {
throw ConfigurationError('Invalid config: no User Pool Client Id found.');
}
if (authOutputs.oauth == null) {
throw ConfigurationError('Invalid config: no oAuth configuration found.');
}

final appClientId = authOutputs.userPoolClientId!;
final appClientSecret = authOutputs.appClientSecret;
final scopes = authOutputs.oauth!.scopes;
final signInUri = authOutputs.oauth!.signInUri;
final signOutUri = authOutputs.oauth!.signOutUri;
final signInUriQueryParameters =
authOutputs.oauth!.signInUriQueryParameters;
final signOutUriQueryParameters =
authOutputs.oauth!.signOutUriQueryParameters;
final signInRedirectUri = authOutputs.oauth!.redirectSignInUri.join(',');
final signOutRedirectUri = authOutputs.oauth!.redirectSignOutUri.join(',');
final webDomain = authOutputs.oauth!.domain;
final tokenUri = authOutputs.oauth!.tokenUri;
final tokenUriQueryParameters = authOutputs.oauth!.tokenUriQueryParameters;

return CognitoOAuthConfig(
appClientId: appClientId,
appClientSecret: appClientSecret,
scopes: scopes,
signInUri: signInUri,
signOutUri: signOutUri,
signInRedirectUri: signInRedirectUri,
signOutRedirectUri: signOutRedirectUri,
webDomain: webDomain,
signInUriQueryParameters: signInUriQueryParameters,
signOutUriQueryParameters: signOutUriQueryParameters,
tokenUri: tokenUri,
tokenUriQueryParameters: tokenUriQueryParameters,
);
}

factory CognitoOAuthConfig.fromJson(Map<String, Object?> json) =>
_$CognitoOAuthConfigFromJson(json);

Expand Down
26 changes: 26 additions & 0 deletions packages/amplify_core/lib/src/config/auth/cognito/user_pool.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// SPDX-License-Identifier: Apache-2.0

import 'package:amplify_core/amplify_core.dart';
import 'package:amplify_core/src/config/amplify_outputs/auth/auth_outputs.dart';
import 'package:meta/meta.dart';

part 'user_pool.g.dart';

Expand All @@ -17,6 +19,30 @@ class CognitoUserPoolConfig
this.endpoint,
});

@internal
factory CognitoUserPoolConfig.fromAuthOutputs(AuthOutputs authOutputs) {
if (authOutputs.userPoolId == null) {
throw ConfigurationError(
'Invalid Cognito User Pool config: No User Pool Id found',
);
}
if (authOutputs.userPoolClientId == null) {
throw ConfigurationError(
'Invalid Cognito User Pool config: No User Pool Client Id found',
);
}
return CognitoUserPoolConfig(
poolId: authOutputs.userPoolId!,
appClientId: authOutputs.userPoolClientId!,
appClientSecret: authOutputs.appClientSecret,
region: authOutputs.awsRegion,
endpoint: authOutputs.oauth?.domain,
hostedUI: authOutputs.oauth == null
? null
: CognitoOAuthConfig.fromAuthOutputs(authOutputs),
);
}

factory CognitoUserPoolConfig.fromJson(Map<String, Object?> json) =>
_$CognitoUserPoolConfigFromJson(json);
final String poolId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ abstract /* base */ class AmplifyPluginInterface {

/// Configures the plugin using the registered [config].
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

import 'package:amplify_core/amplify_core.dart';
import 'package:amplify_core/src/config/amplify_outputs/notifications/notifications_outputs.dart';

/// {@template amplify_core.push.service_provider_client}
/// A base class for new service providers to implement and add functionality
Expand All @@ -11,7 +12,7 @@ import 'package:amplify_core/amplify_core.dart';
abstract class ServiceProviderClient {
/// Initialize this client, used by the plugin during configuration.
Future<void> init({
required NotificationsPinpointPluginConfig config,
required NotificationsOutputs config,
required AmplifyAuthProviderRepository authProviderRepo,
});

Expand Down
8 changes: 4 additions & 4 deletions packages/amplify_core/test/amplify_class_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void main() {
class ConfigErrorPlugin extends AnalyticsPluginInterface {
@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) {
throw ConfigurationError('Could not configure');
Expand All @@ -82,7 +82,7 @@ class ConfigErrorPlugin extends AnalyticsPluginInterface {
class NonConfigErrorPlugin extends AnalyticsPluginInterface {
@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) {
throw const UnknownException('Could not configure');
Expand All @@ -92,7 +92,7 @@ class NonConfigErrorPlugin extends AnalyticsPluginInterface {
class SuccessPlugin extends AnalyticsPluginInterface {
@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
return;
Expand All @@ -107,7 +107,7 @@ class AsyncAddPlugin extends AnalyticsPluginInterface {

@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
_configureCompleter.complete();
Expand Down
6 changes: 3 additions & 3 deletions packages/amplify_core/test/plugin/auth_providers_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class AuthPlugin extends Fake implements AuthPluginInterface {

@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
_authProvider = authProviderRepo.getAuthProvider(
Expand Down Expand Up @@ -72,7 +72,7 @@ class ApiPlugin extends Fake implements APIPluginInterface {

@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
_authProvider = authProviderRepo.getAuthProvider(
Expand All @@ -83,7 +83,7 @@ class ApiPlugin extends Fake implements APIPluginInterface {

void main() {
group('AuthProviderRepository', () {
test('allows plugin interdependenices', () async {
test('allows plugin interdependencies', () async {
final apiPlugin = ApiPlugin();
final authPlugin = AuthPlugin();

Expand Down
10 changes: 4 additions & 6 deletions packages/amplify_datastore/lib/amplify_datastore.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class AmplifyDataStore extends DataStorePluginInterface

@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
if (config == null) {
Expand Down Expand Up @@ -100,15 +100,13 @@ class AmplifyDataStore extends DataStorePluginInterface
}

final apiPlugin = Amplify.API.plugins.firstOrNull;
final gqlConfig = config.api?.awsPlugin?.all.values.firstWhereOrNull(
(config) => config.endpointType == EndpointType.graphQL,
);
final gqlConfig = config.data;
if (apiPlugin != null && gqlConfig != null) {
// ignore: invalid_use_of_protected_member
final authProviders = apiPlugin.authProviders;
Map<String, String> endpoints = {};
config.api?.awsPlugin?.all.entries.forEach((e) {
endpoints[e.key] = e.value.authorizationType.name;
gqlConfig.entries.forEach((e) {
endpoints[e.key] = e.value.defaultAuthorizationType.name;
});
final nativePlugin = NativeAmplifyApi(authProviders);
NativeApiPlugin.setup(nativePlugin);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,17 @@ class AmplifyAnalyticsPinpointDart extends AnalyticsPluginInterface {

@override
Future<void> configure({
AmplifyConfig? config,
AmplifyOutputs? config,
required AmplifyAuthProviderRepository authProviderRepo,
}) async {
// Parse config values from amplifyconfiguration.json
if (config == null ||
config.analytics == null ||
config.analytics?.awsPlugin == null) {
throw ConfigurationError('No Pinpoint plugin config available.');
if (config?.analytics?.amazonPinpoint == null) {
throw ConfigurationError('No analytics config available.');
}

final pinpointConfig = config.analytics!.awsPlugin!;
final pinpointAppId = pinpointConfig.pinpointAnalytics.appId;
final region = pinpointConfig.pinpointAnalytics.region;
final pinpointConfig = config!.analytics!.amazonPinpoint!;
final pinpointAppId = pinpointConfig.appId;
final region = pinpointConfig.awsRegion;

// Prepare PinpointClient
final authProvider = authProviderRepo
Expand Down
Loading

0 comments on commit f58b6ae

Please sign in to comment.