From d1259d50296cdbac5ff85dc8119a4a1b6e4976f0 Mon Sep 17 00:00:00 2001 From: rodrigosmarques Date: Fri, 8 Mar 2019 09:16:03 -0300 Subject: [PATCH 1/4] BugFix: Counters e Array Operations BugFix: Counters e Array Operations --- lib/src/objects/parse_object.dart | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index 5c28f8e8a..d39757582 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -84,7 +84,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Removes an element from an Array Future remove(String key, dynamic values) async { if (key != null) { - return await _sortArrays(ParseApiRQ.remove, "Remove", key, [values]); + return await _sortArrays(ParseApiRQ.remove, "Remove", key, values); } else { return null; } @@ -130,11 +130,15 @@ class ParseObject extends ParseBase implements ParseCloneable { Future _sortArrays(ParseApiRQ apiRQType, String arrayAction, String key, List values) async { try { - var uri = "${ParseCoreData().serverUrl}$_path"; - var body = - "{\"$key\":{\"__op\": \"$arrayAction\", \"objects\": ${parseEncode(values)}"; - var result = await _client.put(uri, body: body); - return handleResponse(this, result, apiRQType, _debug, className); + if (objectId != null) { + var uri = "${ParseCoreData().serverUrl}$_path/$objectId"; + var body = + "{\"$key\":{\"__op\":\"$arrayAction\",\"objects\":${json.encode(parseEncode(values))}}}"; + var result = await _client.put(uri, body: body); + return handleResponse(this, result, apiRQType, _debug, className); + } else { + return null; + } } on Exception catch (e) { return handleException(e, apiRQType, _debug, className); } From 5e2d6a14980af4b4d028da4679c92b26a9af4fe1 Mon Sep 17 00:00:00 2001 From: Rodrigo de Souza Marques Date: Fri, 8 Mar 2019 11:26:10 -0300 Subject: [PATCH 2/4] Update README.md Update with new functions and objects --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index 12abb93e9..f3e1199b6 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,12 @@ The features available are:- * NotEqualTo * StartsWith * EndsWith + * Exists + * Near + * WithinMiles + * WithinKilometers + * WithinRadians + * WithinGeoBox * Regex * Order * Limit @@ -120,6 +126,8 @@ The features available are:- * Complex queries as shown above * Pin * Plenty more + * Counters + * Array Operators ## Custom Objects You can create your own ParseObjects or convert your existing objects into Parse Objects by doing the following: @@ -166,6 +174,29 @@ and to retrieve it var dietPlan = DietPlan().fromPin('OBJECT ID OF OBJECT'); ``` +## Increment Counter values in objects + +Retrieve it, call + +``` +var response = await dietPlan.increment("count", 1); + +``` + +## Array Operator in objects + +Retrieve it, call + +``` +var response = await dietPlan.add("listKeywords", ["a", "a","d"]); + +var response = await dietPlan.addUnique("listKeywords", ["a", "a","d"]); + +var response = await dietPlan.remove("listKeywords", ["a"]); + +``` + + ## Users You can create and control users just as normal using this SDK. @@ -195,6 +226,7 @@ Other user features are:- * Get all users * Save * Destroy user + * Queries ## Config @@ -212,10 +244,12 @@ ParseConfig().addConfig('TestConfig', 'testing'); Main: * Users +* Installation * Objects * Queries * LiveQueries * GeoPoints +* Files * Persistent storage * Debug Mode - Logging API calls * Manage Session ID's tokens @@ -223,12 +257,14 @@ Main: User: * Create * Login +* Logout * CurrentUser * RequestPasswordReset * VerificationEmailRequest * AllUsers * Save * Destroy +* Queries Objects: * Create new object From 780671867813edd08b125715216e24e9cea37068 Mon Sep 17 00:00:00 2001 From: Christoph Bayer Date: Fri, 8 Mar 2019 21:11:26 +0100 Subject: [PATCH 3/4] Add support for getting current session (#104) --- lib/parse_server_sdk.dart | 2 + lib/src/base/parse_constants.dart | 2 + lib/src/objects/parse_session.dart | 82 ++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 lib/src/objects/parse_session.dart diff --git a/lib/parse_server_sdk.dart b/lib/parse_server_sdk.dart index acd4616df..3df9b6aaa 100644 --- a/lib/parse_server_sdk.dart +++ b/lib/parse_server_sdk.dart @@ -48,6 +48,8 @@ part 'src/objects/parse_response.dart'; part 'src/objects/parse_user.dart'; +part 'src/objects/parse_session.dart'; + part 'src/objects/parse_installation.dart'; part 'src/utils/parse_decoder.dart'; diff --git a/lib/src/base/parse_constants.dart b/lib/src/base/parse_constants.dart index b900b15a4..194262336 100644 --- a/lib/src/base/parse_constants.dart +++ b/lib/src/base/parse_constants.dart @@ -9,6 +9,7 @@ const String keyEndPointUserName = '/users/me'; const String keyEndPointLogin = '/login'; const String keyEndPointLogout = '/logout'; const String keyEndPointUsers = '/users'; +const String keyEndPointSessions = '/sessions'; const String keyEndPointVerificationEmail = '/verificationEmailRequest'; const String keyEndPointRequestPasswordReset = '/requestPasswordReset'; const String keyEndPointClasses = '/classes/'; @@ -28,6 +29,7 @@ const String keyVarAcl = 'ACL'; // Classes const String keyClassMain = 'ParseMain'; const String keyClassUser = '_User'; +const String keyClassSession = '_Session'; const String keyClassInstallation = '_Installation'; const String keyGeoPoint = 'GeoPoint'; const String keyFile = 'File'; diff --git a/lib/src/objects/parse_session.dart b/lib/src/objects/parse_session.dart new file mode 100644 index 000000000..8fd0d9a48 --- /dev/null +++ b/lib/src/objects/parse_session.dart @@ -0,0 +1,82 @@ +part of flutter_parse_sdk; + +class ParseSession extends ParseObject implements ParseCloneable { + @override + clone(Map map) { + print(map); + return this.fromJson(map); + } + + static final String keyVarUser = 'user'; + static final String keyVarCreatedWith = 'createdWith'; + static final String keyVarRestricted = 'restricted'; + static final String keyVarExpiresAt = 'expiresAt'; + static final String keyVarInstallationId = 'installationId'; + + String get sessionToken => super.get(keyVarSessionToken); + + ParseObject get user => super.get(keyVarUser); + + Map get createdWith => + super.get>(keyVarCreatedWith); + + bool get restricted => super.get(keyVarRestricted); + + DateTime get expiresAt => super.get(keyVarExpiresAt); + + String get installationId => super.get(keyVarInstallationId); + + ParseSession({String sessionToken, bool debug, ParseHTTPClient client}) + : super(keyClassSession) { + _debug = isDebugEnabled(objectLevelDebug: debug); + _client = client ?? + ParseHTTPClient( + autoSendSessionId: true, + securityContext: ParseCoreData().securityContext); + } + + Future getCurrentSessionFromServer() async { + try { + Uri tempUri = Uri.parse(_client.data.serverUrl); + + Uri url = Uri( + scheme: tempUri.scheme, + host: tempUri.host, + path: "${tempUri.path}$keyEndPointSessions/me"); + + final response = await _client.get(url); + + return _handleResponse( + this, response, ParseApiRQ.logout, _debug, className); + } on Exception catch (e) { + return _handleException(e, ParseApiRQ.logout, _debug, className); + } + } + + /// Handles an API response and logs data if [bool] debug is enabled + static ParseResponse _handleException( + Exception exception, ParseApiRQ type, bool debug, String className) { + ParseResponse parseResponse = ParseResponse.handleException(exception); + + if (debug) { + logger( + ParseCoreData().appName, className, type.toString(), parseResponse); + } + + return parseResponse; + } + + /// Handles all the response data for this class + static ParseResponse _handleResponse(ParseSession session, Response response, + ParseApiRQ type, bool debug, String className) { + ParseResponse parseResponse = + ParseResponse.handleResponse(session, response); + + if (debug) { + logger( + ParseCoreData().appName, className, type.toString(), parseResponse); + } + + return parseResponse; + } +} From c6c5c7475c3d1c6ff3e2c1a3667ed42aa58ab594 Mon Sep 17 00:00:00 2001 From: Rodrigo de Souza Marques Date: Sat, 9 Mar 2019 03:22:43 -0300 Subject: [PATCH 4/4] Update parse_object.dart (#107) --- lib/src/objects/parse_object.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index 55780ccd9..8bc5b06ca 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -164,12 +164,16 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Can be used to add arrays to a given type Future _increment( - ParseApiRQ apiRQType, String arrayAction, String key, num amount) async { + ParseApiRQ apiRQType, String countAction, String key, num amount) async { try { - var uri = "${ParseCoreData().serverUrl}$_path"; - var body = "{\"$key\":{\"__op\": \"$arrayAction\", \"amount\": $amount}"; + if (objectId != null) { + var uri = "${ParseCoreData().serverUrl}$_path/$objectId"; + var body = "{\"$key\":{\"__op\":\"$countAction\",\"amount\":$amount}}"; var result = await _client.put(uri, body: body); return handleResponse(this, result, apiRQType, _debug, className); + } else { + return null; + } } on Exception catch (e) { return handleException(e, apiRQType, _debug, className); }