Skip to content

Private/test #140

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 28, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions example/lib/data/model/day.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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<String, dynamic> map) => Day.clone()..fromJson(map);

@override
Day fromJson(Map<String, dynamic> 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 keyStatus = 'Status';

DateTime get date => get<DateTime>(keyDate);

set date(DateTime date) => set<DateTime>(keyDate, date);

User get owner => get<User>(keyOwner);

set owner(User owner) => set<User>(keyOwner, owner);

int get status => get<int>(keyStatus);

set status(int status) => set<int>(keyStatus, status);
}
42 changes: 42 additions & 0 deletions example/lib/data/model/user.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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<String, dynamic> 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<DateTime>(keyDob);
set dob(DateTime dob) => set<DateTime>(keyDob, dob);

num get gender => get<num>(keyGender);
set gender(num gender) => set<num>(keyGender, gender);

num get height => get<num>(keyHeight);
set height(num height) => set<num>(keyHeight, height);

String get firebaseId => get<String>(keyHeight);
set firebaseId(String firebaseId) => set<String>(keyHeight, firebaseId);

String get name => get<String>(keyName);
set name(String name) => set<String>(keyName, name);

String get displayPicture => get<String>(keyDisplayPicture);
set displayPicture(String displayPicture) => set<String>(keyDisplayPicture, displayPicture);

bool get proUser => get<bool>(keyProUser);
set proUser(bool proUser) => set<bool>(keyProUser, proUser);
}
23 changes: 23 additions & 0 deletions example/lib/ui/main.dart
Original file line number Diff line number Diff line change
@@ -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';
@@ -74,6 +76,27 @@ class _MyAppState extends State<MyApp> {
initUser();
function();
functionWithParameters();
test();
}

Future<void> test() async {
User user = User('test_user', 'test_password', '[email protected]');
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<Day> query = QueryBuilder<Day>(Day())
..whereEqualTo(Day.keyOwner, user);
var item = await query.query();
print(item.toString());
}

Future<void> createItem() async {
7 changes: 6 additions & 1 deletion lib/parse_server_sdk.dart
Original file line number Diff line number Diff line change
@@ -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,
25 changes: 1 addition & 24 deletions lib/src/network/parse_http_client.dart
Original file line number Diff line number Diff line change
@@ -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)');
}
}
1 change: 1 addition & 0 deletions lib/src/network/parse_query.dart
Original file line number Diff line number Diff line change
@@ -284,6 +284,7 @@ class QueryBuilder<T extends ParseObject> {
/// that the column and value are being queried against
MapEntry<String, dynamic> _buildQueryWithColumnValueAndOperator(
MapEntry columnAndValue, String queryOperator) {

final String key = columnAndValue.key;
final dynamic value = convertValueToCorrectType(parseEncode(columnAndValue.value));

6 changes: 1 addition & 5 deletions lib/src/objects/parse_base.dart
Original file line number Diff line number Diff line change
@@ -206,9 +206,5 @@ abstract class ParseBase {
return null;
}

Map<String, String> toPointer() => <String, String>{
'__type': 'Pointer',
keyVarClassName: className,
keyVarObjectId: objectId
};
Map<String, dynamic> toPointer() => encodeObject(className, objectId);
}
45 changes: 24 additions & 21 deletions lib/src/objects/parse_object.dart
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@ class ParseObject extends ParseBase implements ParseCloneable {
/// Gets an object from the server using it's [String] objectId
Future<ParseResponse> 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<ParseObject>(this, result, ParseApiRQ.get, _debug, className);
return handleResponse<ParseObject>(
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<ParseObject>(this, result, ParseApiRQ.getAll, _debug, className);
return handleResponse<ParseObject>(
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<ParseObject>(this, result, ParseApiRQ.create, _debug, className);
return handleResponse<ParseObject>(
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<ParseObject>(this, result, ParseApiRQ.save, _debug, className);
return handleResponse<ParseObject>(
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<ParseObject>(this, result, apiRQType, _debug, className);
return handleResponse<ParseObject>(
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<dynamic> values) {
set<Map<String, dynamic>>(key, <String, dynamic>{'__op': arrayAction, 'objects': values});
set<Map<String, dynamic>>(
key, <String, dynamic>{'__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<Map<String, dynamic>>(
key, <String, dynamic>{'__op': 'Increment', 'amount': amount});
key, <String, dynamic>{'__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<Map<String, dynamic>>(
key, <String, dynamic>{'__op': 'Increment', 'amount': -amount});
key, <String, dynamic>{'__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<ParseObject>(this, result, apiRQType, _debug, className);
return handleResponse<ParseObject>(
this, result, apiRQType, _debug, className);
} else {
return null;
}
@@ -245,16 +253,10 @@ class ParseObject extends ParseBase implements ParseCloneable {
/// Can be used to create custom queries
Future<ParseResponse> 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<ParseObject>(this, result, ParseApiRQ.query, _debug, className);
return handleResponse<ParseObject>(
this, result, ParseApiRQ.query, _debug, className);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.query, _debug, className);
}
@@ -267,7 +269,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<ParseObject>(this, result, ParseApiRQ.delete, _debug, className);
return handleResponse<ParseObject>(
this, result, ParseApiRQ.delete, _debug, className);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.delete, _debug, className);
}
20 changes: 7 additions & 13 deletions lib/src/objects/parse_user.dart
Original file line number Diff line number Diff line change
@@ -145,25 +145,19 @@ class ParseUser extends ParseObject implements ParseCloneable {
/// provided, call this method to login.
Future<ParseResponse> 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: <String, String>{
keyVarUsername: username,
keyVarPassword: password
});
final Map<String, dynamic> queryParams = <String, String>{
keyVarUsername: username,
keyVarPassword: password
};

final Uri url = getSanitisedUri(_client, '$keyEndPointLogin', queryParams: queryParams);

final Response response =
await _client.get(url, headers: <String, String>{
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);
}
3 changes: 1 addition & 2 deletions lib/src/objects/response/parse_exception_response.dart
Original file line number Diff line number Diff line change
@@ -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;
}
20 changes: 16 additions & 4 deletions lib/src/objects/response/parse_response_utils.dart
Original file line number Diff line number Diff line change
@@ -4,12 +4,14 @@ part of flutter_parse_sdk;
@protected
ParseResponse handleResponse<T>(ParseCloneable object, Response response,
ParseApiRQ type, bool debug, String className) {

final ParseResponse parseResponse = _ParseResponseBuilder().handleResponse<T>(
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<T>(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;
@@ -49,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<String, dynamic> decodedResponse = jsonDecode(apiResponse.body);
final List<dynamic> results = decodedResponse['results'];

if (results == null) {
return false;
}

return results.isEmpty;
}

20 changes: 17 additions & 3 deletions lib/src/utils/parse_encoder.dart
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@ dynamic parseEncode(dynamic value, {bool full}) {
if (value is ParseGeoPoint) {
return value;
}

if (value is ParseFile) {
return value;
}
@@ -40,9 +40,23 @@ dynamic parseEncode(dynamic value, {bool full}) {
}

Map<String, dynamic> _encodeUint8List(Uint8List value) {
return <String, dynamic>{'__type': 'Bytes', 'base64': base64.encode(value)};
return <String, dynamic>{
'__type': 'Bytes',
'base64': base64.encode(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, String> encodeObject(String className, String objectId) {
return <String, String>{
'\"__type\"': '\"Pointer\"',
'\"$keyVarClassName\"': '\"$className\"',
'\"$keyVarObjectId\"': '\"$objectId\"'
};
}
44 changes: 36 additions & 8 deletions lib/src/utils/parse_logger.dart
Original file line number Diff line number Diff line change
@@ -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 += '\nClass: $className';
responseString += '\nFunction: $type';

if (parseResponse.success) {
responseString += '\nStatus Code: ${parseResponse.statusCode}';
@@ -27,10 +29,36 @@ 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 ' : ' ') + request.url.toString();
curlCmd += '\n\n ${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';
16 changes: 14 additions & 2 deletions lib/src/utils/parse_utils.dart
Original file line number Diff line number Diff line change
@@ -24,14 +24,26 @@ dynamic convertValueToCorrectType(dynamic value) {
}

/// Sanitises a url
Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend) {
Uri getSanitisedUri(ParseHTTPClient client, String pathToAppend,
{Map<String, dynamic> queryParams, String 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: 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;
}
}