From c07370663d0884e2997636f4f9baf56cc2ba8ae7 Mon Sep 17 00:00:00 2001 From: Phill Date: Thu, 28 Mar 2019 07:48:11 +0000 Subject: [PATCH 1/6] ParseResponse accepts list results and count --- example/lib/data/model/day.dart | 45 +++++++++++++++++++++++++++++++ example/lib/data/model/user.dart | 43 +++++++++++++++++++++++++++++ example/lib/ui/main.dart | 31 ++++++++++++++++++--- lib/src/objects/parse_base.dart | 6 +---- lib/src/objects/parse_object.dart | 37 ++++++++++++++++--------- lib/src/utils/parse_encoder.dart | 15 +++++++++-- 6 files changed, 153 insertions(+), 24 deletions(-) create mode 100644 example/lib/data/model/day.dart create mode 100644 example/lib/data/model/user.dart diff --git a/example/lib/data/model/day.dart b/example/lib/data/model/day.dart new file mode 100644 index 000000000..707c4cd5b --- /dev/null +++ b/example/lib/data/model/day.dart @@ -0,0 +1,45 @@ +import 'dart:core'; + +import 'package:flutter_plugin_example/data/model/user.dart'; +import 'package:parse_server_sdk/parse_server_sdk.dart'; + +class Day extends ParseObject implements ParseCloneable { + Day() : super(_keyTableName); + + Day.clone() : this(); + + @override + Day clone(Map map) => Day.clone()..fromJson(map); + + @override + Day fromJson(Map objectData) { + super.fromJson(objectData); + if (objectData.containsKey(keyOwner)) { + owner = User.clone().fromJson(objectData[keyOwner]); + } + return this; + } + + static const String _keyTableName = 'FoodDiary_Day'; + static const String keyDate = 'Date'; + static const String keyOwner = 'Owner'; + static const String keyWaterIntake = 'WaterIntake'; + static const String keyStatus = 'Status'; + + DateTime get date => get(keyDate); + + set date(DateTime date) => set(keyDate, date); + + User get owner => get(keyOwner); + + set owner(User owner) => set(keyOwner, owner); + + num get waterIntake => get(keyWaterIntake); + + set waterIntake(num waterIntake) => + super.set(keyWaterIntake, waterIntake); + + int get status => get(keyStatus); + + set status(int status) => set(keyStatus, status); +} diff --git a/example/lib/data/model/user.dart b/example/lib/data/model/user.dart new file mode 100644 index 000000000..78a0f9761 --- /dev/null +++ b/example/lib/data/model/user.dart @@ -0,0 +1,43 @@ +import 'dart:core'; + +import 'package:parse_server_sdk/parse_server_sdk.dart'; + +class User extends ParseUser implements ParseCloneable { + User(String username, String password, String emailAddress) + : super(username, password, emailAddress); + + User.clone() : this(null, null, null); + + @override + User clone(Map map) => User.clone()..fromJson(map); + + static const String keyDob = 'DOB'; + static const String keyGender = 'Gender'; + static const String keyHeight = 'Height'; + static const String keyFirebaseID = 'FirebaseID'; + static const String keyName = 'Name'; + static const String keyDisplayPicture = 'DisplayPicture'; + static const String keyProUser = 'ProUser'; + + DateTime get dob => get(keyDob); + set dob(DateTime dob) => set(keyDob, dob); + + num get gender => get(keyGender); + set gender(num gender) => set(keyGender, gender); + + num get height => get(keyHeight); + set height(num height) => set(keyHeight, height); + + String get firebaseId => get(keyHeight); + set firebaseId(String firebaseId) => set(keyHeight, firebaseId); + + String get name => get(keyName); + set name(String name) => set(keyName, name); + + String get displayPicture => get(keyDisplayPicture); + set displayPicture(String displayPicture) => + set(keyDisplayPicture, displayPicture); + + bool get proUser => get(keyProUser); + set proUser(bool proUser) => set(keyProUser, proUser); +} diff --git a/example/lib/ui/main.dart b/example/lib/ui/main.dart index 4155e8eae..bddcd50e6 100644 --- a/example/lib/ui/main.dart +++ b/example/lib/ui/main.dart @@ -2,7 +2,9 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_plugin_example/data/base/api_response.dart'; +import 'package:flutter_plugin_example/data/model/day.dart'; import 'package:flutter_plugin_example/data/model/diet_plan.dart'; +import 'package:flutter_plugin_example/data/model/user.dart'; import 'package:flutter_plugin_example/data/repositories/diet_plan/repository_diet_plan.dart'; import 'package:flutter_plugin_example/domain/constants/application_constants.dart'; import 'package:flutter_plugin_example/domain/utils/db_utils.dart'; @@ -61,11 +63,11 @@ class _MyAppState extends State { Future runTestQueries() async { // Basic repository example - await repositoryAddItems(); - await repositoryGetAllItems(); + /* await repositoryAddItems(); + await repositoryGetAllItems();*/ //Basic usage - createItem(); + /*createItem(); getAllItems(); getAllItemsByName(); getSingleItem(); @@ -73,7 +75,28 @@ class _MyAppState extends State { query(); initUser(); function(); - functionWithParameters(); + functionWithParameters();*/ + test(); + } + + Future test() async { + User user = User('test_user', 'test_password', 'test@gmail.com'); + final ParseResponse signUpResponse = await user.signUp(); + + if (signUpResponse.success) { + user = signUpResponse.result; + } else { + final ParseResponse loginResponse = await user.login(); + + if (loginResponse.success) { + user = loginResponse.result; + } + } + + final QueryBuilder query = QueryBuilder(Day()) + ..whereEqualTo(Day.keyOwner, user); + var item = await query.query(); + print(item.toString()); } Future createItem() async { diff --git a/lib/src/objects/parse_base.dart b/lib/src/objects/parse_base.dart index 55d116aae..bd703f27f 100644 --- a/lib/src/objects/parse_base.dart +++ b/lib/src/objects/parse_base.dart @@ -206,9 +206,5 @@ abstract class ParseBase { return null; } - Map toPointer() => { - '__type': 'Pointer', - keyVarClassName: className, - keyVarObjectId: objectId - }; + Map toPointer() => encodeObject(className, objectId); } diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index d2949c890..7c5f2a929 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -33,7 +33,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Gets an object from the server using it's [String] objectId Future getObject(String objectId) async { try { - String uri =_path; + String uri = _path; if (objectId != null) { uri += '/$objectId'; @@ -42,7 +42,8 @@ class ParseObject extends ParseBase implements ParseCloneable { final Uri url = getSanitisedUri(_client, '$uri'); final Response result = await _client.get(url); - return handleResponse(this, result, ParseApiRQ.get, _debug, className); + return handleResponse( + this, result, ParseApiRQ.get, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.get, _debug, className); } @@ -53,7 +54,8 @@ class ParseObject extends ParseBase implements ParseCloneable { try { final Uri url = getSanitisedUri(_client, '$_path'); final Response result = await _client.get(url); - return handleResponse(this, result, ParseApiRQ.getAll, _debug, className); + return handleResponse( + this, result, ParseApiRQ.getAll, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.getAll, _debug, className); } @@ -73,7 +75,8 @@ class ParseObject extends ParseBase implements ParseCloneable { objectId = map['objectId'].toString(); } - return handleResponse(this, result, ParseApiRQ.create, _debug, className); + return handleResponse( + this, result, ParseApiRQ.create, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.create, _debug, className); } @@ -88,7 +91,8 @@ class ParseObject extends ParseBase implements ParseCloneable { final Uri url = getSanitisedUri(_client, '$_path/$objectId'); final String body = json.encode(toJson(forApiRQ: true)); final Response result = await _client.put(url, body: body); - return handleResponse(this, result, ParseApiRQ.save, _debug, className); + return handleResponse( + this, result, ParseApiRQ.save, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.save, _debug, className); } @@ -179,7 +183,8 @@ class ParseObject extends ParseBase implements ParseCloneable { final String body = '{\"$key\":{\"__op\":\"$arrayAction\",\"objects\":${json.encode(parseEncode(values))}}}'; final Response result = await _client.put(url, body: body); - return handleResponse(this, result, apiRQType, _debug, className); + return handleResponse( + this, result, apiRQType, _debug, className); } else { return null; } @@ -190,7 +195,8 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Used in array Operations in save() method void _arrayOperation(String arrayAction, String key, List values) { - set>(key, {'__op': arrayAction, 'objects': values}); + set>( + key, {'__op': arrayAction, 'objects': values}); } /// Increases a num of an object by x amount @@ -206,7 +212,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Increases a num of an object by x amount void setIncrement(String key, num amount) { set>( - key, {'__op': 'Increment', 'amount': amount}); + key, {'__op': 'Increment', 'amount': amount}); } /// Decreases a num of an object by x amount @@ -222,7 +228,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Decreases a num of an object by x amount void setDecrement(String key, num amount) { set>( - key, {'__op': 'Increment', 'amount': -amount}); + key, {'__op': 'Increment', 'amount': -amount}); } /// Can be used to add arrays to a given type @@ -231,9 +237,11 @@ class ParseObject extends ParseBase implements ParseCloneable { try { if (objectId != null) { final Uri url = getSanitisedUri(_client, '$_path/$objectId'); - final String body = '{\"$key\":{\"__op\":\"$countAction\",\"amount\":$amount}}'; + final String body = + '{\"$key\":{\"__op\":\"$countAction\",\"amount\":$amount}}'; final Response result = await _client.put(url, body: body); - return handleResponse(this, result, apiRQType, _debug, className); + return handleResponse( + this, result, apiRQType, _debug, className); } else { return null; } @@ -253,8 +261,10 @@ class ParseObject extends ParseBase implements ParseCloneable { port: tempUri.port, path: '${tempUri.path}$_path', query: query); + final Response result = await _client.get(url); - return handleResponse(this, result, ParseApiRQ.query, _debug, className); + return handleResponse( + this, result, ParseApiRQ.query, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.query, _debug, className); } @@ -267,7 +277,8 @@ class ParseObject extends ParseBase implements ParseCloneable { objectId ??= objectId; final Uri url = getSanitisedUri(_client, '$_path/$objectId'); final Response result = await _client.delete(url); - return handleResponse(this, result, ParseApiRQ.delete, _debug, className); + return handleResponse( + this, result, ParseApiRQ.delete, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.delete, _debug, className); } diff --git a/lib/src/utils/parse_encoder.dart b/lib/src/utils/parse_encoder.dart index 9b769c569..81fe903f4 100644 --- a/lib/src/utils/parse_encoder.dart +++ b/lib/src/utils/parse_encoder.dart @@ -23,7 +23,7 @@ dynamic parseEncode(dynamic value, {bool full}) { if (value is ParseGeoPoint) { return value; } - + if (value is ParseFile) { return value; } @@ -44,5 +44,16 @@ Map _encodeUint8List(Uint8List value) { } Map _encodeDate(DateTime date) { - return {'__type': 'Date', 'iso': _parseDateFormat.format(date)}; + return { + '__type': 'Date', + 'iso': _parseDateFormat.format(date) + }; +} + +Map encodeObject(String className, String objectId) { + return { + '__type': 'Pointer', + keyVarClassName: className, + keyVarObjectId: objectId + }; } From a6f70902ee327d35ebbff963bfa176acfc8358d5 Mon Sep 17 00:00:00 2001 From: wigginsp Date: Thu, 28 Mar 2019 12:59:02 +0000 Subject: [PATCH 2/6] Corrected toPointer logic --- example/lib/data/model/day.dart | 6 --- example/lib/data/model/user.dart | 3 +- example/lib/ui/main.dart | 8 ++-- lib/src/network/parse_http_client.dart | 25 +---------- lib/src/network/parse_query.dart | 1 + lib/src/objects/parse_user.dart | 20 +++------ .../response/parse_exception_response.dart | 3 +- .../response/parse_response_utils.dart | 9 ++-- lib/src/utils/parse_encoder.dart | 15 ++++--- lib/src/utils/parse_logger.dart | 43 +++++++++++++++---- lib/src/utils/parse_utils.dart | 7 ++- 11 files changed, 70 insertions(+), 70 deletions(-) diff --git a/example/lib/data/model/day.dart b/example/lib/data/model/day.dart index 707c4cd5b..79ed02098 100644 --- a/example/lib/data/model/day.dart +++ b/example/lib/data/model/day.dart @@ -23,7 +23,6 @@ class Day extends ParseObject implements ParseCloneable { static const String _keyTableName = 'FoodDiary_Day'; static const String keyDate = 'Date'; static const String keyOwner = 'Owner'; - static const String keyWaterIntake = 'WaterIntake'; static const String keyStatus = 'Status'; DateTime get date => get(keyDate); @@ -34,11 +33,6 @@ class Day extends ParseObject implements ParseCloneable { set owner(User owner) => set(keyOwner, owner); - num get waterIntake => get(keyWaterIntake); - - set waterIntake(num waterIntake) => - super.set(keyWaterIntake, waterIntake); - int get status => get(keyStatus); set status(int status) => set(keyStatus, status); diff --git a/example/lib/data/model/user.dart b/example/lib/data/model/user.dart index 78a0f9761..9084debe8 100644 --- a/example/lib/data/model/user.dart +++ b/example/lib/data/model/user.dart @@ -35,8 +35,7 @@ class User extends ParseUser implements ParseCloneable { set name(String name) => set(keyName, name); String get displayPicture => get(keyDisplayPicture); - set displayPicture(String displayPicture) => - set(keyDisplayPicture, displayPicture); + set displayPicture(String displayPicture) => set(keyDisplayPicture, displayPicture); bool get proUser => get(keyProUser); set proUser(bool proUser) => set(keyProUser, proUser); diff --git a/example/lib/ui/main.dart b/example/lib/ui/main.dart index bddcd50e6..e4d6b9751 100644 --- a/example/lib/ui/main.dart +++ b/example/lib/ui/main.dart @@ -63,11 +63,11 @@ class _MyAppState extends State { Future runTestQueries() async { // Basic repository example - /* await repositoryAddItems(); - await repositoryGetAllItems();*/ + await repositoryAddItems(); + await repositoryGetAllItems(); //Basic usage - /*createItem(); + createItem(); getAllItems(); getAllItemsByName(); getSingleItem(); @@ -75,7 +75,7 @@ class _MyAppState extends State { query(); initUser(); function(); - functionWithParameters();*/ + functionWithParameters(); test(); } diff --git a/lib/src/network/parse_http_client.dart b/lib/src/network/parse_http_client.dart index 4604f58e6..07c07e5c4 100644 --- a/lib/src/network/parse_http_client.dart +++ b/lib/src/network/parse_http_client.dart @@ -36,32 +36,9 @@ class ParseHTTPClient extends BaseClient { } if (data.debug) { - _logging(request); + logCUrl(request); } return _client.send(request); } - - void _logging(BaseRequest request) { - String curlCmd = 'curl'; - curlCmd += ' -X ' + request.method; - bool compressed = false; - request.headers.forEach((String name, String value) { - if (name?.toLowerCase() == 'accept-encoding' && - value?.toLowerCase() == 'gzip') { - compressed = true; - } - curlCmd += ' -H \'$name: $value\''; - }); - if (request.method == 'POST' || request.method == 'PUT') { - if (request is Request) { - final String body = latin1.decode(request.bodyBytes); - curlCmd += ' -d \'$body\''; - } - } - curlCmd += (compressed ? ' --compressed ' : ' ') + request.url.toString(); - print('╭-- cURL'); - print(curlCmd); - print('╰-- (copy and paste the above line to a terminal)'); - } } diff --git a/lib/src/network/parse_query.dart b/lib/src/network/parse_query.dart index 877c4ceeb..a6514f90a 100644 --- a/lib/src/network/parse_query.dart +++ b/lib/src/network/parse_query.dart @@ -284,6 +284,7 @@ class QueryBuilder { /// that the column and value are being queried against MapEntry _buildQueryWithColumnValueAndOperator( MapEntry columnAndValue, String queryOperator) { + final String key = columnAndValue.key; final dynamic value = convertValueToCorrectType(parseEncode(columnAndValue.value)); diff --git a/lib/src/objects/parse_user.dart b/lib/src/objects/parse_user.dart index a5bf6e68f..6c80053dd 100644 --- a/lib/src/objects/parse_user.dart +++ b/lib/src/objects/parse_user.dart @@ -145,25 +145,19 @@ class ParseUser extends ParseObject implements ParseCloneable { /// provided, call this method to login. Future login() async { try { - final Uri tempUri = Uri.parse(_client.data.serverUrl); - - final Uri url = Uri( - scheme: tempUri.scheme, - host: tempUri.host, - port: tempUri.port, - path: '${tempUri.path}$keyEndPointLogin', - queryParameters: { - keyVarUsername: username, - keyVarPassword: password - }); + final Map queryParams = { + keyVarUsername: username, + keyVarPassword: password + }; + + final Uri url = getSanitisedUri(_client, '$keyEndPointLogin', query: queryParams); final Response response = await _client.get(url, headers: { keyHeaderRevocableSession: '1', }); - return _handleResponse( - this, response, ParseApiRQ.login, _debug, className); + return _handleResponse(this, response, ParseApiRQ.login, _debug, className); } on Exception catch (e) { return handleException(e, ParseApiRQ.login, _debug, className); } diff --git a/lib/src/objects/response/parse_exception_response.dart b/lib/src/objects/response/parse_exception_response.dart index 9a798c8b0..e8b3f4367 100644 --- a/lib/src/objects/response/parse_exception_response.dart +++ b/lib/src/objects/response/parse_exception_response.dart @@ -3,7 +3,6 @@ part of flutter_parse_sdk; /// Handles exception instead of throwing an exception ParseResponse buildParseResponseWithException(Exception exception) { final ParseResponse response = ParseResponse(); - response.error = - ParseError(message: exception.toString(), isTypeOfException: true); + response.error = ParseError(message: exception.toString(), isTypeOfException: true); return response; } diff --git a/lib/src/objects/response/parse_response_utils.dart b/lib/src/objects/response/parse_response_utils.dart index 17fc181b2..1309521a8 100644 --- a/lib/src/objects/response/parse_response_utils.dart +++ b/lib/src/objects/response/parse_response_utils.dart @@ -4,12 +4,14 @@ part of flutter_parse_sdk; @protected ParseResponse handleResponse(ParseCloneable object, Response response, ParseApiRQ type, bool debug, String className) { + final ParseResponse parseResponse = _ParseResponseBuilder().handleResponse( - object, response, + object, + response, returnAsResult: shouldReturnAsABaseResult(type)); if (debug) { - logger(ParseCoreData().appName, className, type.toString(), parseResponse); + logAPIResponse(className, type.toString(), parseResponse); } return parseResponse; @@ -19,11 +21,12 @@ ParseResponse handleResponse(ParseCloneable object, Response response, @protected ParseResponse handleException( Exception exception, ParseApiRQ type, bool debug, String className) { + final ParseResponse parseResponse = buildParseResponseWithException(exception); if (debug) { - logger(ParseCoreData().appName, className, type.toString(), parseResponse); + logAPIResponse(className, type.toString(), parseResponse); } return parseResponse; diff --git a/lib/src/utils/parse_encoder.dart b/lib/src/utils/parse_encoder.dart index 81fe903f4..f82fe006d 100644 --- a/lib/src/utils/parse_encoder.dart +++ b/lib/src/utils/parse_encoder.dart @@ -40,20 +40,23 @@ dynamic parseEncode(dynamic value, {bool full}) { } Map _encodeUint8List(Uint8List value) { - return {'__type': 'Bytes', 'base64': base64.encode(value)}; + return { + '\"__type\"': '\"Bytes\"', + '\"base64\"': '\"${base64.encode(value)}\"' + }; } Map _encodeDate(DateTime date) { return { - '__type': 'Date', - 'iso': _parseDateFormat.format(date) + '\"__type\"': '\"Date\"', + '\"iso\"': '\"${_parseDateFormat.format(date)}\"' }; } Map encodeObject(String className, String objectId) { return { - '__type': 'Pointer', - keyVarClassName: className, - keyVarObjectId: objectId + '\"__type\"': '\"Pointer\"', + '\"$keyVarClassName\"': '\"$className\"', + '\"$keyVarObjectId\"': '\"$objectId\"' }; } diff --git a/lib/src/utils/parse_logger.dart b/lib/src/utils/parse_logger.dart index 8d62d0ea6..7174bc73f 100644 --- a/lib/src/utils/parse_logger.dart +++ b/lib/src/utils/parse_logger.dart @@ -1,14 +1,16 @@ part of flutter_parse_sdk; -void logger(String appName, String className, String type, +void logAPIResponse( + String className, + String type, ParseResponse parseResponse) { - String responseString = ' \n'; - String name = appName; - if (name.isNotEmpty) { - name = '$appName '; - } - responseString += '----\n${name}API Response ($className : $type) :'; + const String spacer = ' \n'; + String responseString = ''; + + responseString += '╭-- Parse Response'; + + responseString += '\n$className : $type'; if (parseResponse.success) { responseString += '\nStatus Code: ${parseResponse.statusCode}'; @@ -27,10 +29,35 @@ void logger(String appName, String className, String type, responseString += '\n$errorOrException: ${parseResponse.error.message}'; } - responseString += '\n----\n'; + responseString += '\n╰-- \n'; + responseString += spacer; print(responseString); } +void logCUrl(BaseRequest request) { + String curlCmd = 'curl'; + curlCmd += ' -X ' + request.method; + bool compressed = false; + request.headers.forEach((String name, String value) { + if (name?.toLowerCase() == 'accept-encoding' && + value?.toLowerCase() == 'gzip') { + compressed = true; + } + curlCmd += ' -H \'$name: $value\''; + }); + if (request.method == 'POST' || request.method == 'PUT') { + if (request is Request) { + final String body = latin1.decode(request.bodyBytes); + curlCmd += ' -d \'$body\''; + } + } + + curlCmd += (compressed ? ' --compressed ' : ' ') + Uri.decodeFull(request.url.toString()); + print('╭-- Parse Request'); + print(curlCmd); + print('╰--'); +} + void logRequest( String appName, String className, String type, String uri, String body) { String requestString = ' \n'; diff --git a/lib/src/utils/parse_utils.dart b/lib/src/utils/parse_utils.dart index b1a7fd6f7..c7219d76e 100644 --- a/lib/src/utils/parse_utils.dart +++ b/lib/src/utils/parse_utils.dart @@ -24,14 +24,17 @@ dynamic convertValueToCorrectType(dynamic value) { } /// Sanitises a url -Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend) { +Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend, + {Map query}) { + final Uri tempUri = Uri.parse(client.data.serverUrl); final Uri url = Uri( scheme: tempUri.scheme, host: tempUri.host, port: tempUri.port, - path: '${tempUri.path}$pathToAppend'); + path: '${tempUri.path}$pathToAppend', + queryParameters: query); return url; } From 0e7d5c39f9ca26ace972995c7698d7ecadc04690 Mon Sep 17 00:00:00 2001 From: wigginsp Date: Thu, 28 Mar 2019 13:02:41 +0000 Subject: [PATCH 3/6] Corrected date issue --- lib/src/utils/parse_encoder.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/utils/parse_encoder.dart b/lib/src/utils/parse_encoder.dart index f82fe006d..b7d31fc95 100644 --- a/lib/src/utils/parse_encoder.dart +++ b/lib/src/utils/parse_encoder.dart @@ -41,15 +41,15 @@ dynamic parseEncode(dynamic value, {bool full}) { Map _encodeUint8List(Uint8List value) { return { - '\"__type\"': '\"Bytes\"', - '\"base64\"': '\"${base64.encode(value)}\"' + '__type': 'Bytes', + 'base64': base64.encode(value) }; } Map _encodeDate(DateTime date) { return { - '\"__type\"': '\"Date\"', - '\"iso\"': '\"${_parseDateFormat.format(date)}\"' + '__type': 'Date', + 'iso': _parseDateFormat.format(date) }; } From 9df3f8c2a65c5ee040f5fe90ea8b38c58240b047 Mon Sep 17 00:00:00 2001 From: wigginsp Date: Thu, 28 Mar 2019 13:29:22 +0000 Subject: [PATCH 4/6] Code clean --- lib/parse_server_sdk.dart | 7 ++++++- lib/src/objects/parse_object.dart | 10 +--------- lib/src/objects/parse_user.dart | 2 +- lib/src/utils/parse_logger.dart | 6 +++--- lib/src/utils/parse_utils.dart | 13 +++++++++++-- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/parse_server_sdk.dart b/lib/parse_server_sdk.dart index b0fcda35c..0ec5bcf6e 100644 --- a/lib/parse_server_sdk.dart +++ b/lib/parse_server_sdk.dart @@ -99,7 +99,12 @@ class Parse { String sessionId, bool autoSendSessionId, SecurityContext securityContext}) { - ParseCoreData.init(appId, serverUrl, + + final String url = removeTrailingSlash(serverUrl); + + ParseCoreData.init( + appId, + url, debug: debug, appName: appName, liveQueryUrl: liveQueryUrl, diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index 7c5f2a929..9a60f5b45 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -253,15 +253,7 @@ class ParseObject extends ParseBase implements ParseCloneable { /// Can be used to create custom queries Future query(String query) async { try { - final Uri tempUri = Uri.parse(ParseCoreData().serverUrl); - - final Uri url = Uri( - scheme: tempUri.scheme, - host: tempUri.host, - port: tempUri.port, - path: '${tempUri.path}$_path', - query: query); - + final Uri url = getSanitisedUri(_client, '$_path', query: query); final Response result = await _client.get(url); return handleResponse( this, result, ParseApiRQ.query, _debug, className); diff --git a/lib/src/objects/parse_user.dart b/lib/src/objects/parse_user.dart index 6c80053dd..c05eb4f3f 100644 --- a/lib/src/objects/parse_user.dart +++ b/lib/src/objects/parse_user.dart @@ -150,7 +150,7 @@ class ParseUser extends ParseObject implements ParseCloneable { keyVarPassword: password }; - final Uri url = getSanitisedUri(_client, '$keyEndPointLogin', query: queryParams); + final Uri url = getSanitisedUri(_client, '$keyEndPointLogin', queryParams: queryParams); final Response response = await _client.get(url, headers: { diff --git a/lib/src/utils/parse_logger.dart b/lib/src/utils/parse_logger.dart index 7174bc73f..72ffef82c 100644 --- a/lib/src/utils/parse_logger.dart +++ b/lib/src/utils/parse_logger.dart @@ -9,8 +9,8 @@ void logAPIResponse( String responseString = ''; responseString += '╭-- Parse Response'; - - responseString += '\n$className : $type'; + responseString += '\nClass: $className'; + responseString += '\nFunction: $type'; if (parseResponse.success) { responseString += '\nStatus Code: ${parseResponse.statusCode}'; @@ -51,7 +51,7 @@ void logCUrl(BaseRequest request) { curlCmd += ' -d \'$body\''; } } - + curlCmd += (compressed ? ' --compressed ' : ' ') + Uri.decodeFull(request.url.toString()); print('╭-- Parse Request'); print(curlCmd); diff --git a/lib/src/utils/parse_utils.dart b/lib/src/utils/parse_utils.dart index c7219d76e..2cc15f71a 100644 --- a/lib/src/utils/parse_utils.dart +++ b/lib/src/utils/parse_utils.dart @@ -25,7 +25,7 @@ dynamic convertValueToCorrectType(dynamic value) { /// Sanitises a url Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend, - {Map query}) { + {Map queryParams, String query}) { final Uri tempUri = Uri.parse(client.data.serverUrl); @@ -34,7 +34,16 @@ Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend, host: tempUri.host, port: tempUri.port, path: '${tempUri.path}$pathToAppend', - queryParameters: query); + queryParameters: queryParams, + query: query); return url; } +/// Removes unncessary / +String removeTrailingSlash(String serverUrl) { + if (serverUrl.substring(serverUrl.length -1) == '/') { + return serverUrl.substring(0, serverUrl.length -1); + } else { + return serverUrl; + } +} From 09854e03493eb45001cf91ea48eb21b6e39a87b8 Mon Sep 17 00:00:00 2001 From: wigginsp Date: Thu, 28 Mar 2019 14:08:29 +0000 Subject: [PATCH 5/6] Code clean --- lib/src/objects/response/parse_response_utils.dart | 11 ++++++++++- lib/src/utils/parse_logger.dart | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/src/objects/response/parse_response_utils.dart b/lib/src/objects/response/parse_response_utils.dart index 1309521a8..0fff98d21 100644 --- a/lib/src/objects/response/parse_response_utils.dart +++ b/lib/src/objects/response/parse_response_utils.dart @@ -52,5 +52,14 @@ bool shouldReturnAsABaseResult(ParseApiRQ type) { bool isUnsuccessfulResponse(Response apiResponse) => apiResponse.statusCode != 200 && apiResponse.statusCode != 201; -bool isSuccessButNoResults(Response apiResponse) => apiResponse.body == '{\"results\":[]}'; +bool isSuccessButNoResults(Response apiResponse) { + final Map decodedResponse = jsonDecode(apiResponse.body); + final List results = decodedResponse['results']; + + if (results == null) { + return false; + } + + return results.isEmpty; +} diff --git a/lib/src/utils/parse_logger.dart b/lib/src/utils/parse_logger.dart index 72ffef82c..047d3d37d 100644 --- a/lib/src/utils/parse_logger.dart +++ b/lib/src/utils/parse_logger.dart @@ -52,7 +52,8 @@ void logCUrl(BaseRequest request) { } } - curlCmd += (compressed ? ' --compressed ' : ' ') + Uri.decodeFull(request.url.toString()); + curlCmd += (compressed ? ' --compressed ' : ' ') + request.url.toString(); + curlCmd += '\n\n ${Uri.decodeFull(request.url.toString())}'; print('╭-- Parse Request'); print(curlCmd); print('╰--'); From 67d60f283e6a0d19cfe3e2d1e5b40c1c6c12fe85 Mon Sep 17 00:00:00 2001 From: wigginsp Date: Thu, 28 Mar 2019 17:25:48 +0000 Subject: [PATCH 6/6] Code clean --- lib/src/network/parse_query.dart | 3 +-- lib/src/utils/parse_encoder.dart | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/src/network/parse_query.dart b/lib/src/network/parse_query.dart index a6514f90a..d06536b07 100644 --- a/lib/src/network/parse_query.dart +++ b/lib/src/network/parse_query.dart @@ -289,8 +289,7 @@ class QueryBuilder { final dynamic value = convertValueToCorrectType(parseEncode(columnAndValue.value)); if (queryOperator == _NO_OPERATOR_NEEDED) { - return MapEntry( - _NO_OPERATOR_NEEDED, "\"${key}\": $value"); + return MapEntry(_NO_OPERATOR_NEEDED, '\"$key\": ${jsonEncode(value)}'); } else { String queryString = '\"$key\":'; final Map queryOperatorAndValueMap = Map(); diff --git a/lib/src/utils/parse_encoder.dart b/lib/src/utils/parse_encoder.dart index b7d31fc95..c64d439a4 100644 --- a/lib/src/utils/parse_encoder.dart +++ b/lib/src/utils/parse_encoder.dart @@ -55,8 +55,8 @@ Map _encodeDate(DateTime date) { Map encodeObject(String className, String objectId) { return { - '\"__type\"': '\"Pointer\"', - '\"$keyVarClassName\"': '\"$className\"', - '\"$keyVarObjectId\"': '\"$objectId\"' + '__type': 'Pointer', + keyVarClassName: className, + keyVarObjectId: objectId }; }