Skip to content

Commit d639291

Browse files
dnys1diegocstn
andauthored
fix(datastore): Sync engine fallback to API plugin config (#1460)
* Fallback to plugin config * Add conditional import for API plugin * Clean up * Clean up * chore: update unit test Co-authored-by: Diego Costantino <[email protected]>
1 parent 2339458 commit d639291

File tree

2 files changed

+61
-13
lines changed

2 files changed

+61
-13
lines changed

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/StorageEngine+SyncRequirement.swift

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extension StorageEngine {
2020
return
2121
}
2222

23-
let authPluginRequired = requiresAuthPlugin()
23+
let authPluginRequired = requiresAuthPlugin(api)
2424

2525
guard authPluginRequired else {
2626
syncEngine?.start(api: api, auth: nil)
@@ -38,7 +38,7 @@ extension StorageEngine {
3838
completion(.successfulVoid)
3939
}
4040

41-
private func tryGetAPIPlugin() -> APICategoryGraphQLBehavior? {
41+
private func tryGetAPIPlugin() -> APICategoryPlugin? {
4242
do {
4343
return try Amplify.API.getPlugin(for: validAPIPluginKey)
4444
} catch {
@@ -54,20 +54,60 @@ extension StorageEngine {
5454
}
5555
}
5656

57-
private func requiresAuthPlugin() -> Bool {
58-
let modelsRequireAuthPlugin = ModelRegistry.modelSchemas.contains {
59-
$0.isSyncable && $0.hasAuthenticationRules && $0.authRules.requireAuthPlugin
57+
private func requiresAuthPlugin(_ apiPlugin: APICategoryPlugin) -> Bool {
58+
let modelsRequireAuthPlugin = ModelRegistry.modelSchemas.contains { schema in
59+
guard schema.isSyncable && schema.hasAuthenticationRules else {
60+
return false
61+
}
62+
if let rulesRequireAuthPlugin = schema.authRules.requireAuthPlugin {
63+
return rulesRequireAuthPlugin
64+
}
65+
66+
#if canImport(AWSAPIPlugin)
67+
// Fall back to the plugin configuration if a determination cannot be made from the auth rules.
68+
guard let awsPlugin = apiPlugin as? AWSAPIPlugin else {
69+
// No determination can be made. Throw error?
70+
return false
71+
}
72+
return awsPlugin.hasAuthPluginRequirement
73+
#else
74+
return false
75+
#endif
6076
}
6177
return modelsRequireAuthPlugin
6278
}
6379
}
6480

65-
internal extension AuthRule {
81+
#if canImport(AWSAPIPlugin)
82+
internal extension AWSAPIPlugin {
83+
var hasAuthPluginRequirement: Bool {
84+
return pluginConfig.endpoints.values.contains {
85+
$0.authorizationType.requiresAuthPlugin
86+
}
87+
}
88+
}
89+
#endif
90+
91+
internal extension AWSAuthorizationType {
6692
var requiresAuthPlugin: Bool {
93+
switch self {
94+
case .none, .apiKey, .openIDConnect, .function:
95+
return false
96+
case .awsIAM, .amazonCognitoUserPools:
97+
return true
98+
}
99+
}
100+
}
101+
102+
internal extension AuthRule {
103+
var requiresAuthPlugin: Bool? {
104+
guard let provider = provider else {
105+
return nil
106+
}
67107
switch provider {
68108
// OIDC, Function and API key providers don't need
69109
// Auth plugin
70-
case .oidc, .function, .apiKey, .none:
110+
case .oidc, .function, .apiKey:
71111
return false
72112
case .userPools, .iam:
73113
return true
@@ -77,8 +117,16 @@ internal extension AuthRule {
77117

78118
internal extension AuthRules {
79119
/// Convenience method to check whether we need Auth plugin
80-
/// - Returns: true If **any** of the rules uses a provider that requires the Auth plugin
81-
var requireAuthPlugin: Bool {
82-
contains { $0.requiresAuthPlugin }
120+
/// - Returns: true If **any** of the rules uses a provider that requires the Auth plugin, `nil` if a determination cannot be made
121+
var requireAuthPlugin: Bool? {
122+
for rule in self {
123+
guard let requiresAuthPlugin = rule.requiresAuthPlugin else {
124+
return nil
125+
}
126+
if requiresAuthPlugin {
127+
return true
128+
}
129+
}
130+
return false
83131
}
84132
}

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/StorageEngineSyncRequirementsTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class StorageEngineSyncRequirementsTests: XCTestCase {
2121
AuthRule(allow: .private, provider: .iam),
2222
AuthRule(allow: .owner, provider: .userPools)
2323
]
24-
XCTAssertTrue(authRules.requireAuthPlugin)
24+
XCTAssertTrue(authRules.requireAuthPlugin!)
2525
}
2626

2727
/// Given: a list of auth rules
@@ -32,7 +32,7 @@ class StorageEngineSyncRequirementsTests: XCTestCase {
3232
AuthRule(allow: .owner, provider: .function),
3333
AuthRule(allow: .owner, provider: .iam)
3434
]
35-
XCTAssertTrue(authRules.requireAuthPlugin)
35+
XCTAssertTrue(authRules.requireAuthPlugin!)
3636
}
3737

3838
func testDoesNotRequireAuthPlugin() {
@@ -41,6 +41,6 @@ class StorageEngineSyncRequirementsTests: XCTestCase {
4141
AuthRule(allow: .owner, provider: .function),
4242
AuthRule(allow: .public, provider: .apiKey)
4343
]
44-
XCTAssertFalse(authRules.requireAuthPlugin)
44+
XCTAssertFalse(authRules.requireAuthPlugin!)
4545
}
4646
}

0 commit comments

Comments
 (0)