Skip to content

Commit

Permalink
BugFix ParseQuery, ParseFile, ParseEncoder (#132)
Browse files Browse the repository at this point in the history
* Release/v1.0.16 (#124)

* Merge branches 'develop' and 'master' of https://github.com/phillwiggins/flutter_parse_sdk

# Conflicts:
#	.idea/libraries/Dart_Packages.xml
#	lib/src/objects/parse_file.dart
#	lib/src/objects/parse_user.dart
#	pubspec.yaml

* Correct null pointer from success response with empty body

* Code tidy

* Added url port support
Added lint rules
Added object population on update and save

* Updated dependency uuid (#120)

* Fixed date query - Needs testing

* Added date formatting
Added cURL logging

* updating path_provider dependency (#121)

* Update README.md to support code highlight (#126)

* Bugix after release v.1.016

Many bugfix after Bugix after release v.1.016

* Function toPointer()

Function toPointer() in ParseObject

* Bugix after release v.1.016

Bugfix after Merge Pull Request release v.1.016

* Update parse_encoder.dart

* Update parse_object.dart

Remove blank lines
  • Loading branch information
RodrigoSMarques authored and phillwiggins committed Mar 19, 2019
1 parent 245a1d6 commit c79ac39
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 44 deletions.
38 changes: 19 additions & 19 deletions README.md
Expand Up @@ -11,7 +11,7 @@ Want to get involved? Join our Slack channel and help out! (http://flutter-parse

## Getting Started
To install, either add to your pubspec.yaml
```
```yml
dependencies:
parse_server_sdk: ^1.0.16
```
Expand All @@ -20,15 +20,15 @@ or clone this repository and add to your project. As this is an early developmen

Once you have the library added to your project, upon first call to your app (Similar to what your application class would be) add the following...

```
```dart
Parse().initialize(
ApplicationConstants.keyApplicationId,
ApplicationConstants.keyParseServerUrl);
```

It's possible to add other params, such as ...

```
```dart
Parse().initialize(
ApplicationConstants.keyApplicationId,
ApplicationConstants.keyParseServerUrl,
Expand All @@ -42,7 +42,7 @@ Parse().initialize(

## Queries
Once you have setup the project and initialised the instance, you can then retreive data from your server by calling:
```
```dart
var apiResponse = await ParseObject('ParseTableName').getAll();
if (apiResponse.success){
Expand All @@ -53,7 +53,7 @@ var apiResponse = await ParseObject('ParseTableName').getAll();
```
Or you can get an object by its objectId:

```
```dart
var dietPlan = await DietPlan().getObject('R5EonpUDWy');
if (dietPlan.success) {
Expand All @@ -67,7 +67,7 @@ var dietPlan = await DietPlan().getObject('R5EonpUDWy');
## Complex queries
You can create complex queries to really put your database to the test:

```
```dart
var queryBuilder = QueryBuilder<DietPlan>(DietPlan())
..startsWith(DietPlan.keyName, "Keto")
..greaterThan(DietPlan.keyFat, 64)
Expand Down Expand Up @@ -110,7 +110,7 @@ The features available are:-
## Objects

You can create custom objects by calling:
```
```dart
var dietPlan = ParseObject('DietPlan')
..set('Name', 'Ketogenic')
..set('Fat', 65);
Expand All @@ -132,7 +132,7 @@ The features available are:-
## Custom Objects
You can create your own ParseObjects or convert your existing objects into Parse Objects by doing the following:

```
```dart
class DietPlan extends ParseObject implements ParseCloneable {
DietPlan() : super(_keyTableName);
Expand All @@ -155,7 +155,7 @@ class DietPlan extends ParseObject implements ParseCloneable {

To add a variable to an object call and retrieve it, call

```
```dart
dietPlan.set<int>('RandomInt', 8);
var randomInt = dietPlan.get<int>('RandomInt');
```
Expand All @@ -164,21 +164,21 @@ var randomInt = dietPlan.get<int>('RandomInt');

You can now save an object by calling .pin() on an instance of an object

```
```dart
dietPlan.pin();
```

and to retrieve it

```
```dart
var dietPlan = DietPlan().fromPin('OBJECT ID OF OBJECT');
```

## Increment Counter values in objects

Retrieve it, call

```
```dart
var response = await dietPlan.increment("count", 1);
```
Expand All @@ -187,7 +187,7 @@ var response = await dietPlan.increment("count", 1);

Retrieve it, call

```
```dart
var response = await dietPlan.add("listKeywords", ["a", "a","d"]);
var response = await dietPlan.addUnique("listKeywords", ["a", "a","d"]);
Expand All @@ -202,22 +202,22 @@ var response = await dietPlan.remove("listKeywords", ["a"]);
You can create and control users just as normal using this SDK.

To register a user, first create one :
```
```dart
var user = ParseUser().create("TestFlutter", "TestPassword123", "TestFlutterSDK@gmail.com");
```
Then have the user sign up:

```
```dart
var response = await user.signUp();
if (response.success) user = response.result;
```
You can also logout and login with the user:
```
```dart
var response = await user.login();
if (response.success) user = response.result;
```
Also, once logged in you can manage sessions tokens. This feature can be called after Parse().init() on startup to check for a logged in user.
```
```dart
user = ParseUser.currentUser();
```
Other user features are:-
Expand All @@ -231,12 +231,12 @@ Other user features are:-
## Config

The SDK now supports Parse Config. A map of all configs can be grabbed from the server by calling :
```
```dart
var response = await ParseConfig().getConfigs();
```

and to add a config:
```
```dart
ParseConfig().addConfig('TestConfig', 'testing');
```

Expand Down
11 changes: 7 additions & 4 deletions lib/src/network/parse_query.dart
Expand Up @@ -285,19 +285,22 @@ class QueryBuilder<T extends ParseObject> {
MapEntry<String, dynamic> _buildQueryWithColumnValueAndOperator(
MapEntry<String, dynamic> columnAndValue, String queryOperator) {
final String key = columnAndValue.key;
final dynamic value = convertValueToCorrectType(columnAndValue.value);
final dynamic value =
convertValueToCorrectType(columnAndValue.value);

if (queryOperator == _NO_OPERATOR_NEEDED) {
return MapEntry<String, dynamic>(_NO_OPERATOR_NEEDED, '\"$key\": $value');
return MapEntry<String, dynamic>(
_NO_OPERATOR_NEEDED, '\"${key}\": $value');
} else {
String queryString = '\"$key\":';

final Map<String, dynamic> queryOperatorAndValueMap =
Map<String, dynamic>();

queryOperatorAndValueMap[queryOperator] = value;
final String formattedQueryOperatorAndValue =
jsonEncode(queryOperatorAndValueMap);
JsonEncoder().convert(queryOperatorAndValueMap);
queryString += '$formattedQueryOperatorAndValue';

return MapEntry<String, dynamic>(key, queryString);
}
}
Expand Down
6 changes: 0 additions & 6 deletions lib/src/objects/parse_base.dart
Expand Up @@ -205,10 +205,4 @@ abstract class ParseBase {
}
return null;
}

Map<String, String> toPointer() => <String, String>{
'__type': 'Pointer',
keyVarClassName: className,
keyVarObjectId: objectId
};
}
2 changes: 1 addition & 1 deletion lib/src/objects/parse_file.dart
Expand Up @@ -38,7 +38,7 @@ class ParseFile extends ParseObject {
<String, String>{'__type': keyFile, 'name': name, 'url': url};

@override
String toString() => json.encode(toString());
String toString() => json.encode(toJson());

Future<ParseFile> loadStorage() async {
final Directory tempPath = await getTemporaryDirectory();
Expand Down
15 changes: 8 additions & 7 deletions lib/src/objects/parse_installation.dart
@@ -1,7 +1,6 @@
part of flutter_parse_sdk;

class ParseInstallation extends ParseObject {

/// Creates an instance of ParseInstallation
ParseInstallation(
{bool debug, ParseHTTPClient client, bool autoSendSessionId})
Expand All @@ -23,7 +22,8 @@ class ParseInstallation extends ParseObject {

Map<String, dynamic> get acl => super.get<Map<String, dynamic>>(keyVarAcl);

set acl(Map<String, dynamic> acl) => set<Map<String, dynamic>>(keyVarAcl, acl);
set acl(Map<String, dynamic> acl) =>
set<Map<String, dynamic>>(keyVarAcl, acl);

String get deviceToken => super.get<String>(keyDeviceToken);

Expand Down Expand Up @@ -88,8 +88,7 @@ class ParseInstallation extends ParseObject {
@override
Future<ParseResponse> create() async {
final bool isCurrent = await ParseInstallation.isCurrent(this);
if (isCurrent)
await _updateInstallation();
if (isCurrent) await _updateInstallation();
//ParseResponse parseResponse = await super.create();
final ParseResponse parseResponse = await _create();
if (parseResponse.success && isCurrent) {
Expand Down Expand Up @@ -119,7 +118,7 @@ class ParseInstallation extends ParseObject {
(await ParseCoreData().getStore()).getString(keyParseStoreInstallation);

if (installationJson != null) {
final dynamic installationMap = parseDecode(json.decode(installationJson));
final dynamic installationMap = json.decode(installationJson);

if (installationMap != null) {
return ParseInstallation()..fromJson(installationMap);
Expand Down Expand Up @@ -158,7 +157,8 @@ class ParseInstallation extends ParseObject {
objectId = map['objectId'].toString();
}

return handleResponse<ParseInstallation>(this, result, ParseApiRQ.create, _debug, className);
return handleResponse<ParseInstallation>(
this, result, ParseApiRQ.create, _debug, className);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.create, _debug, className);
}
Expand All @@ -178,7 +178,8 @@ class ParseInstallation extends ParseObject {
ParseApiRQ.save.toString(), uri, body);
}
final Response result = await _client.put(uri, body: body);
return handleResponse<ParseInstallation>(this, result, ParseApiRQ.save, _debug, className);
return handleResponse<ParseInstallation>(
this, result, ParseApiRQ.save, _debug, className);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.save, _debug, className);
}
Expand Down
4 changes: 3 additions & 1 deletion lib/src/objects/parse_object.dart
Expand Up @@ -73,7 +73,6 @@ class ParseObject extends ParseBase implements ParseCloneable {
final Map<String, dynamic> map = json.decode(result.body);
objectId = map['objectId'].toString();
}

return handleResponse<ParseObject>(
this, result, ParseApiRQ.create, _debug, className);
} on Exception catch (e) {
Expand Down Expand Up @@ -281,4 +280,7 @@ class ParseObject extends ParseBase implements ParseCloneable {
return handleException(e, ParseApiRQ.delete, _debug, className);
}
}

/// Converts the object to a Pointer to be used ONLY in queries using Pointers
String toPointer() => json.encode(parseEncode(this));
}
21 changes: 19 additions & 2 deletions lib/src/utils/parse_encoder.dart
Expand Up @@ -20,6 +20,12 @@ dynamic parseEncode(dynamic value, {bool full}) {
return _encodeDate(value);
}

if (value is List) {
return value.map((v) {
return parseEncode(v);
}).toList();
}

if (value is ParseGeoPoint) {
return value;
}
Expand All @@ -32,7 +38,7 @@ dynamic parseEncode(dynamic value, {bool full}) {
if (full) {
return value.toJson(full: full);
} else {
return value.toPointer();
return _encodeObject(value);
}
}

Expand All @@ -44,5 +50,16 @@ Map<String, dynamic> _encodeUint8List(Uint8List value) {
}

Map<String, dynamic> _encodeDate(DateTime date) {
return <String, dynamic>{'__type': 'Date', 'iso': _parseDateFormat.format(date)};
return <String, dynamic>{
'__type': 'Date',
'iso': _parseDateFormat.format(date)
};
}

Map<String, dynamic> _encodeObject(ParseObject object) {
return {
'__type': 'Pointer',
keyVarClassName: object.className,
keyVarObjectId: object.objectId
};
}
8 changes: 4 additions & 4 deletions lib/src/utils/parse_utils.dart
Expand Up @@ -12,7 +12,8 @@ bool isDebugEnabled({bool providedDebugStatus}) {
///
/// Debug can be set in 2 places, one global param in the Parse.initialize, and
/// then can be overwritten class by class
ParseHTTPClient getDefaultHttpClient(ParseHTTPClient providedClient, bool sendSessionId) {
ParseHTTPClient getDefaultHttpClient(
ParseHTTPClient providedClient, bool sendSessionId) {
return providedClient ??= ParseHTTPClient(
sendSessionId: sendSessionId ?? ParseCoreData().autoSendSessionId,
securityContext: ParseCoreData().securityContext);
Expand All @@ -24,9 +25,8 @@ ParseHTTPClient getDefaultHttpClient(ParseHTTPClient providedClient, bool sendSe
dynamic convertValueToCorrectType(dynamic value) {
if (value is String && !value.contains('__type')) {
return '\"$value\"';
}

if (value is DateTime || value is ParseObject) {
}
if (value is DateTime || value is ParseObject || value is ParseUser) {
return parseEncode(value);
} else {
return value;
Expand Down

0 comments on commit c79ac39

Please sign in to comment.