Skip to content

Commit 79b3df9

Browse files
hyperrecursivephillwiggins
authored andcommitted
Added some missing async/await (#248)
* Updated dependencies. * ParseUser._handleResponse was calling saveInStorage() async without an await, which caused 'invalid session token' error if user ParseUser.currentUser() immediately after ParseUser.signUp() or ParseUser.login(). Added missing awaits in other places. * ParseUser was not updated in storage after a successful save() operation. Reason: no safeInStorage() after save() was called. Fix: calling saveInStorage() after save(). * Revert "Updated dependencies." This reverts commit dbbc5e8.
1 parent ba17643 commit 79b3df9

File tree

3 files changed

+32
-26
lines changed

3 files changed

+32
-26
lines changed

lib/src/objects/parse_base.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ abstract class ParseBase {
4545
if (value is ParseObject && value._areChildrenDirty(seenObjects)) {
4646
return true;
4747
}
48+
return false;
4849
});
4950
return false;
5051
}
@@ -175,8 +176,7 @@ abstract class ParseBase {
175176
/// Saves in storage
176177
Future<void> saveInStorage(String key) async {
177178
final String objectJson = json.encode(toJson(full: true));
178-
ParseCoreData().getStore()
179-
..setString(key, objectJson);
179+
await ParseCoreData().getStore().setString(key, objectJson);
180180
}
181181

182182
/// Sets type [T] from objectData
@@ -240,8 +240,7 @@ abstract class ParseBase {
240240
await unpin();
241241
final Map<String, dynamic> objectMap = parseEncode(this, full: true);
242242
final String json = jsonEncode(objectMap);
243-
ParseCoreData().getStore()
244-
..setString(objectId, json);
243+
await ParseCoreData().getStore().setString(objectId, json);
245244
return true;
246245
} else {
247246
return false;
@@ -253,8 +252,7 @@ abstract class ParseBase {
253252
/// Replicates Android SDK pin process and saves object to storage
254253
Future<bool> unpin({String key}) async {
255254
if (objectId != null) {
256-
ParseCoreData().getStore()
257-
..remove(key ?? objectId);
255+
await ParseCoreData().getStore().remove(key ?? objectId);
258256
return true;
259257
}
260258

lib/src/objects/parse_installation.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class ParseInstallation extends ParseObject {
127127

128128
/// Gets the locally stored installation
129129
static Future<ParseInstallation> _getFromLocalStore() async {
130-
final CoreStore coreStore = await ParseCoreData().getStore();
130+
final CoreStore coreStore = ParseCoreData().getStore();
131131

132132
final String installationJson =
133133
await coreStore.getString(keyParseStoreInstallation);
@@ -204,17 +204,17 @@ class ParseInstallation extends ParseObject {
204204
}
205205

206206
///Subscribes the device to a channel of push notifications.
207-
void subscribeToChannel(String value) {
207+
Future<void> subscribeToChannel(String value) async {
208208
final List<dynamic> channel = <String>[value];
209209
setAddAllUnique('channels', channel);
210-
save();
210+
await save();
211211
}
212212

213213
///Unsubscribes the device to a channel of push notifications.
214-
void unsubscribeFromChannel(String value) {
214+
Future<void> unsubscribeFromChannel(String value) async {
215215
final List<dynamic> channel = <String>[value];
216216
setRemove('channels', channel);
217-
save();
217+
await save();
218218
}
219219

220220
///Returns an <List<String>> containing all the channel names this device is subscribed to.

lib/src/objects/parse_user.dart

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
100100
try {
101101
final Uri url = getSanitisedUri(_client, '$keyEndPointUserName');
102102
final Response response = await _client.get(url, headers: headers);
103-
return _handleResponse(_getEmptyUser(), response, ParseApiRQ.currentUser,
103+
return await _handleResponse(_getEmptyUser(), response, ParseApiRQ.currentUser,
104104
_debug, _getEmptyUser().parseClassName);
105105
} on Exception catch (e) {
106106
return handleException(
@@ -144,7 +144,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
144144
},
145145
body: body);
146146

147-
return _handleResponse(
147+
return await _handleResponse(
148148
this, response, ParseApiRQ.signUp, _debug, parseClassName);
149149
} on Exception catch (e) {
150150
return handleException(e, ParseApiRQ.signUp, _debug, parseClassName);
@@ -170,7 +170,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
170170
keyHeaderRevocableSession: '1',
171171
});
172172

173-
return _handleResponse(
173+
return await _handleResponse(
174174
this, response, ParseApiRQ.login, _debug, parseClassName);
175175
} on Exception catch (e) {
176176
return handleException(e, ParseApiRQ.login, _debug, parseClassName);
@@ -193,7 +193,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
193193
}
194194
}));
195195

196-
return _handleResponse(
196+
return await _handleResponse(
197197
this, response, ParseApiRQ.loginAnonymous, _debug, parseClassName);
198198
} on Exception catch (e) {
199199
return handleException(
@@ -220,7 +220,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
220220
'authData': <String, dynamic>{provider: authData}
221221
}));
222222

223-
return _handleResponse(
223+
return await _handleResponse(
224224
this, response, ParseApiRQ.loginWith, _debug, parseClassName);
225225
} on Exception catch (e) {
226226
return handleException(e, ParseApiRQ.loginWith, _debug, parseClassName);
@@ -246,7 +246,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
246246
final Response response = await _client.post(url,
247247
headers: <String, String>{keyHeaderSessionToken: sessionId});
248248

249-
return _handleResponse(
249+
return await _handleResponse(
250250
this, response, ParseApiRQ.logout, _debug, parseClassName);
251251
} on Exception catch (e) {
252252
return handleException(e, ParseApiRQ.logout, _debug, parseClassName);
@@ -259,7 +259,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
259259
final Response response = await _client.post(
260260
'${_client.data.serverUrl}$keyEndPointVerificationEmail',
261261
body: json.encode(<String, dynamic>{keyVarEmail: emailAddress}));
262-
return _handleResponse(this, response,
262+
return await _handleResponse(this, response,
263263
ParseApiRQ.verificationEmailRequest, _debug, parseClassName);
264264
} on Exception catch (e) {
265265
return handleException(
@@ -273,7 +273,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
273273
final Response response = await _client.post(
274274
'${_client.data.serverUrl}$keyEndPointRequestPasswordReset',
275275
body: json.encode(<String, dynamic>{keyVarEmail: emailAddress}));
276-
return _handleResponse(
276+
return await _handleResponse(
277277
this, response, ParseApiRQ.requestPasswordReset, _debug,
278278
parseClassName);
279279
} on Exception catch (e) {
@@ -289,19 +289,27 @@ class ParseUser extends ParseObject implements ParseCloneable {
289289
@override
290290
Future<ParseResponse> save() async {
291291
if (objectId == null) {
292-
return signUp();
292+
return await signUp();
293293
} else {
294-
return super.save();
294+
final ParseResponse response = await super.save();
295+
if (response.success) {
296+
await _onResponseSuccess();
297+
}
298+
return response;
295299
}
296300
}
297301

302+
Future<void> _onResponseSuccess() async {
303+
await saveInStorage(keyParseStoreUser);
304+
}
305+
298306
/// Removes a user from Parse Server locally and online
299307
Future<ParseResponse> destroy() async {
300308
if (objectId != null) {
301309
try {
302310
final Uri url = getSanitisedUri(_client, '$_path/$objectId');
303311
final Response response = await _client.delete(url);
304-
return _handleResponse(
312+
return await _handleResponse(
305313
this, response, ParseApiRQ.destroy, _debug, parseClassName);
306314
} on Exception catch (e) {
307315
return handleException(e, ParseApiRQ.destroy, _debug, parseClassName);
@@ -334,7 +342,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
334342

335343
static Future<dynamic> _getUserFromLocalStore(
336344
{ParseCloneable cloneable}) async {
337-
final CoreStore coreStore = await ParseCoreData().getStore();
345+
final CoreStore coreStore = ParseCoreData().getStore();
338346
final String userJson = await coreStore.getString(keyParseStoreUser);
339347

340348
if (userJson != null) {
@@ -351,8 +359,8 @@ class ParseUser extends ParseObject implements ParseCloneable {
351359
}
352360

353361
/// Handles all the response data for this class
354-
static ParseResponse _handleResponse(ParseUser user, Response response,
355-
ParseApiRQ type, bool debug, String className) {
362+
static Future<ParseResponse> _handleResponse(ParseUser user, Response response,
363+
ParseApiRQ type, bool debug, String className) async {
356364
final ParseResponse parseResponse =
357365
handleResponse<ParseUser>(user, response, type, debug, className);
358366

@@ -371,7 +379,7 @@ class ParseUser extends ParseObject implements ParseCloneable {
371379
return parseResponse;
372380
} else {
373381
final ParseUser user = parseResponse.result;
374-
user?.saveInStorage(keyParseStoreUser);
382+
await user?._onResponseSuccess();
375383
return parseResponse;
376384
}
377385
}

0 commit comments

Comments
 (0)