Skip to content

Rebasing #89

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 34 commits into from
Mar 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
097e116
Merge pull request #1 from phillwiggins/master
chrbayer Feb 7, 2019
652c6db
Merge pull request #75 from phillwiggins/develop
phillwiggins Feb 7, 2019
a1f742b
Merge branches 'develop' and 'master' of https://github.com/phillwigg…
phillwiggins Feb 7, 2019
257f337
Merge branches 'develop' and 'master' of https://github.com/phillwigg…
phillwiggins Feb 7, 2019
e70f3e1
Merge pull request #76 from phillwiggins/release/1.0.11
phillwiggins Feb 7, 2019
b103aff
Merge pull request #4 from phillwiggins/master
chrbayer Feb 7, 2019
35b7538
Clean-up usage of ParseHTTPClient objects.
Feb 8, 2019
970335b
Clean-up usage of debug switch.
Feb 8, 2019
e2c1f69
Fix some spellings.
Feb 8, 2019
a578a01
Merge pull request #77 from chrbayer/master
phillwiggins Feb 8, 2019
9e65690
Small clean-ups for storage.
Feb 10, 2019
241e8ce
Always send sessionId if available.
Feb 12, 2019
3808441
Merge remote-tracking branch 'origin/master'
Feb 12, 2019
8c0d423
Remove unused function initStorage.
Feb 13, 2019
ae1cdad
Fixed Parse logout and unpin
phillwiggins Feb 16, 2019
fc97e26
Merge remote-tracking branch 'origin/master'
phillwiggins Feb 16, 2019
311e25e
Merge branches 'develop' and 'master' of https://github.com/phillwigg…
phillwiggins Feb 16, 2019
82bbbae
v1.0.12 - Fixed login
phillwiggins Feb 16, 2019
3194cab
Merge branch 'master' of https://github.com/phillwiggins/flutter_pars…
Feb 16, 2019
0e8734c
Allow given token in getCurrentUserFromServer.
Feb 16, 2019
88f0b80
Merge pull request #80 from chrbayer/master
phillwiggins Feb 16, 2019
daf8aca
Make automatic sending of sessionId optional.
Feb 16, 2019
85a7177
Merge pull request #81 from chrbayer/master
phillwiggins Feb 17, 2019
17972fc
Add autoSendSessionId parameter to README.md
Feb 17, 2019
b737afb
Merge pull request #82 from chrbayer/master
phillwiggins Feb 17, 2019
fcea37e
added call to logout endpoint
rickspencer3 Feb 19, 2019
3ab44bc
Merge pull request #84 from rapido-mobile/logout
phillwiggins Feb 20, 2019
3f18bc7
Merge pull request #6 from phillwiggins/master
chrbayer Feb 20, 2019
8cef05d
Fix ParseUser.logout method.
Feb 20, 2019
4735f2c
sessionId has to be delete at all circumstances.
Feb 20, 2019
c0c7b86
Merge pull request #85 from chrbayer/master
phillwiggins Feb 20, 2019
799c83b
Handle sessionToken correctly in ParseUser
Feb 22, 2019
c429de2
Merge pull request #86 from chrbayer/master
phillwiggins Feb 24, 2019
4d26dae
Merge pull request #88 from phillwiggins/release/1.0.12
phillwiggins Mar 3, 2019
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
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
## 1.0.12
Fixed logout

## 1.0.11
ParseFile fixed
Anonymous login
SecurityContext
CloudFunctions with objects

## 1.0.10
Add ParseConfig.
Fixed whereEqualsTo('', PARSEOBJECT) and other queries
Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Want to get involved? Join our Slack channel and help out! (http://flutter-parse
To install, either add to your pubspec.yaml
```
dependencies:
parse_server_sdk: ^1.0.10
parse_server_sdk: ^1.0.12
```
or clone this repository and add to your project. As this is an early development with multiple contributors, it is probably best to download/clone and keep updating as an when a new feature is added.

Expand All @@ -33,8 +33,11 @@ Parse().initialize(
ApplicationConstants.keyApplicationId,
ApplicationConstants.keyParseServerUrl,
masterKey: ApplicationConstants.keyParseMasterKey,
debug: true,
liveQuery: true);
clientKey: ApplicationConstants.keyParseClientKey,
debug: true,
liveQuery: true,
autoSendSessionId: true,
securityContext: securityContext);
```

## Queries
Expand Down
8 changes: 4 additions & 4 deletions example/lib/diet_plan.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import 'dart:core';

import 'package:parse_server_sdk/parse.dart';
import 'package:parse_server_sdk/parse_server_sdk.dart';

class DietPlan extends ParseObject implements ParseCloneable {

DietPlan() : super(_keyTableName);
DietPlan.clone(): this();
DietPlan.clone() : this();

/// Looks strangely hacky but due to Flutter not using reflection, we have to
/// mimic a clone
@override clone(Map map) => DietPlan.clone()..fromJson(map);
@override
clone(Map map) => DietPlan.clone()..fromJson(map);

static const String _keyTableName = 'Diet_Plans';
static const String keyName = 'Name';
Expand Down
32 changes: 15 additions & 17 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_plugin_example/application_constants.dart';
import 'package:flutter_plugin_example/diet_plan.dart';
import 'package:parse_server_sdk/parse.dart';
import 'package:parse_server_sdk/parse_server_sdk.dart';

void main() => runApp(new MyApp());

Expand Down Expand Up @@ -155,9 +155,14 @@ class _MyAppState extends State<MyApp> {
// Best practice for starting the app. This will check for a valid user
user = await ParseUser.currentUser();
await user.logout();
user = await ParseUser.currentUser();

response = await ParseUser.getCurrentUserFromServer();
user =
ParseUser("TestFlutter", "TestPassword123", "[email protected]");
response = await user.login();
if (response.success) user = response.result;

response = await ParseUser.getCurrentUserFromServer(
token: user.get(keyHeaderSessionToken));
if (response.success) user = response.result;

response = await user.save();
Expand All @@ -178,20 +183,13 @@ class _MyAppState extends State<MyApp> {
}

function() async {
var user =
ParseUser("TestFlutter", "TestPassword123", "[email protected]");
await user.signUp();
var loginResponse = await user.login();
if (loginResponse.success) user = loginResponse.result;

var customClient = ParseHTTPClient();
customClient.additionalHeaders = {
keyHeaderSessionToken: ParseCoreData().sessionId
};
var function = ParseCloudFunction('hello', client: customClient);
function.execute();

user.destroy();
var function = ParseCloudFunction('hello');
var result = await function.executeObjectFunction<ParseObject>();
if (result.success) {
if (result.result is ParseObject) {
print((result.result as ParseObject).className);
}
}
}

functionWithParameters() async {
Expand Down
34 changes: 21 additions & 13 deletions lib/parse.dart → lib/parse_server_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ part 'src/enums/parse_enum_api_rq.dart';

part 'src/network/parse_http_client.dart';

part 'src/network/parse_livequery.dart';
part 'src/network/parse_live_query.dart';

part 'src/network/parse_query.dart';

part 'src/objects/parse_base.dart';

part 'src/objects/parse_clonable.dart';
part 'src/objects/parse_cloneable.dart';

part 'src/objects/parse_config.dart';

Expand Down Expand Up @@ -58,11 +58,11 @@ part 'src/utils/parse_utils.dart';

class Parse {
ParseCoreData data;
bool _hasBeenInitialised = false;
bool _hasBeenInitialized = false;

/// To initialise Parse Server in your application
/// To initialize Parse Server in your application
///
/// This should be initialised in MyApp() creation
/// This should be initialized in MyApp() creation
///
/// ```
/// Parse().initialize(
Expand All @@ -79,6 +79,7 @@ class Parse {
String clientKey,
String masterKey,
String sessionId,
bool autoSendSessionId,
SecurityContext securityContext}) {
ParseCoreData.init(appId, serverUrl,
debug: debug,
Expand All @@ -87,30 +88,37 @@ class Parse {
masterKey: masterKey,
clientKey: clientKey,
sessionId: sessionId,
autoSendSessionId: autoSendSessionId,
securityContext: securityContext);

ParseCoreData().initStorage();

_hasBeenInitialised = true;
_hasBeenInitialized = true;

return Parse();
}

bool hasParseBeenInitialised() => _hasBeenInitialised;
bool hasParseBeenInitialized() => _hasBeenInitialized;

Future<ParseResponse> healthCheck() async {
Future<ParseResponse> healthCheck(
{bool debug, ParseHTTPClient client, bool autoSendSessionId}) async {
ParseResponse parseResponse;

bool _debug = isDebugEnabled(objectLevelDebug: debug);
ParseHTTPClient _client = client ??
ParseHTTPClient(
autoSendSessionId:
autoSendSessionId ?? ParseCoreData().autoSendSessionId,
securityContext: ParseCoreData().securityContext);

try {
var response = await ParseHTTPClient(ParseCoreData().securityContext)
.get("${ParseCoreData().serverUrl}$keyEndPointHealth");
var response =
await _client.get("${ParseCoreData().serverUrl}$keyEndPointHealth");
parseResponse =
ParseResponse.handleResponse(this, response, returnAsResult: true);
} on Exception catch (e) {
parseResponse = ParseResponse.handleException(e);
}

if (ParseCoreData().debug) {
if (_debug) {
logger(ParseCoreData().appName, keyClassMain,
ParseApiRQ.healthCheck.toString(), parseResponse);
}
Expand Down
4 changes: 3 additions & 1 deletion lib/src/base/parse_constants.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
part of flutter_parse_sdk;

// Library
const String keySdkVersion = '1.0.10';
const String keySdkVersion = '1.0.12';
const String keyLibraryName = 'Flutter Parse SDK';

// End Points
const String keyEndPointUserName = '/users/me';
const String keyEndPointLogin = '/login';
const String keyEndPointLogout = '/logout';
const String keyEndPointUsers = '/users';
const String keyEndPointVerificationEmail = '/verificationEmailRequest';
const String keyEndPointRequestPasswordReset = '/requestPasswordReset';
Expand All @@ -21,6 +22,7 @@ const String keyVarUpdatedAt = 'updatedAt';
const String keyVarUsername = 'username';
const String keyVarEmail = 'email';
const String keyVarPassword = 'password';
const String keyVarSessionToken = 'sessionToken';
const String keyVarAcl = 'ACL';

// Classes
Expand Down
10 changes: 5 additions & 5 deletions lib/src/data/parse_core_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class ParseCoreData {
masterKey,
clientKey,
sessionId,
autoSendSessionId,
securityContext}) {
_instance = ParseCoreData._init(appId, serverUrl);

Expand All @@ -26,6 +27,8 @@ class ParseCoreData {
if (clientKey != null) _instance.clientKey = clientKey;
if (masterKey != null) _instance.masterKey = masterKey;
if (sessionId != null) _instance.sessionId = sessionId;
if (autoSendSessionId != null)
_instance.autoSendSessionId = autoSendSessionId;
if (securityContext != null) _instance.securityContext = securityContext;
}

Expand All @@ -36,6 +39,7 @@ class ParseCoreData {
String masterKey;
String clientKey;
String sessionId;
bool autoSendSessionId;
SecurityContext securityContext;
bool debug;
SharedPreferences storage;
Expand All @@ -52,12 +56,8 @@ class ParseCoreData {
this.sessionId = sessionId;
}

void initStorage() async {
storage = await SharedPreferences.getInstance();
}

Future<SharedPreferences> getStore() async {
return storage != null ? storage : await SharedPreferences.getInstance();
return storage ?? (storage = await SharedPreferences.getInstance());
}

@override
Expand Down
1 change: 1 addition & 0 deletions lib/src/enums/parse_enum_api_rq.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ enum ParseApiRQ {
currentUser,
signUp,
login,
logout,
loginAnonymous,
verificationEmailRequest,
requestPasswordReset,
Expand Down
21 changes: 15 additions & 6 deletions lib/src/network/parse_http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ part of flutter_parse_sdk;
/// Creates a custom version of HTTP Client that has Parse Data Preset
class ParseHTTPClient extends BaseClient {
final Client _client;
final bool _autoSendSessionId;
final String _userAgent = "$keyLibraryName $keySdkVersion";
ParseCoreData data = ParseCoreData();
Map<String, String> additionalHeaders;

ParseHTTPClient([SecurityContext securityContext])
: _client = securityContext != null
ParseHTTPClient(
{bool autoSendSessionId = false, SecurityContext securityContext})
: _autoSendSessionId = autoSendSessionId,
_client = securityContext != null
? IOClient(HttpClient(context: securityContext))
: IOClient();

Expand All @@ -17,13 +20,19 @@ class ParseHTTPClient extends BaseClient {
Future<StreamedResponse> send(BaseRequest request) {
request.headers[keyHeaderUserAgent] = _userAgent;
request.headers[keyHeaderApplicationId] = data.applicationId;
if ((_autoSendSessionId == true) &&
(data.sessionId != null) &&
(request.headers[keyHeaderSessionToken] == null))
request.headers[keyHeaderSessionToken] = data.sessionId;

if (data.clientKey != null) request.headers[keyHeaderClientKey] = data.clientKey;
if (data.masterKey != null) request.headers[keyHeaderMasterKey] = data.masterKey;
if (data.clientKey != null)
request.headers[keyHeaderClientKey] = data.clientKey;
if (data.masterKey != null)
request.headers[keyHeaderMasterKey] = data.masterKey;

/// If developer wants to add custom headers, extend this class and add headers needed.
if (additionalHeaders != null && additionalHeaders.length > 0){
additionalHeaders.forEach((k,v) => request.headers[k] = v);
if (additionalHeaders != null && additionalHeaders.length > 0) {
additionalHeaders.forEach((k, v) => request.headers[k] = v);
}

return _client.send(request);
Expand Down
24 changes: 12 additions & 12 deletions lib/src/network/parse_query.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ class QueryBuilder<T extends ParseObject> {
limiters['where'] = where;
}

/// Orders the results ascedingly.
/// Sorts the results in ascending order.
///
/// [String] order will be the column of the table that the results are
/// ordered by
void orderByAscending(String order) {
limiters["order"] = order;
}

/// Orders the results descendingly.
/// Sorts the results descending order.
///
/// [String] order will be the column of the table that the results are
/// ordered by
Expand All @@ -48,12 +48,12 @@ class QueryBuilder<T extends ParseObject> {
/// [String] keys will only return the columns of a result you want the data for,
/// this is useful for large objects
void keysToReturn(List<String> keys) {
limiters["keys"] = concatArray(keys);
limiters["keys"] = concatenateArray(keys);
}

/// Includes other ParseObjects stored as a Pointer
void includeObject(List<String> objectTypes) {
limiters["include"] = concatArray(objectTypes);
limiters["include"] = concatenateArray(objectTypes);
}

/// Returns an object where the [String] column starts with [value]
Expand Down Expand Up @@ -131,7 +131,7 @@ class QueryBuilder<T extends ParseObject> {
MapEntry(column, value), "\$nin"));
}

/// Returns an object where the [String] column for the object has data correctley entered/saved
/// Returns an object where the [String] column for the object has data correctly entered/saved
void whereValueExists(String column, bool value) {
queries.add(_buildQueryWithColumnValueAndOperator(
MapEntry(column, value), "\$exists"));
Expand Down Expand Up @@ -211,7 +211,7 @@ class QueryBuilder<T extends ParseObject> {
return queryBuilder;
}

String concatArray(List<String> queries) {
String concatenateArray(List<String> queries) {
String queryBuilder = "";

for (var item in queries) {
Expand Down Expand Up @@ -252,17 +252,17 @@ class QueryBuilder<T extends ParseObject> {
/// This joins queries that should be joined together... e.g. age > 10 &&
/// age < 20, this would be similar to age > 10 < 20
List _checkForMultipleColumnInstances(List<MapEntry> queries) {
List<MapEntry> sanitisedQueries = List();
List<MapEntry> sanitizedQueries = List();
List<String> keysAlreadyCompacted = List();

// Run through each query
for (var query in queries) {
// Add queries that don't need sanitising
// Add queries that don't need sanitizing
if (query.key == _NO_OPERATOR_NEEDED || query.key == _SINGLE_QUERY) {
sanitisedQueries.add(MapEntry(_NO_OPERATOR_NEEDED, query.value));
sanitizedQueries.add(MapEntry(_NO_OPERATOR_NEEDED, query.value));
}

// Check if query with same column name has been sanitised
// Check if query with same column name has been sanitized
if (!keysAlreadyCompacted.contains(query.key) &&
query.key != _NO_OPERATOR_NEEDED &&
query.key != _SINGLE_QUERY) {
Expand Down Expand Up @@ -290,11 +290,11 @@ class QueryBuilder<T extends ParseObject> {
}
}

sanitisedQueries.add(MapEntry(query.key, queryStart += "{$queryEnd}"));
sanitizedQueries.add(MapEntry(query.key, queryStart += "{$queryEnd}"));
}
}

return sanitisedQueries;
return sanitizedQueries;
}

/// Adds the limiters to the query, i.e. skip=10, limit=10
Expand Down
Loading