# QuickStart

## Installation

### With modern build process
```npm i --save clearblade-js-client```

```javascript
import 'clearblade-js-client/lib/mqttws31'; 
import { ClearBlade } from 'clearblade-js-client';
```

### With script tag


Download and place https://raw.githubusercontent.com/ClearBlade/JavaScript-API/master/index.js as well as https://raw.githubusercontent.com/ClearBlade/JavaScript-API/master/lib/mqttws31.js inside your project directory and include them in your HTML file's header

## Usage
The ClearBlade object attaches to window after being included.

Calling ClearBlade.init(configObject) will initialize ClearBlade settings and functions and pass it as an argument to a callback.

```javascript
const cb = new ClearBlade();

cb.init({
	URI: 'platform address',  // e.g., 'https://platform.clearblade.com'
	systemKey: 'theSystemKey',
	systemSecret: 'theSystemSecret',
	email: "userEmail",  // use registerEmail instead if you wish to create a new user
	password: "userPassword",
	callback: initCallback,
});

function initCallback(err, authInfo) {  // err is a boolean, authInfo is an object containing email and authToken
	if (err) {
	  throw new Error(cb);
	} else {
	  console.log("successfully inited ClearBlade");
	}
}

function fetchData() {
	var collection = cb.Collection();
	collection.fetch(someQuery, collectionFetchCallback(err, rows) {
	  if (err) {
	    throw new Error(rows);
	  } else {
	    // do something with the collection rows
	  }
	});
}

function subscribeMessaging() {
	var messaging = cb.Messaging();
	messaging.subscribe('someTopic', {timeout: 120}, subscribeCallback(err, message) {
	  if (err) {
	    throw new Error(message);
	  } else {
	    // do something with response
	  }
  	});
}

```


# API Reference

## Setup
var cb = new ClearBlade();
#### cb.init(Options)
		Options // object
		* systemKey // string
			Required. The systemKey of the system to connect to. Retrievable from the Console's System Settings.
		* systemSecret // string
			Required. The systemSecret of the system to connect to. Retrievable from the Console's System Settings.
		* logging // boolean
		    Enable logging by setting logging key to true.
		* email // string
			Email of non-dev user to connect to system as. If registerUser key is not provided, the user must be registered through the Auth tab of the console, and given appropriate roles.
		* password // string
			Password of non-dev user to connect to system as.
		* registerUser // boolean
			If registerUser key is present and set to true, a new user will be created in the system using the values set to email and password.
		* callback // function
			Callback to be asynchronously fired when the connection to the system is established.
		* callTimeout // integer
			Seconds to wait before timing out requests
		* URI
			Platform instance to connect to. Defaults to "https://platform.clearblade.com" if not provided.
		* messagingURI
			Platform instance to connect to for messaging. Defaults to "platform.clearblade.com" if not provided.
		* messagingPort
			Port to use when connecting to messaging server.
## Authentication
#### cb.setUser(email, authToken)
		Set which user will make requests to the platform
		* email // string
			Required. The email of the user
		* authToken // string
			Required. The authToken returned by the platform as an argument to the init callback
#### cb.registerUser(email, password, callback)
		Register a new user with the platform.
		* email // string
			Required. The email of the new user
		* password // string
			Required. The password of the new user
		* callback // function
			Asynchronously fired after user is registered with the platform
#### cb.isCurrentUserAuthenticated(callback)
		Check if currently set user has an active session in the platform
		* callback // function(err, response)
			Asynchronously fired after response is received
#### cb.logoutUser(callback)
		End session for currently set user
		* callback // function(err, response)
			Asynchronously fired after platform returns repsonse
#### cb.loginAnon(callback)
		Authenticate with platform as anonymous user
		* callback // function(err, response)
			Asynchronously fired after platform creates new anonymous session
#### cb.loginUser(email, password, callback)
		Authenticate with platform as provided user
		* email // string
			Required. The email for an existing user
		* password // string
			Required. The password for an existing user
		* callback // function(err, response)
			Asynchronously fired after platform creates new session for provided user
## Collections
#### var collection = cb.Collection(Options)
		Options // object or serialized string
		Required. Provide either:
		* collectionName
			Name of the collection on current system to connect to.
		* collectionID
			ID of the collection on current system to connect to. Available on data tab of console.
#### collection.fetch(query, callback)
		Retrieve array of items from the collection
		* query // object
			key-value pairs representing column names and desired values
		* callback // function(err, dataArray)
			Asynchronously fired after platform returns response
#### collection.create(newItem, callback)
		Create new item in the collection
		* newItem // object
			Required. An object with key-value pairs representing column names and desired values
		* callback // function(err, newItem)
			Asynchronously fired after platform returns response
#### collection.update(query, changes, callback)
		Updates existing item in the collection
		* query // ClearBlade.Query
		* changes // object
			Required. An object with key-value pairs representing column names to be updated and new values
		* callback // function(err, updatedItem)
			Asynchronously fired after platform returns response
#### collection.remove(query, callback)
		Removes every item in the collection matching query
		* query // ClearBlade.Query
		* callback // function(err, removedItem)
			Asynchronously fired after platform returns response
#### collection.columns(callback)
		Retrieve column names, data types and whether the column is a primary key
		* callback // function(err, columnsArray)
			Asynchronously fired after platform returns response
#### collection.count(query, callback)
		Count items in collection matching query
		* query // ClearBlade.Query
		* callback // function(err, count)
			Asynchronously fired after platform returns response
## Query
#### var query = cb.Query(Options)
		Creates new ClearBlade.Query to be used in Collection operations
		Options // object or serialized string
		Required. Provide either:
			* collectionName
				Name of the collection on current system to connect to.
			* collectionID
				ID of the collection on current system to connect to. Available on data tab of console.
#### query.addSortToQuery(queryObj, direction, fieldName)
		Sort results according to direction by fieldName
		* queryObj // object
		* direction // string
			Required. Choose from "ASC" or "DESC"
		* fieldName // name of column to sort by
#### query.addFilterToQuery(queryObject, condition, key, value)
		Filter results accord to queryObject
		* queryObj // object
		* condition // string, choose from "=", "!=", ">", "<", ">=", "<="
		* key // string
		* value // string, integer, float
#### query.ascending(fieldName)
		Sort results ascending by fieldName
		* fieldName // string
#### query.descending(fieldName)
		Sort results descending by fieldName
		* fieldName // string
#### query.equalTo(fieldName, value)
		Query where field is equal to value
		* fieldName // string
		* value // string, integer float
#### query.greaterThan(fieldName, value)
		Query where field is greater than value
		* fieldName // string
		* value // string, integer float
#### query.greaterThanEqualTo(field, value)
		Query where field is greater than value
		* fieldName // string
		* value // string, integer float
#### query.lessThan(fieldName, value)
		* fieldName // string
		* value // string, integer, float
#### query.lessThanEqualTo(fieldName, value)
		* fieldName // string
		* value // string, integer, float
#### query.notEqualTo(fieldName, value)
		* fieldName // string
		* value // string, integer, float
#### query.matches(fieldName, regexPattern)
		* fieldName // string
		* value // string
#### query.or(otherQuery)
		* otherQuery // ClearBlade.Query
#### query.setPage(pageSize, pageNum)
		* pageSize // int
		* pageNum // int
#### query.fetch(callback)
		Execute built query and retrieve matching item(s)
		* callback // function(err, itemsArray)
#### query.update(changes, callback)
		Execute built query and update matching item(s)
		* callback // function(err, itemsArray)
#### query.remove(callback)
		Execute built query and remove matching item(s)
		* callback // function(err, itemsArray)
## Item
#### var item = cb.Item(data, collectionID)
		* data // object, contains structure of collection item
		* collectionID // string, data collection ID in current system
#### item.save(callback)
		* callback // function(err, result)
#### item.refresh(callback)
		* callback // function(err, result)
#### item.destroy(callback)
		* callback // function(err, result)
## Code Services
#### var code = cb.Code()
#### code.execute(name, options, callback)
		Run a named code service that exists on the system with options
		* name // string
			Required. The name of code service to be executed
		* options // object
			The request object to be passed to the code service function on execution
		* callback // function(err, response)
#### code.getCompletedServices(callback)
		* callback // function(err, response)
#### code.getFailedServices(callback)
		* callback // function(err, response)

## User Management
#### var user = cb.User()
ClearBlade User Object
#### user.getUser(callback)
		Retrieve info on the current set user
		* callback // function(err, userInfo)
#### user.setUser(userInfo, callback)
		Set info on the current active user
		* userInfo // object, contains key-value pairs representing the user info to be updated
		* callback // function(err, userInfo)
#### user.allUsers(query, callback)
		Return all users that match the specified query
		* query // ClearBlade.query
		* callback // function(err, usersArray)
#### user.setPassword(old, new, callback)
		Change current set user's password
		* old // string, old password of user
		* new // string, new password of user
		* callback // function(err, response)
#### user.count(query, callback)
		Return a count of all users that match the specified query
		* query // ClearBlade.query
		* callback // function(err, count)
## Messaging
#### var messaging = cb.Messaging(options, callback)
ClearBlade Messaging object
* callback // function(err, data), asynchronously fired upon error or successful connection to messaging server
#### messaging.getMessageHistory(topic, last, count, callback)
		* topic // string that signifies which topic to search
		* count // int that signifies how many messages to return; 0 returns all messages
		* last // int Epoch timestamp in seconds that will retrieve 'count' number of messages before that timestamp
		* callback - Function that handles the response from the server
#### messaging.getMessageHistoryWithTimeFrame(topic, count, last, start, stop, callback)
		* topic // string that signifies which topic to search
		* count // int that signifies how many messages to return; 0 returns all messages
		* last // int Epoch timestamp in seconds that will retrieve 'count' number of messages before that timestamp
		* start // int Epoch timestamp in seconds that will retrieve 'count' number of  messages within timeframe
		* stop // int Epoch timestamp in seconds that will retrieve 'count' number of  messages within timeframe
		* callback - Function that handles the response from the server
#### messaging.getAndDeleteMessageHistory(topic, count, last, start, stop, callback)
		* topic // string that signifies which topic to search
		* count // int that signifies how many messages to return and delete; 0 returns and deletes all messages
		* last // int Epoch timestamp in seconds that will retrieve and delete 'count' number of messages before that timestamp
		* start // int Epoch timestamp in seconds that will retrieve and delete 'count' number of  messages within timeframe
		* stop // int Epoch timestamp in seconds that will retrieve and delete 'count' number of  messages within timeframe
		* callback - Function that handles the response from the server
#### messaging.currentTopics(callback)
		Retrieve all active messaging topics on current system
		* callback // function(err, topicsArray)
#### messaging.publish(topic, payload)
		Publish payload on messaging topic via MQTT
		* topic // string
			Required. Messaging topic publish on
		* payload // object
#### messaging.publishREST(topic, payload, callback)
		Publish payload on messaging topic via HTTP
		* topic // string
			Required. Messaging topic publish on
		* payload // object
			Message payload
		* callback // function(err, data)
#### messaging.subscribe(topic, options, callback)
		Subscribe to MQTT topic
		* topic // string, messaging topic to subscribe to via MQTT
		* options // object
			onSuccess: // function(payload)
				Fired on successful subscription. Defaults to null
			onFailure: // function(err)
				Fired on error with subscription. Defaults to null
		callback // function(err, payload)
#### messaging.unsubscribe(topic, options)
		Unsubcribe from MQTT topic
		* topic // string, name of MQTT topic to unsubscribe from
		* options // object
			onSuccess: // function
				Fired on successful subscription. Defaults to null
				onSuccess: function(response)
			onFailure: // function
				Fired on error with subscription. Defaults to null
				onFailure: function(err)
#### messaging.disconnect()
		Close connection to messaging server
## MessagingStats
#### var messagingStats = cb.MessagingStats()
ClearBlade Messaging Statistics object
#### messagingStats.getAveragePayloadSize(topic, start, stop, callback)
		* topic // string that signifies which topic to search
		* start // int Epoch timestamp in seconds that will retrieve 'count' number of  messages within timeframe
		* stop // int Epoch timestamp in seconds that will retrieve 'count' number of  messages within timeframe
		* callback - Function that handles the response from the server
#### messagingStats.getOpenConnections(callback)
		* callback - Function that handles the response from the server
#### messagingStats.getCurrentSubscribers(topic, callback)
		* topic // string that signifies which topic to search
		* callback - Function that handles the response from the server
## Analytics
#### var analytics = cb.Analytics()
ClearBlade Analytics Object
Example filter object:

~~~
	{
		"scope": {
			"system": "<systemKey>"
		},
		"filter": {
			"module": "users",
			"action": "create",
			"range": {
				"start": 1493010000,
				"end": 1493137098
			}
		}
	}
~~~
#### analytics.getStorage(filter, callback)
		* filter // filter object (see above)
		* callback - Function that handles the response from the server
#### analytics.getCount(filter, callback)
		* filter // filter object (see above)
		* callback - Function that handles the response from the server
#### analytics.getEventList(filter, callback)
		* filter // filter object (see above)
		* callback - Function that handles the response from the server
#### analytics.getEventTotals(filter, callback)
		* filter // filter object (see above)
		* callback - Function that handles the response from the server
#### analytics.getUserEvents(filter, callback)
		* filter // filter object (see above)
		* callback - Function that handles the response from the server
    
# Javadoc

The Javadoc for the JavaScript API can be found at https://docs.clearblade.com/v/3/static/jsapi/index.html

