diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index d754f93d2..72b978510 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -11,63 +11,17 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -130,8 +84,26 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -139,8 +111,44 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -154,6 +162,15 @@
+
+
+
+
+
+
+
+
+
@@ -177,6 +194,9 @@
toJson
toString
encode(
+ Json()
+ saV
+ save
part
@@ -226,24 +246,24 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -259,24 +279,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -289,12 +291,6 @@
-
-
-
-
-
-
@@ -352,6 +348,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -367,13 +381,13 @@
-
-
-
+
+
+
@@ -659,34 +673,19 @@
- file://$PROJECT_DIR$/lib/src/objects/parse_user.dart
- 183
-
-
-
- file://$PROJECT_DIR$/lib/src/objects/parse_user.dart
- 186
-
+ file://$PROJECT_DIR$/lib/src/objects/parse_object.dart
+ 59
+
- file://$PROJECT_DIR$/lib/src/objects/parse_user.dart
- 188
-
+ file://$PROJECT_DIR$/lib/src/objects/parse_object.dart
+ 74
+
file://$PROJECT_DIR$/lib/src/objects/parse_user.dart
- 259
-
-
-
- file://$PROJECT_DIR$/lib/src/objects/parse_response.dart
- 22
-
-
-
- file://$PROJECT_DIR$/lib/src/objects/parse_response.dart
- 46
-
+ 183
+
@@ -694,7 +693,7 @@
-
+
@@ -752,9 +751,6 @@
-
-
-
@@ -770,13 +766,6 @@
-
-
-
-
-
-
-
@@ -820,17 +809,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -845,13 +823,6 @@
-
-
-
-
-
-
-
@@ -859,20 +830,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -887,13 +844,6 @@
-
-
-
-
-
-
-
@@ -915,20 +865,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -984,17 +920,42 @@
-
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1005,17 +966,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
diff --git a/example/lib/main.dart b/example/lib/main.dart
index f7e27a4b5..ebd6e3d0e 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -51,6 +51,7 @@ class _MyAppState extends State {
}
runTestQueries() {
+ createItem();
getAllItems();
getAllItemsByName();
getSingleItem();
@@ -59,6 +60,19 @@ class _MyAppState extends State {
initUser();
}
+ void createItem() async {
+
+ var newObject = ParseObject('TestObjectForApi');
+ newObject.set('name', 'testItem');
+ newObject.set('age', 26);
+
+ var apiResponse = await newObject.create();
+
+ if (apiResponse.success && apiResponse.result != null) {
+ print(ApplicationConstants.keyAppName + ": " + apiResponse.result.toString());
+ }
+ }
+
void getAllItemsByName() async {
var apiResponse = await ParseObject('ParseTableName').getAll();
diff --git a/lib/parse.dart b/lib/parse.dart
index 2f38f3941..822840149 100644
--- a/lib/parse.dart
+++ b/lib/parse.dart
@@ -45,10 +45,6 @@ part 'src/utils/parse_logger.dart';
part 'src/utils/parse_utils.dart';
-part 'src/utils/parse_utils_date.dart';
-
-part 'src/utils/parse_utils_objects.dart';
-
class Parse {
ParseCoreData data;
final ParseHTTPClient client = new ParseHTTPClient();
diff --git a/lib/src/base/parse_constants.dart b/lib/src/base/parse_constants.dart
index 2b7902730..89002b7dd 100644
--- a/lib/src/base/parse_constants.dart
+++ b/lib/src/base/parse_constants.dart
@@ -16,7 +16,7 @@ const String keyEndPointHealth = '/health';
const String keyVarClassName = 'className';
const String keyVarObjectId = 'objectId';
const String keyVarCreatedAt = 'createdAt';
-const String keyVarUpdatedAt = 'updatedAT';
+const String keyVarUpdatedAt = 'updatedAt';
const String keyVarUsername = 'username';
const String keyVarEmail = 'email';
const String keyVarPassword = 'password';
diff --git a/lib/src/network/parse_http_client.dart b/lib/src/network/parse_http_client.dart
index c3656302c..8b549938c 100644
--- a/lib/src/network/parse_http_client.dart
+++ b/lib/src/network/parse_http_client.dart
@@ -13,7 +13,7 @@ class ParseHTTPClient extends BaseClient {
Future send(BaseRequest request) {
request.headers[keyHeaderUserAgent] = _userAgent;
request.headers[keyHeaderApplicationId] = data.applicationId;
- request.headers[keyHeaderContentType] = keyHeaderContentTypeJson;
+ //request.headers[keyHeaderContentType] = keyHeaderContentTypeJson;
if (data.masterKey != null) request.headers[keyHeaderMasterKey] = data.masterKey;
return _client.send(request);
}
diff --git a/lib/src/objects/parse_base.dart b/lib/src/objects/parse_base.dart
index 3d77c7f0b..20e3f1798 100644
--- a/lib/src/objects/parse_base.dart
+++ b/lib/src/objects/parse_base.dart
@@ -16,16 +16,10 @@ abstract class ParseBase {
set objectId(String objectId) => set(keyVarObjectId, objectId);
/// Returns [DateTime] createdAt
- DateTime get createdAt => stringToDateTime(get(keyVarCreatedAt));
-
- set createdAt(DateTime createdAt) =>
- set(keyVarCreatedAt, dateTimeToString(createdAt));
+ DateTime get createdAt => get(keyVarCreatedAt);
/// Returns [DateTime] updatedAt
- DateTime get updatedAt => stringToDateTime(get(keyVarUpdatedAt));
-
- set updatedAt(DateTime updatedAt) =>
- set(keyVarUpdatedAt, dateTimeToString(updatedAt));
+ DateTime get updatedAt => get(keyVarUpdatedAt);
/// Converts object to [String] in JSON format
@protected
@@ -39,11 +33,11 @@ abstract class ParseBase {
}
if (createdAt != null) {
- map[keyVarCreatedAt] = dateTimeToString(createdAt);
+ map[keyVarCreatedAt] = createdAt.toIso8601String();
}
if (updatedAt != null) {
- map[keyVarUpdatedAt] = dateTimeToString(updatedAt);
+ map[keyVarUpdatedAt] = updatedAt.toIso8601String();
}
getObjectData().forEach((key, value) {
@@ -51,16 +45,18 @@ abstract class ParseBase {
});
if (forApiRQ) {
- map.remove(keyVarClassName);
- map.remove(keyVarAcl);
- map.remove(keyParamSessionToken);
+ map.remove(keyVarCreatedAt);
+ map.remove(keyVarUpdatedAt);
+ map.remove(keyVarClassName);
+ map.remove(keyVarAcl);
+ map.remove(keyParamSessionToken);
}
return map;
}
@override
- String toString() => JsonEncoder().convert(toJson());
+ String toString() => json.encode(toJson());
@protected
fromJson(Map objectData) {
@@ -70,9 +66,9 @@ abstract class ParseBase {
} else if (key == keyVarObjectId) {
objectId = value;
} else if (key == keyVarCreatedAt) {
- createdAt = stringToDateTime(value);
+ set(keyVarCreatedAt, DateTime.parse(value));
} else if (key == keyVarUpdatedAt) {
- updatedAt = stringToDateTime(value);
+ set(keyVarUpdatedAt, DateTime.parse(value));
} else {
getObjectData()[key] = parseDecode(value);
}
@@ -83,7 +79,7 @@ abstract class ParseBase {
/// Creates a copy of this class
@protected
- copy() => fromJson(JsonDecoder().convert(toJson()));
+ copy() => fromJson(json.decode(toJson()));
/// Sets all the objects variables
@protected
@@ -135,7 +131,9 @@ abstract class ParseBase {
/// Replicates Android SDK pin process and saves object to storage
Future pin() async {
if (objectId != null) {
- await ParseCoreData().getStore().setString(objectId, JsonEncoder().convert(toJson()));
+ await ParseCoreData()
+ .getStore()
+ .setString(objectId, json.encode(toJson()));
return true;
} else {
return false;
@@ -163,7 +161,7 @@ abstract class ParseBase {
var itemFromStore = ParseCoreData().getStore().getString(objectId);
if (itemFromStore != null) {
- var map = JsonDecoder().convert(itemFromStore);
+ var map = json.decode(itemFromStore);
if (map != null) {
return fromJson(map);
diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart
index 8ad2a9093..66b75736f 100644
--- a/lib/src/objects/parse_object.dart
+++ b/lib/src/objects/parse_object.dart
@@ -1,8 +1,7 @@
part of flutter_parse_sdk;
class ParseObject extends ParseBase implements ParseCloneable {
-
- ParseObject.clone(String className): this('className');
+ ParseObject.clone(String className) : this('className');
@override
clone(Map map) => ParseObject.clone(className)..fromJson(map);
@@ -16,18 +15,18 @@ class ParseObject extends ParseBase implements ParseCloneable {
/// [String] className refers to the Table Name in your Parse Server,
/// [bool] debug will overwrite the current default debug settings and
/// [ParseHttpClient] can be overwritten to create your own HTTP Client
- ParseObject(String className, {bool debug: false}): super() {
+ ParseObject(String className, {bool debug: false}) : super() {
setClassName(className);
_path = "$keyEndPointClasses$className";
setClient(ParseHTTPClient());
setDebug(isDebugEnabled(objectLevelDebug: debug));
}
- void setDebug(bool debug){
+ void setDebug(bool debug) {
_debug = debug;
}
- void setClient(ParseHTTPClient client){
+ void setClient(ParseHTTPClient client) {
_client = client;
}
@@ -57,7 +56,8 @@ class ParseObject extends ParseBase implements ParseCloneable {
Future create() async {
try {
var uri = _client.data.serverUrl + "$_path";
- var result = await _client.post(uri, body: toJson(forApiRQ: true));
+ var body = json.encode(toJson(forApiRQ: true));
+ var result = await _client.post(uri, body: body);
return handleResponse(result, ParseApiRQ.create);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.create);
@@ -71,7 +71,8 @@ class ParseObject extends ParseBase implements ParseCloneable {
} else {
try {
var uri = "${ParseCoreData().serverUrl}$_path/$objectId";
- var result = await _client.put(uri, body: toJson(forApiRQ: true));
+ var body = json.encode(toJson(forApiRQ: true));
+ var result = await _client.put(uri, body: body);
return handleResponse(result, ParseApiRQ.save);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.save);
@@ -107,7 +108,8 @@ class ParseObject extends ParseBase implements ParseCloneable {
ParseResponse parseResponse = ParseResponse.handleResponse(this, response);
if (_debug) {
- logger(ParseCoreData().appName, className, type.toString(), parseResponse);
+ logger(
+ ParseCoreData().appName, className, type.toString(), parseResponse);
}
return parseResponse;
@@ -119,7 +121,8 @@ class ParseObject extends ParseBase implements ParseCloneable {
ParseResponse parseResponse = ParseResponse.handleException(exception);
if (_debug) {
- logger(ParseCoreData().appName, className, type.toString(), parseResponse);
+ logger(
+ ParseCoreData().appName, className, type.toString(), parseResponse);
}
return parseResponse;
diff --git a/lib/src/objects/parse_response.dart b/lib/src/objects/parse_response.dart
index 102a5ca49..7c4cb22ec 100644
--- a/lib/src/objects/parse_response.dart
+++ b/lib/src/objects/parse_response.dart
@@ -19,7 +19,7 @@ class ParseResponse {
if (apiResponse != null) {
parseResponse.statusCode = apiResponse.statusCode;
- if (apiResponse.statusCode != 200) {
+ if (apiResponse.statusCode != 200 && apiResponse.statusCode != 201) {
return _handleError(parseResponse, apiResponse);
} else if (apiResponse.body == "{\"results\":[]}"){
return _handleSuccessWithNoResults(parseResponse, 1, "Successful request, but no results found");
diff --git a/lib/src/objects/parse_user.dart b/lib/src/objects/parse_user.dart
index 9bda3cef4..2781b07d2 100644
--- a/lib/src/objects/parse_user.dart
+++ b/lib/src/objects/parse_user.dart
@@ -106,7 +106,7 @@ class ParseUser extends ParseBase implements ParseCloneable {
headers: {
keyHeaderRevocableSession: "1",
},
- body: JsonEncoder().convert(bodyData));
+ body: json.encode(bodyData));
_handleResponse(response, ParseApiRQ.signUp);
return this;
@@ -151,8 +151,7 @@ class ParseUser extends ParseBase implements ParseCloneable {
try {
final response = await _client.post(
"${_client.data.serverUrl}$keyEndPointVerificationEmail",
- body: JsonEncoder().convert({keyVarEmail: emailAddress}));
-
+ body: json.encode({keyVarEmail: emailAddress}));
return _handleResponse(response, ParseApiRQ.verificationEmailRequest);
} on Exception catch (e) {
return _handleException(e, ParseApiRQ.verificationEmailRequest);
@@ -164,7 +163,7 @@ class ParseUser extends ParseBase implements ParseCloneable {
try {
final response = await _client.post(
"${_client.data.serverUrl}$keyEndPointRequestPasswordReset",
- body: JsonEncoder().convert({keyVarEmail: emailAddress}));
+ body: json.encode({keyVarEmail: emailAddress}));
return _handleResponse(response, ParseApiRQ.requestPasswordReset);
} on Exception catch (e) {
return _handleException(e, ParseApiRQ.requestPasswordReset);
@@ -180,10 +179,9 @@ class ParseUser extends ParseBase implements ParseCloneable {
return signUp();
} else {
try {
- Map map = toJson(forApiRQ: true);
- final response = await _client.put(
- _client.data.serverUrl + "$path/$objectId",
- body: map);
+ var uri = _client.data.serverUrl + "$path/$objectId";
+ var body = json.encode(toJson(forApiRQ: true), toEncodable: dateTimeEncoder);
+ final response = await _client.put(uri, body: body);
return _handleResponse(response, ParseApiRQ.save);
} on Exception catch (e) {
return _handleException(e, ParseApiRQ.save);
diff --git a/lib/src/utils/parse_decoder.dart b/lib/src/utils/parse_decoder.dart
index 98b4c6588..9bb66ed5b 100644
--- a/lib/src/utils/parse_decoder.dart
+++ b/lib/src/utils/parse_decoder.dart
@@ -50,7 +50,7 @@ dynamic parseDecode(dynamic value) {
switch (map["__type"]) {
case "Date":
String iso = map["iso"];
- return stringToDateTime(iso);
+ return DateTime.parse(iso);
case "Bytes":
String val = map["base64"];
return base64.decode(val);
diff --git a/lib/src/utils/parse_encoder.dart b/lib/src/utils/parse_encoder.dart
index 770c54442..4fc52a7ca 100644
--- a/lib/src/utils/parse_encoder.dart
+++ b/lib/src/utils/parse_encoder.dart
@@ -1,5 +1,13 @@
part of flutter_parse_sdk;
+/// Custom encoder for DateTime
+dynamic dateTimeEncoder(dynamic item) {
+ if(item is DateTime) {
+ return item.toIso8601String();
+ }
+ return item;
+}
+
bool isValidType(dynamic value) {
return value == null ||
value is String ||
@@ -24,7 +32,7 @@ dynamic parseEncode(dynamic value) {
}
if (value is ParseObject) {
- return value.toJson;
+ return _encodeObject(value);
}
if (value is ParseUser) {
@@ -38,6 +46,10 @@ dynamic parseEncode(dynamic value) {
return value;
}
+String _encodeObject(ParseObject object){
+ return "{'__type': 'Pointer', $keyVarClassName: ${object.className}, $keyVarObjectId: ${object.objectId}}";
+}
+
Map _encodeDate(DateTime date) {
- return {"__type": "Date", "iso": dateTimeToString(date)};
+ return {"__type": "Date", "iso": date.toIso8601String()};
}
diff --git a/lib/src/utils/parse_utils_date.dart b/lib/src/utils/parse_utils_date.dart
deleted file mode 100644
index c0073abbd..000000000
--- a/lib/src/utils/parse_utils_date.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-part of flutter_parse_sdk;
-
-/// Converts a [String] into a [DateTime] from a Parse Server format
-DateTime stringToDateTime(String date) {
- if (date == null) return null;
-
- try {
- return DateTime.parse(date);
- } on FormatException {
- return null;
- }
-}
-
-/// Serialize [DateTime] into an ISO-8601 full-precision extended format representation.
-String dateTimeToString(DateTime datetime) {
- if (datetime == null) return null;
-
- if (!datetime.isUtc) {
- datetime = datetime.toUtc();
- }
-
- String y = _fourDigits(datetime.year);
- String m = _twoDigits(datetime.month);
- String d = _twoDigits(datetime.day);
- String h = _twoDigits(datetime.hour);
- String min = _twoDigits(datetime.minute);
- String sec = _twoDigits(datetime.second);
- String ms = _threeDigits(datetime.millisecond);
-
- return "$y-$m-${d}T$h:$min:$sec.${ms}Z";
-}
-
-String _fourDigits(int n) {
- int absN = n.abs();
- String sign = n < 0 ? "-" : "";
- if (absN >= 1000) return "$n";
- if (absN >= 100) return "${sign}0$absN";
- if (absN >= 10) return "${sign}00$absN";
- return "${sign}000$absN";
-}
-
-String _threeDigits(int n) {
- if (n >= 100) return "$n";
- if (n >= 10) return "0$n";
- return "00$n";
-}
-
-String _twoDigits(int n) {
- if (n >= 10) return "$n";
-return "0$n";
-}
\ No newline at end of file
diff --git a/lib/src/utils/parse_utils_objects.dart b/lib/src/utils/parse_utils_objects.dart
deleted file mode 100644
index da253939f..000000000
--- a/lib/src/utils/parse_utils_objects.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-part of flutter_parse_sdk;
-
-/// Populates the base object data from a server response
-populateObjectBaseData(ParseBase object, Map objectData) {
- object.set(keyVarObjectId, objectData[keyVarObjectId]);
- object.set(keyVarCreatedAt, stringToDateTime(objectData[keyVarCreatedAt]));
- object.set(keyVarObjectId, stringToDateTime(objectData[keyVarUpdatedAt]));
- return object;
-}