Skip to content

Commit 72b11a1

Browse files
authored
fix: Setting atomic operation on Parse Object returns operation instead of prospective value (#860)
1 parent 2e133ff commit 72b11a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3268
-617
lines changed

packages/dart/CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
## [5.0.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-4.0.2...dart-5.0.0) (UNRELEASED)
1+
## [5.0.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-4.0.2...dart-5.0.0) (2023-05-14)
22

33
### BREAKING CHANGES
44

5-
* The minimum required Dart SDK version is 2.18.0 ([#867](https://github.com/parse-community/Parse-SDK-Flutter/pull/867))
5+
* The minimum required Dart SDK version is 2.18.0. ([#867](https://github.com/parse-community/Parse-SDK-Flutter/pull/867))
6+
* Performing an atomic update on a key of a Parse Object now returns the prospective value, instead of a map of the operation that will be sent to the server; for example for a Parse Object `obj` with a key `count`, the atomic update `obj.setIncrement('count', 1);` previously returned the value `{__op: Increment, amount: 1}` but now returns the prospective result of the operation, which would be `1` if the key's previous value was `0`. ([#860](https://github.com/parse-community/Parse-SDK-Flutter/pull/860))
67

78
### Bug Fixes
89

910
* Incorrect Dart and Flutter SDKs compatibility range ([#867](https://github.com/parse-community/Parse-SDK-Flutter/pull/867))
11+
* Setting atomic operation on Parse Object returns operation instead of prospective value ([#860](https://github.com/parse-community/Parse-SDK-Flutter/pull/860))
1012

1113
## [4.0.2](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-4.0.1...dart-4.0.2) (2023-03-23)
1214

packages/dart/lib/parse_server_sdk.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ library flutter_parse_sdk;
22

33
import 'dart:async';
44
import 'dart:convert';
5-
import 'package:universal_io/io.dart';
65
import 'dart:math';
76
import 'dart:typed_data';
7+
8+
import 'package:collection/collection.dart';
89
import 'package:dio/dio.dart';
910
import 'package:meta/meta.dart';
1011
import 'package:mime_type/mime_type.dart';
@@ -14,6 +15,7 @@ import 'package:sembast/sembast_io.dart';
1415
import 'package:sembast_web/sembast_web.dart';
1516
import 'package:timezone/data/latest.dart' as tz;
1617
import 'package:timezone/timezone.dart' as tz;
18+
import 'package:universal_io/io.dart';
1719
import 'package:uuid/uuid.dart';
1820
import 'package:web_socket_channel/web_socket_channel.dart';
1921
import 'package:xxtea/xxtea.dart';
@@ -34,20 +36,30 @@ part 'src/network/parse_connectivity.dart';
3436
part 'src/network/parse_live_query.dart';
3537
part 'src/network/parse_query.dart';
3638
part 'src/objects/parse_acl.dart';
39+
part 'src/objects/parse_array.dart';
3740
part 'src/objects/parse_base.dart';
3841
part 'src/objects/parse_cloneable.dart';
3942
part 'src/objects/parse_config.dart';
4043
part 'src/objects/parse_error.dart';
4144
part 'src/objects/parse_file.dart';
45+
part 'src/objects/parse_number.dart';
4246
part 'src/objects/parse_file_base.dart';
4347
part 'src/objects/parse_file_web.dart';
4448
part 'src/objects/parse_function.dart';
4549
part 'src/objects/parse_geo_point.dart';
4650
part 'src/objects/parse_installation.dart';
47-
part 'src/objects/parse_merge.dart';
4851
part 'src/objects/parse_object.dart';
52+
part 'src/objects/parse_exception.dart';
53+
part 'src/objects/parse_operation/parse_add_operation.dart';
54+
part 'src/objects/parse_operation/parse_add_relation_operation.dart';
55+
part 'src/objects/parse_operation/parse_add_unique_operation.dart';
56+
part 'src/objects/parse_operation/parse_increment_operation.dart';
57+
part 'src/objects/parse_operation/parse_operation.dart';
58+
part 'src/objects/parse_operation/parse_remove_operation.dart';
59+
part 'src/objects/parse_operation/parse_remove_relation_operation.dart';
4960
part 'src/objects/parse_relation.dart';
5061
part 'src/objects/parse_response.dart';
62+
part 'src/objects/parse_save_state_aware_child.dart';
5163
part 'src/objects/parse_session.dart';
5264
part 'src/objects/parse_user.dart';
5365
part 'src/objects/response/parse_error_response.dart';
@@ -66,6 +78,7 @@ part 'src/utils/parse_live_list.dart';
6678
part 'src/utils/parse_logger.dart';
6779
part 'src/utils/parse_login_helpers.dart';
6880
part 'src/utils/parse_utils.dart';
81+
part 'src/utils/valuable.dart';
6982

7083
class Parse {
7184
bool _hasBeenInitialized = false;

packages/dart/lib/src/base/parse_constants.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
part of flutter_parse_sdk;
22

33
// Library
4-
const String keySdkVersion = '4.0.2';
4+
const String keySdkVersion = '5.0.0';
55
const String keyLibraryName = 'Flutter Parse SDK';
66

77
// End Points

packages/dart/lib/src/network/parse_query.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ class QueryBuilder<T extends ParseObject> {
5050
T object;
5151
List<MapEntry<String, dynamic>> queries = <MapEntry<String, dynamic>>[];
5252
final Map<String, dynamic> limiters = <String, dynamic>{};
53+
final Map<String, dynamic> extraOptions = <String, dynamic>{};
54+
55+
/// Used by ParseRelation getQuery()
56+
void setRedirectClassNameForKey(String key) {
57+
extraOptions['redirectClassNameForKey'] = key;
58+
}
5359

5460
/// Adds a limit to amount of results return from Parse
5561
void setLimit(int limit) {
@@ -408,7 +414,7 @@ class QueryBuilder<T extends ParseObject> {
408414
/// Builds the query for Parse
409415
String buildQuery() {
410416
queries = _checkForMultipleColumnInstances(queries);
411-
return 'where={${buildQueries(queries)}}${getLimiters(limiters)}';
417+
return 'where={${buildQueries(queries)}}${getLimiters(limiters)}${getExtraOptions(extraOptions)}';
412418
}
413419

414420
/// Builds the query relational for Parse
@@ -528,6 +534,15 @@ class QueryBuilder<T extends ParseObject> {
528534
return result;
529535
}
530536

537+
/// Adds extra options to the query
538+
String getExtraOptions(Map<String, dynamic> map) {
539+
String result = '';
540+
map.forEach((String key, dynamic value) {
541+
result = '$result&$key=$value';
542+
});
543+
return result;
544+
}
545+
531546
/// Adds the limiters to the query relational, i.e. skip=10, limit=10
532547
String getLimitersRelational(Map<String, dynamic> map) {
533548
String result = '';
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
part of flutter_parse_sdk;
2+
3+
class _ParseArray implements _Valuable<List>, _ParseSaveStateAwareChild {
4+
_ParseArray({this.setMode = false});
5+
6+
bool setMode;
7+
8+
List _savedArray = [];
9+
List estimatedArray = [];
10+
11+
set savedArray(List array) {
12+
_savedArray = array.toList();
13+
estimatedArray = array.toList();
14+
}
15+
16+
List get savedArray => _savedArray;
17+
18+
_ParseArrayOperation? lastPreformedOperation;
19+
20+
_ParseArray preformArrayOperation(
21+
_ParseArrayOperation arrayOperation,
22+
) {
23+
arrayOperation.mergeWithPrevious(lastPreformedOperation ?? this);
24+
25+
lastPreformedOperation = arrayOperation;
26+
27+
estimatedArray = lastPreformedOperation!.value.toList();
28+
29+
if (setMode) {
30+
lastPreformedOperation = null;
31+
}
32+
33+
return this;
34+
}
35+
36+
Object toJson({bool full = false}) {
37+
if (full) {
38+
return {
39+
'className': 'ParseArray',
40+
'estimatedArray': parseEncode(estimatedArray, full: full),
41+
'savedArray': parseEncode(_savedArray, full: full),
42+
'lastPreformedOperation': lastPreformedOperation?.toJson(full: full)
43+
};
44+
}
45+
46+
return lastPreformedOperation?.toJson(full: full) ??
47+
parseEncode(estimatedArray, full: full);
48+
}
49+
50+
factory _ParseArray.fromFullJson(Map<String, dynamic> json) {
51+
return _ParseArray()
52+
.._savedArray = parseDecode(json['savedArray'])
53+
..estimatedArray = parseDecode(json['estimatedArray'])
54+
..lastPreformedOperation = json['lastPreformedOperation'] == null
55+
? null
56+
: _ParseArrayOperation.fromFullJson(json['lastPreformedOperation']);
57+
}
58+
59+
@override
60+
List getValue() {
61+
return estimatedArray.toList();
62+
}
63+
64+
_ParseArrayOperation? _lastPreformedOperationBeforeSaving;
65+
List? _estimatedArrayBeforeSaving;
66+
67+
@override
68+
@mustCallSuper
69+
void onSaved() {
70+
setMode = false;
71+
_savedArray.clear();
72+
_savedArray.addAll(_estimatedArrayBeforeSaving ?? []);
73+
_estimatedArrayBeforeSaving = null;
74+
75+
if (_lastPreformedOperationBeforeSaving == lastPreformedOperation) {
76+
// No operations were performed during the save process
77+
lastPreformedOperation = null;
78+
} else {
79+
// remove the saved objects and keep the new added objects while saving
80+
if (lastPreformedOperation is _ParseRemoveOperation) {
81+
lastPreformedOperation?.valueForApiRequest
82+
.retainWhere((e) => _savedArray.contains(e));
83+
} else {
84+
lastPreformedOperation?.valueForApiRequest
85+
.removeWhere((e) => _savedArray.contains(e));
86+
}
87+
}
88+
89+
_lastPreformedOperationBeforeSaving = null;
90+
}
91+
92+
@override
93+
@mustCallSuper
94+
void onSaving() {
95+
_lastPreformedOperationBeforeSaving = lastPreformedOperation;
96+
_estimatedArrayBeforeSaving = estimatedArray.toList();
97+
}
98+
99+
@override
100+
@mustCallSuper
101+
void onRevertSaving() {
102+
_lastPreformedOperationBeforeSaving = null;
103+
_estimatedArrayBeforeSaving = null;
104+
}
105+
106+
@override
107+
@mustCallSuper
108+
void onErrorSaving() {
109+
_lastPreformedOperationBeforeSaving = null;
110+
_estimatedArrayBeforeSaving = null;
111+
}
112+
113+
@override
114+
@mustCallSuper
115+
void onClearUnsaved() {
116+
estimatedArray = savedArray;
117+
lastPreformedOperation = null;
118+
_lastPreformedOperationBeforeSaving = null;
119+
_estimatedArrayBeforeSaving = null;
120+
}
121+
}

0 commit comments

Comments
 (0)