# IM服务器

此项目是医生端即时消息服务器，与患者端不同。患者端的即时消息服务器使用C++编写，并且不具有消息存储功能，医生端与患者端已经连通，参见im.patient项目的说明。以后可能使用node.js框架统一二者。

## 代码管理

项目代码使用git管理，请安装git客户端并fork代码再下载修改。

## 开发环境安装

- 开发工具: node.js的代码可以使用文本编辑器开发，如：Sublime, vi, vim等。也可以使用IDE开发，推荐使用WebStorm，包含大量便捷功能，加速开发。
- 数据库准备: IM服务器使用MySQL数据库，因此需要先安装MySQL数据库。然后执行resources/schema/im_schema.sql与resources/schema/talk_group_schema.sql脚本文件，创建数据模式。
  第一个创建消息存储所需要的模式，第二个创建业务讨论组数据模式，并包含演示数据。
- 运行环境。node.js使用6.X版本开发，部署环境也需要使用相应的版本。

## 工程结构

- 消息流: 首先要明白即时消息的流程，有助于理解整个过程。医生端的IM仅关注医生部分，即下图中蓝色标注的内容。

![IM活动图](./doc/images/activity.png)

## 错误处理

Node.js支持同步与异步调用，也导致了异常错误处理与众不同。一个给定的函数，它处理异常的方式要么是同步（用 throw方式）要么是异步的（用 callback 或者 EventEmitter），不会两者兼具。
用户可以在回调函数里处理错误，也可以使用 try/catch捕获异常 ，但是不能一起用。

实际上，使用throw并且期望调用者使用 try/catch 是很罕见的，因为 NodeJS里的同步函数通常不会产生运行失败（主要的例外是类似于JSON.parse的用户输入验证函数）。

## 测试

测试框架使用mocha。REST客户端使用supertest, should模块。

## 部署

部署服务之前需要配置环境变量：IM_PROFILE，其值将决定应用加载的配置文件。值为prod, test, dev，仅能使用一个。

为保证服务正常运行，当服务异常退出时自动重启服务，IM服务器使用appArmour脚本，对进程添加保护：进程异常退出时，自动重启。
为实现此目标，部署时通过appArmour启动服务即可实现进程的守护功能。

## 开发SDK

IM提供了开发SDK，一个JS脚本。客户端可以通过引用此脚本或将此脚本打包到资源中。此外，脚本使用jQuery作为基础环境，因此客户端需要预先引用jQuery脚本。
客户端通过以下链接引用SDK文件

    <script src='http://host:port/sdk/im.client.js'></script>

## API

### 发送系统消息

### 发送P2P消息

URL: http://192.168.131.115:3000/api/v1/chats/pm
请求方式：POST
参数格式：

    {
        from: 发送人ID,
        to: 接收人ID,
        contentType: 内容类型，1为普通文本，2为图片，3为语音，4为超链接,
        content: "消息内容"
    }
    
### 发送群消息

URL: http://192.168.131.115:3000/api/v1/chats/gm
请求方式：POST
参数格式：

    {
        from: 发送人ID,
        at: at对象ID,
        group: 组ID,
        groupType: 组类别
        contentType: 内容类型，1为普通文本，2为图片，3为语音，4为超链接,
        content: "消息内容"
    }
    
### 获取消息

URL: http://192.168.131.115:3000/api/v1/chats/pm?user_id=xxx
请求试：GET
参数：

- user_id: 用户ID