11package io.realm.admin
22
3+ import android.os.SystemClock
34import io.realm.log.LogLevel
45import io.realm.log.RealmLog
56import io.realm.mongodb.App
@@ -100,28 +101,55 @@ class ServerAdmin(private val app: App) {
100101 */
101102 fun setAutomaticConfirmation (enabled : Boolean ) {
102103 val providerId: String = getLocalUserPassProviderId()
104+ val url = " $baseUrl /groups/$groupId /apps/$appId /auth_providers/$providerId "
103105 var request = Request .Builder ()
104- .url(" $baseUrl /groups/ $groupId /apps/ $appId /auth_providers/ $providerId " )
106+ .url(url )
105107 .get()
106108 val authProviderConfig = JSONObject (executeRequest(request, true ))
107109 authProviderConfig.getJSONObject(" config" ).apply {
108110 put(" autoConfirm" , enabled)
109- put(" emailConfirmationUrl" , " http://realm.io/confirm-user" )
110111 }
111112 // Change autoConfirm and update the provider
112113 request = Request .Builder ()
113- .url(" $baseUrl /groups/ $groupId /apps/ $appId /auth_providers/ $providerId " )
114+ .url(url )
114115 .patch(RequestBody .create(json, authProviderConfig.toString()))
115- executeRequest(request)
116+ executeRequest(request, true )
117+
118+ request = Request .Builder ()
119+ .url(url)
120+ .get()
121+ val config = JSONObject (executeRequest(request, true ))
122+ RealmLog .error(" SetAutomaticConfirmation($enabled ): ${config.toString(4 )} " )
123+ waitForDeployment()
124+ }
125+
126+ private fun waitForDeployment () {
127+ // TODO Attempt to work-around, what looks like a race condition on the server deploying
128+ // changes to the server. Even though the /deployments endpoint report success, it seems
129+ // like the change hasn't propagated fully. This usually surfaces as registerUser errors
130+ // where it tries to use the customFunc instead of automatically registering.
131+ val url = " $baseUrl /groups/$groupId /apps/$appId /deployments"
132+ var request = Request .Builder ()
133+ .url(url)
134+ .get()
135+ val deployments = JSONArray (executeRequest(request, true ))
136+ val dep = deployments[0 ] as JSONObject
137+ if (dep.getString(" status" ) != " successful" ) {
138+ RealmLog .error(" Failed to deploy: ${dep.toString(4 )} " )
139+ }
140+
141+ // Work-around for /deployments reporting success, but /register still failing.
142+ SystemClock .sleep(5000 )
116143 }
117144
118145 /* *
119146 * Toggle whether or not custom confirmation functions are enabled.
120147 */
121148 fun setCustomConfirmation (enabled : Boolean ) {
122149 val providerId: String = getLocalUserPassProviderId()
150+ val url = " $baseUrl /groups/$groupId /apps/$appId /auth_providers/$providerId "
123151 var request = Request .Builder ()
124- .url(" $baseUrl /groups/ $groupId /apps/ $appId /auth_providers/ $providerId " )
152+ .url(url )
125153 .get()
126154 val authProviderConfig = JSONObject (executeRequest(request, true ))
127155
@@ -131,9 +159,16 @@ class ServerAdmin(private val app: App) {
131159 }
132160 // Change autoConfirm and update the provider
133161 request = Request .Builder ()
134- .url(" $baseUrl /groups/ $groupId /apps/ $appId /auth_providers/ $providerId " )
162+ .url(url )
135163 .patch(RequestBody .create(json, authProviderConfig.toString()))
136- executeRequest(request)
164+ executeRequest(request, true )
165+
166+ request = Request .Builder ()
167+ .url(url)
168+ .get()
169+ val config = JSONObject (executeRequest(request, true ))
170+ RealmLog .error(" setCustomConfirmation($enabled ): ${config.toString(4 )} " )
171+ waitForDeployment()
137172 }
138173
139174 val JSON = MediaType .parse(" application/json; charset=utf-8" )
@@ -240,4 +275,5 @@ class ServerAdmin(private val app: App) {
240275 val result = JSONObject (executeRequest(builder))
241276 return result.getString(" key" )
242277 }
278+
243279}
0 commit comments