Skip to content

BugFix LiveQuery - update readme.md #150

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 17 commits into from
Apr 13, 2019
Merged
Show file tree
Hide file tree
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
263 changes: 190 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,95 @@ Parse().initialize(
masterKey: ApplicationConstants.keyParseMasterKey,
clientKey: ApplicationConstants.keyParseClientKey,
debug: true,
liveQuery: true,
liveQueryUrl: ApplicationConstants.keyLiveQueryUrl,
autoSendSessionId: true,
securityContext: securityContext);
```

## Objects
You can create custom objects by calling:
```dart
var dietPlan = ParseObject('DietPlan')
..set('Name', 'Ketogenic')
..set('Fat', 65);
```
You then have the ability to do the following with that object:
The features available are:-
* Get
* GetAll
* Create
* Save
* Query - By object Id
* Delete
* Complex queries as shown above
* Pin
* Plenty more
* Counters
* Array Operators

## 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);
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);

static const String _keyTableName = 'Diet_Plans';
static const String keyName = 'Name';

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

```

## Add new values to objects
To add a variable to an object call and retrieve it, call

```dart
dietPlan.set<int>('RandomInt', 8);
var randomInt = dietPlan.get<int>('RandomInt');
```

## Save objects using pins
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);

```

## Array Operator in objects
Retrieve it, call

```dart
var response = await dietPlan.add("listKeywords", ["a", "a","d"]);

var response = await dietPlan.addUnique("listKeywords", ["a", "a","d"]);

var response = await dietPlan.remove("listKeywords", ["a"]);

```

## Queries
Once you have setup the project and initialised the instance, you can then retreive data from your server by calling:
```dart
Expand All @@ -63,7 +147,6 @@ var dietPlan = await DietPlan().getObject('R5EonpUDWy');
}
```


## Complex queries
You can create complex queries to really put your database to the test:

Expand Down Expand Up @@ -155,98 +238,136 @@ If you only care about the number of games played by a particular player:
}
```

## Objects
## Live Queries
This tool allows you to subscribe to a QueryBuilder you are interested in. Once subscribed, the server will notify clients
whenever a ParseObject that matches the QueryBuilder is created or updated, in real-time.

You can create custom objects by calling:
```dart
var dietPlan = ParseObject('DietPlan')
..set('Name', 'Ketogenic')
..set('Fat', 65);
```
You then have the ability to do the following with that object:
The features available are:-
* Get
* GetAll
* Create
* Save
* Query - By object Id
* Delete
* Complex queries as shown above
* Pin
* Plenty more
* Counters
* Array Operators
Parse LiveQuery contains two parts, the LiveQuery server and the LiveQuery clients. In order to use live queries, you need
to set up both of them.

## Custom Objects
You can create your own ParseObjects or convert your existing objects into Parse Objects by doing the following:
The Parse Server configuration guide on the server is found here https://docs.parseplatform.org/parse-server/guide/#live-queries and is not part of this documentation.

Initialize the Parse Live Query by entering the parameter liveQueryUrl in Parse().initialize:
```dart
class DietPlan extends ParseObject implements ParseCloneable {

DietPlan() : super(_keyTableName);
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);

static const String _keyTableName = 'Diet_Plans';
static const String keyName = 'Name';

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

Parse().initialize(
ApplicationConstants.keyApplicationId,
ApplicationConstants.keyParseServerUrl,
clientKey: ApplicationConstants.keyParseClientKey,
debug: true,
liveQueryUrl: ApplicationConstants.keyLiveQueryUrl,
autoSendSessionId: true);
```

## Add new values to objects

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

Declare LiveQuery:
```dart
dietPlan.set<int>('RandomInt', 8);
var randomInt = dietPlan.get<int>('RandomInt');
final LiveQuery liveQuery = LiveQuery();
```

## Save objects using pins

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

Set the QueryBuilder that will be monitored by LiveQuery:
```dart
dietPlan.pin();
QueryBuilder<ParseObject> query =
QueryBuilder<ParseObject>(ParseObject('TestAPI'))
..whereEqualTo('intNumber', 1);
```

and to retrieve it
__Create a subscription__
You’ll get the LiveQuery events through this subscription.
The first time you call subscribe, we’ll try to open the WebSocket connection to the LiveQuery server for you.

```dart
var dietPlan = DietPlan().fromPin('OBJECT ID OF OBJECT');
await liveQuery.subscribe(query);
```

## Increment Counter values in objects

Retrieve it, call
__Event Handling__
We define several types of events you’ll get through a subscription object:

__Create event__
When a new ParseObject is created and it fulfills the QueryBuilder you subscribe, you’ll get this event.
The object is the ParseObject which was created.
```dart
var response = await dietPlan.increment("count", 1);

liveQuery.on(LiveQueryEvent.create, (value) {
print('*** CREATE ***: ${DateTime.now().toString()}\n $value ');
print((value as ParseObject).objectId);
print((value as ParseObject).updatedAt);
print((value as ParseObject).createdAt);
print((value as ParseObject).get('objectId'));
print((value as ParseObject).get('updatedAt'));
print((value as ParseObject).get('createdAt'));
});
```

## Array Operator in objects
__Update event__
When an existing ParseObject which fulfills the QueryBuilder you subscribe is updated (The ParseObject fulfills the
QueryBuilder before and after changes), you’ll get this event.
The object is the ParseObject which was updated. Its content is the latest value of the ParseObject.
```dart
liveQuery.on(LiveQueryEvent.update, (value) {
print('*** UPDATE ***: ${DateTime.now().toString()}\n $value ');
print((value as ParseObject).objectId);
print((value as ParseObject).updatedAt);
print((value as ParseObject).createdAt);
print((value as ParseObject).get('objectId'));
print((value as ParseObject).get('updatedAt'));
print((value as ParseObject).get('createdAt'));
});
```

Retrieve it, call
__Enter event__
When an existing ParseObject’s old value does not fulfill the QueryBuilder but its new value fulfills the QueryBuilder,
you’ll get this event. The object is the ParseObject which enters the QueryBuilder.
Its content is the latest value of the ParseObject.
```dart
liveQuery.on(LiveQueryEvent.enter, (value) {
print('*** ENTER ***: ${DateTime.now().toString()}\n $value ');
print((value as ParseObject).objectId);
print((value as ParseObject).updatedAt);
print((value as ParseObject).createdAt);
print((value as ParseObject).get('objectId'));
print((value as ParseObject).get('updatedAt'));
print((value as ParseObject).get('createdAt'));
});
```

__Leave event__
When an existing ParseObject’s old value fulfills the QueryBuilder but its new value doesn’t fulfill the QueryBuilder,
you’ll get this event. The object is the ParseObject which leaves the QueryBuilder.
Its content is the latest value of the ParseObject.
```dart
var response = await dietPlan.add("listKeywords", ["a", "a","d"]);
liveQuery.on(LiveQueryEvent.leave, (value) {
print('*** LEAVE ***: ${DateTime.now().toString()}\n $value ');
print((value as ParseObject).objectId);
print((value as ParseObject).updatedAt);
print((value as ParseObject).createdAt);
print((value as ParseObject).get('objectId'));
print((value as ParseObject).get('updatedAt'));
print((value as ParseObject).get('createdAt'));
});
```

var response = await dietPlan.addUnique("listKeywords", ["a", "a","d"]);
__Delete event__
When an existing ParseObject which fulfills the QueryBuilder is deleted, you’ll get this event.
The object is the ParseObject which is deleted
```dart
liveQuery.on(LiveQueryEvent.delete, (value) {
print('*** DELETE ***: ${DateTime.now().toString()}\n $value ');
print((value as ParseObject).objectId);
print((value as ParseObject).updatedAt);
print((value as ParseObject).createdAt);
print((value as ParseObject).get('objectId'));
print((value as ParseObject).get('updatedAt'));
print((value as ParseObject).get('createdAt'));
});
```

var response = await dietPlan.remove("listKeywords", ["a"]);
__Unsubscribe__
If you would like to stop receiving events from a QueryBuilder, you can just unsubscribe the subscription.
After that, you won’t get any events from the subscription object and will close the WebSocket connection to the
LiveQuery server.

```dart
await liveQuery.unSubscribe();
```


## Users

You can create and control users just as normal using this SDK.

To register a user, first create one :
Expand Down Expand Up @@ -277,7 +398,6 @@ Other user features are:-
* Queries

## 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();
Expand All @@ -289,13 +409,8 @@ ParseConfig().addConfig('TestConfig', 'testing');
```

## Other Features of this library

Main:
* Users
* Installation
* Objects
* Queries
* LiveQueries
* GeoPoints
* Files
* Persistent storage
Expand All @@ -313,11 +428,13 @@ User:
* Save
* Destroy
* Queries
* Anonymous
* 3rd Party Authentication

Objects:
* Create new object
* Extend Parse Object and create local objects that can be saved and retreived
* Queries:
* Queries

## Author:-
This project was authored by Phill Wiggins. You can contact me at [email protected]
Expand Down
3 changes: 2 additions & 1 deletion lib/src/enums/parse_enum_api_rq.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ enum ParseApiRQ {
increment,
decrement,
getConfigs,
addConfig
addConfig,
liveQuery
}
Loading