RESTful API
Catalog and Data Store
The Catalog and Data Store are using the same logic and syntax for access and query language. The database which holds the information is MongoDB. MongoDB is a schemaless document noSQL database. The query language that the API deploys is the json representation of MongoDB.
API Return Data Structure
The API returns data in a consistent structure.
count: number if result records returned
meta: page, page_size, pages
next and previous: urls to page through data
results: list of records return from API
{ "count": 1, "meta": { "page": 1, "page_size": 50, "pages": 1 }, "next": null, "previous": null, "results": [ ] }
URL Parameters
page_size:
The page_size returns the available records up to page_size. If more records exist, the next url value will be deployed.
    ?page_size=100
    ?page_size=0
If page_size=0 API will return all records.
page:
The page variable will move to the page requested. If the page does not exist the last page will be shown.
format:
api (Default) - Return type is HTML format
json - Return type is JSON format
jsonp - Return type is JSONP format
xml - Return type is xml format
?format=json
query:
The query url parameter is a JSON format query language. Please see below
Query Language
The API query language is based from the MongoDB pyhton query syntax.
Create Database and Collections
Create Database
    View: /api/data_store/data/  HTTP Request: Post
    Data: {"database":"mydata"}  Format: JSON
Delete Database
    View: /api/data_store/data/  HTTP Request: Post
    Data: {"action":"delete","database":"mydata"}  Format: JSON        
Create Collection
    View: /api/data_store/data/mydata  HTTP Request: Post
    Data: {"collection":"mycollection"}  Format: JSON
Delete Collection
    View: /api/data_store/data/mydata  HTTP Request: Post
    Data: {"action":"delete","collection":"mycollection"}  Format: JSON
Filter Query
The following examples are on the collection view.
Filter Query
    ?query={"filter":{"tag":"content"}}
    ?query={"filter":{"tag":"content","tag2":"content"}}
    
    # Return fields (projection: 0,1)
    ?query={"filter":{"tag":"content","tag2":"content"},"projection":{"tag":0}
Distinct Query
    ?distinct=tag,tag2
    # Include query parameter
    ?distinct=tag&query={"filter":{"department":"Informatics"}}
MongoDb Aggregation
Please refer to MongoDB Documentation
    ?aggregate=[{"$match":{"status": "urgent"}},
      {"$group":{"_id":"$productName","sumQuantity":{"$sum":"$quantity"}}}]
Task Execution (celery)
The Celery Distributed Task Queue is integrated throught the RESTful API.
List of Available Tasks and Task History
    URL: /api/queue/
    Task History: /api/queue/usertasks/
Task Submission
    Example:
    URL /api/queue/run/cybercomq.tasks.tasks.add/
    Docstring: Very import to give users the description of task. 
    Curl Example: Comand-line example with API token
Task HTML POST Data Requirement
    {
        "function": "cybercomq.tasks.tasks.add",
        "queue": "celery",
        "args": [],
        "kwargs": {},
        "tags": []
    }
function: task name queue: which queue to route the task args: [] List of argument kwargs: {} Keyword arguments tags: [] list of tags that will identify task run
Curl Command - Command-line Scripting
    curl -X POST --data-ascii '{"function":"cybercomq.tasks.tasks.add","queue":"celery","args":[],"kwargs":{  },"tags": []}' http://localhost/api/queue/run/cybercomq.tasks.tasks.add/.json -H Content-Type:application/json -H 'Authorization: Token < authorized-token > '
Python Script to Execute Script
    import requests,json
    headers ={'Content-Type':'application/json',"Authorization":"Token < authorized token >"}
    data = {"function":"cybercomq.tasks.tasks.add","queue":"celery","args":[2,2],"kwargs":{},"tags":["add"]}
    req=requests.post("http://localhost/api/queue/run/cybercomq.tasks.tasks.add/.json",data=json.dumps(data),headers=headers) 
    print(req.text)
Javascript JQuery $.postJSON
    //postJSON is custom call for post to cybercommons api
    $.postJSON = function(url, data, callback,fail) {
        return jQuery.ajax({
            'type': 'POST',
            'url': url,
            'contentType': 'application/json',
            'data': JSON.stringify(data),
            'dataType': 'json',
            'success': callback,
            'error':fail,
            'beforeSend':function(xhr, settings){
                xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
            }
        });
    }