# Austack
Node.js client for [Austack](http://dashboard.arrking.com/).
Secure APIs with tokens.
![](https://raw.githubusercontent.com/rockq-org/austack/master/images/20170526-austack-brand-S.png)

## Welcome
```
npm install austack-node
```

## Usage
```
var austack = require('austack-node')(CLIENT_ID, CLIENT_SECRET);
```
Get **CLIENT\_ID, CLIENT_SECRET** from [Austack](http://dashboard.arrking.com).

> Login > Application > New Application > Settings

![](https://raw.githubusercontent.com/rockq-org/austack/master/images/get_austack_token.png)

### austack#getToken()
**生成一个新的token**

返回值:

* Promise\<String\> token

示例:
```
austack.getToken()
    .then(function(token){
        console.log('token: ' + token)
    })
```

### austack#decode(token)
**对token解码**

参数: 

* token \<String\>

返回值:

* Object token对应的Object: header, payload 和 signature。

| 关键字 | 描述 | 
| --- | --- |
| header | 类型和签名算法 |
| payload | token包含的有效信息: clientId(应用的clientId), role(token的角色), ownerId, (exp)过期时间, iss(签名发布者),jti(token的唯一标识) |
| signature | 签名 |


示例:
```
austack.decode(token)
    .then(function(decoded){
        console.log('decoded: ' + JSON.stringify(decoded))
    })
```


### austack#verify(token)
**对token进行验证**

参数: 

* token \<String\>


返回值:

* Promise\<Object\> token的payload

如果验证通过，Promise被resolve。验证没有被通过，Promise被reject。

示例:
```
austack.verify(token)
    .then(function(verifed){
        console.log('verifed: ' + verifed)
    })
```

### austack#auth(req)
**验证http request header包含的authorization信息**

参数: 

* req \<Object\>


返回值:

* Promise\<\>

如果验证通过，Promise被resolve, 否则被reject.


示例:
```
var ctx = {
    req: {
        headers: {
            authorization: 'Bearer ' + token
        }
    }
}
adminAustack.auth(ctx)
    .then(function(result){
        // 验证通过
    }, function(err){
        // 验证失败，token失效、信息缺失等原因
    });
```

[Express Austack中间件](https://www.npmjs.com/package/express-austack), [Koa Austack中间件](https://www.npmjs.com/package/koa-austack)

### austack#getApplication(token)
**获得应用信息**

参数: 

* token \<String\>

返回值:

* Promise\<Object\> 获得CLIENT_ID所属的应用的信息，包含:

| 关键字 | 描述 |
| --- | --- | 
| name | 所属者的Id | 
| ownerId | 所属者的唯一标识 |
| role | 所属者角色 |
| clientId | 应用的clientId |
| repos | 数据集标识 |

示例:
```
austack.getApplication(token)
    .then(function(appInfo){
        console.log('appInfo: ' + appInfo)
    })
```

### austack#getRepo(token)
**获取数据集名称**, 数据集是Austack提供的数据存储服务。在控制台上，提供数据集表结构的定义。数据集可以用来存储数据，每个用户拥有一个数据集，用户可以创建多个应用，数据集在这些应用中是共享的。

参数: 

* token \<String\>


返回值:

* Promise\<String\> 数据集名称


示例:
```
austack.getRepo(token)
    .then(function(repoName){
        console.log('repoName: ' + repoName)
    })
```

### austack#getShape(token, repoName)
**获取数据集元数据**

参数: 

* token \<String\>
* repoName \<String\> 数据集名称，通过 *getRepo* 或者 *getApplication* 获得。

返回值:

* Promise\<Object\> 

元数据包含：mSchema(数据集表结构定义)、type(类型)、name(名称)、created(创建时间)和modified(最后更新时间)。

示例:
```
austack.getShape(token, repoName)
    .then(function(shapeInfo){
        console.log('shapeInfo: ' + shapeInfo)
    })
```

### austack#getRepoData(token, repoName, [options])
**获取数据集数据**

参数: 

* token \<String\>
* repoName \<String\> 数据集名称，通过 *getRepo* 或者 *getApplication* 获得。
* [可选] options \<Object\> 过滤条件 {q, limit, page, fields, sortby}, *options* 可以用来做多条件查询。

| 字段 | 类型 | 描述 | 示例 |
| --- | --- | --- | --- | 
| q | Object | 查询条件，参考[Model.find-conditions](http://mongoosejs.com/docs/api.html#model_Model.find)  | { "textMessage": "bar" } |
| sortby | String | 排序条件，[参考 Query-sort](http://mongoosejs.com/docs/api.html#query_Query-sort) | '-createAt' |
| limit | Number | 最多返回多少记录，在返回值中，页数，当前页都是使用*limit*进行计算 | 10 |
| page | Number | 返回第几页，*limit* * *page*就代表着skip多少数据 | 1 |
| fields | String | 只获得并按顺序返回指定字段的数据，不同字段用空格分开 | 'uid direction textMessage' |

返回值:

* Promise\<Object\>

标准返回值

```
{
  "total": 12, // 所有数据条数
  "total_page": 12, // 所有的页数
  "current_page": 1, // 当前页数
  "rc": 1, // 返回代码, 1是正常返回，其他值代表返回异常
  "data": [ // 数据
    {
      "_id": "xxx",
      "createAt": "2017-05-30T02:58:17.470Z",
      "textMessage": "bar",
      "uid": "foo",
      "direction": "inbound"
    }
  ]
}
```

示例:
```
austack.getRepoData(token, repoName, {
        limit: 1,
        fields: 'uid textMessage direction createAt',
        page: 1,
        sortby: '-createAt' // 默认按照字段名升序，如果前面添加'-'则使用降序
    })
    .then(function(repoData){
        console.log('repoData: ' + repoData)
    })
```

### austack#saveRepoData(token, repoName, data)
**更新或者创建新数据**

参数: 

* token \<String\>
* repoName \<String\> 数据集名称，通过 *getRepo* 或者 *getApplication* 获得。
* data \<Object\> 


返回值:

* Promise\<Object\> 已创建或更新的数据记录。

data必须包含的字段: uid, textMessage, direction.

| 字段 | 类型 | 必须 | 描述 | 
| --- | --- | --- | --- | 
| uid | String | 是 | 对应使用Application的用户的唯一标识 |
| textMessage | String | 是 | 消息 |
| direction | 'inbound'或者'outbound' | 是 | uid用户的消息方向， *inbound* 代表 uid用户发送的消息, *outbound* 代表 uid用户接收的消息 | 
| _id | String | 否 | _id是该记录对应的数据唯一标识，如果存在，则代表是更新数据，否则新建数据 |

示例:
```
austack.saveRepoData(token, repoName, {
        "_id": "xxxx", // 可选
        "textMessage": "barbar",
        "uid": "foo",
        "direction": "inbound",
    })
    .then(function(result){
        console.log('result: ' + result)
    })
```

### austack#getRepoDataById(token, repoName, objectId)
**获取指定Id的数据记录**

参数: 

* token \<String\>
* repoName \<String\> 数据集名称，通过 *getRepo* 或者 *getApplication* 获得。
* objectId \<String\> 数据记录的唯一标识 


返回值:

* Promise\<Object\> 如果该记录存在，Promise被resolve并返回该数据，否则Promise被reject。

示例:
```
austack.getRepoDataById(token, repoName, _id)
    .then(function(doc){
        console.log('docInfo: ' + doc)
    })
```

## LICENSE
[MIT](./LICENSE)