From 21ce56f6e7d869f0120b5701758235a7766b56ca Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Fakouri Date: Mon, 16 Oct 2023 23:43:35 +0330 Subject: [PATCH] feat: Add `context` in `ParseObject` (#970) --- packages/dart/CHANGELOG.md | 8 ++++- .../dart/lib/src/base/parse_constants.dart | 3 +- .../dart/lib/src/objects/parse_file_base.dart | 2 +- .../lib/src/objects/parse_installation.dart | 5 +-- .../dart/lib/src/objects/parse_object.dart | 31 ++++++++++++++----- packages/dart/lib/src/objects/parse_user.dart | 4 +-- packages/dart/pubspec.yaml | 2 +- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/packages/dart/CHANGELOG.md b/packages/dart/CHANGELOG.md index af6613f67..60e84f80e 100644 --- a/packages/dart/CHANGELOG.md +++ b/packages/dart/CHANGELOG.md @@ -1,3 +1,9 @@ +## [6.1.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-6.0.0...dart-6.1.0) (2023-10-17) + +### Features + +* Add `context` in `ParseObject` ([#970](https://github.com/parse-community/Parse-SDK-Flutter/pull/970)) + ## [6.0.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-5.1.3...dart-6.0.0) (2023-10-16) ### BREAKING CHANGES @@ -7,7 +13,7 @@ ### Features * Add support for Dart 3.1, remove support for Dart 2.18 ([#969](https://github.com/parse-community/Parse-SDK-Flutter/pull/969)) - + ## [5.1.3](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-5.1.2...dart-5.1.3) (2023-07-18) ### Bug Fixes diff --git a/packages/dart/lib/src/base/parse_constants.dart b/packages/dart/lib/src/base/parse_constants.dart index fa085fc1c..d3030f0f3 100644 --- a/packages/dart/lib/src/base/parse_constants.dart +++ b/packages/dart/lib/src/base/parse_constants.dart @@ -1,7 +1,7 @@ part of flutter_parse_sdk; // Library -const String keySdkVersion = '6.0.0'; +const String keySdkVersion = '6.1.0'; const String keyLibraryName = 'Flutter Parse SDK'; // End Points @@ -44,6 +44,7 @@ const String keyFileClassname = 'ParseFile'; // Headers const String keyHeaderSessionToken = 'X-Parse-Session-Token'; const String keyHeaderRevocableSession = 'X-Parse-Revocable-Session'; +const String keyHeaderCloudContext = 'X-Parse-Cloud-Context'; const String keyHeaderUserAgent = 'user-agent'; const String keyHeaderApplicationId = 'X-Parse-Application-Id'; const String keyHeaderContentType = 'content-type'; diff --git a/packages/dart/lib/src/objects/parse_file_base.dart b/packages/dart/lib/src/objects/parse_file_base.dart index 08cabff6e..3f3bf5f47 100644 --- a/packages/dart/lib/src/objects/parse_file_base.dart +++ b/packages/dart/lib/src/objects/parse_file_base.dart @@ -40,7 +40,7 @@ abstract class ParseFileBase extends ParseObject { /// Uploads a file to Parse Server @override - Future save() async { + Future save({dynamic context}) async { return upload(); } diff --git a/packages/dart/lib/src/objects/parse_installation.dart b/packages/dart/lib/src/objects/parse_installation.dart index 12c891849..195b8d71b 100644 --- a/packages/dart/lib/src/objects/parse_installation.dart +++ b/packages/dart/lib/src/objects/parse_installation.dart @@ -113,7 +113,8 @@ class ParseInstallation extends ParseObject { } @override - Future create({bool allowCustomObjectId = false}) async { + Future create( + {bool allowCustomObjectId = false, dynamic context}) async { final bool isCurrent = await ParseInstallation.isCurrent(this); if (isCurrent) { await _updateInstallation(); @@ -130,7 +131,7 @@ class ParseInstallation extends ParseObject { /// Saves the current installation @override - Future save() async { + Future save({dynamic context}) async { final bool isCurrent = await ParseInstallation.isCurrent(this); if (isCurrent) { await _updateInstallation(); diff --git a/packages/dart/lib/src/objects/parse_object.dart b/packages/dart/lib/src/objects/parse_object.dart index dc60239a8..09891c2f1 100644 --- a/packages/dart/lib/src/objects/parse_object.dart +++ b/packages/dart/lib/src/objects/parse_object.dart @@ -86,7 +86,8 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Creates a new object and saves it online /// /// Prefer using [save] over [create] - Future create({bool allowCustomObjectId = false}) async { + Future create( + {bool allowCustomObjectId = false, dynamic context}) async { try { final Uri url = getSanitisedUri(_client, _path); final String body = json.encode(toJson( @@ -96,8 +97,17 @@ class ParseObject extends ParseBase implements ParseCloneable { _saveChanges(); - final ParseNetworkResponse result = - await _client.post(url.toString(), data: body); + final Map headers = { + keyHeaderContentType: keyHeaderContentTypeJson, + }; + + if (context != null) { + headers + .addAll({keyHeaderCloudContext: json.encode(parseEncode(context))}); + } + + final ParseNetworkResponse result = await _client.post(url.toString(), + data: body, options: ParseNetworkOptions(headers: headers)); final response = handleResponse( this, result, ParseApiRQ.create, _debug, parseClassName); @@ -120,7 +130,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// The object should hold an [objectId] in order to update it /// /// Prefer using [save] over [update] - Future update() async { + Future update({dynamic context}) async { assert( objectId != null && (objectId?.isNotEmpty ?? false), "Can't update a parse object while the objectId property is null or empty", @@ -133,9 +143,14 @@ class ParseObject extends ParseBase implements ParseCloneable { _saveChanges(); final Map headers = { - keyHeaderContentType: keyHeaderContentTypeJson + keyHeaderContentType: keyHeaderContentTypeJson, }; + if (context != null) { + headers + .addAll({keyHeaderCloudContext: json.encode(parseEncode(context))}); + } + final ParseNetworkResponse result = await _client.put(url.toString(), data: body, options: ParseNetworkOptions(headers: headers)); @@ -185,14 +200,14 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Its safe to call this function aging if an error occurred while saving. /// /// Prefer using [save] over [update] and [create] - Future save() async { + Future save({dynamic context}) async { final ParseResponse childrenResponse = await _saveChildren(this); if (childrenResponse.success) { ParseResponse? response; if (objectId == null) { - response = await create(); + response = await create(context: context); } else if (_isDirty(false)) { - response = await update(); + response = await update(context: context); } if (response != null) { diff --git a/packages/dart/lib/src/objects/parse_user.dart b/packages/dart/lib/src/objects/parse_user.dart index 8bdf0c7d3..6b24095ca 100644 --- a/packages/dart/lib/src/objects/parse_user.dart +++ b/packages/dart/lib/src/objects/parse_user.dart @@ -393,7 +393,7 @@ class ParseUser extends ParseObject implements ParseCloneable { /// If changes are made to the current user, call save to sync them with /// Parse Server @override - Future save() async { + Future save({dynamic context}) async { if (objectId == null) { return await signUp(); } else { @@ -406,7 +406,7 @@ class ParseUser extends ParseObject implements ParseCloneable { } @override - Future update() async { + Future update({dynamic context}) async { if (objectId == null) { return await signUp(); } else { diff --git a/packages/dart/pubspec.yaml b/packages/dart/pubspec.yaml index 56e5d407f..4ef783246 100644 --- a/packages/dart/pubspec.yaml +++ b/packages/dart/pubspec.yaml @@ -1,6 +1,6 @@ name: parse_server_sdk description: The Dart SDK to connect to Parse Server. Build your apps faster with Parse Platform, the complete application stack. -version: 6.0.0 +version: 6.1.0 homepage: https://parseplatform.org repository: https://github.com/parse-community/Parse-SDK-Flutter issue_tracker: https://github.com/parse-community/Parse-SDK-Flutter/issues