---
# System prepended metadata

title: CIMSS 介紹

---

# CIMSS 介紹
###### [Github](https://github.com/tairitsu86/Cross-instant-messaging-software-service-project) [Docker hub](https://hub.docker.com/repository/docker/tairitsu86/cross-instant-messaging-software-service/general)
## 專案介紹
CIMSS全稱Cross-Instant Messaging Software Service
這是一個即時通訊軟體串接微服務
目的是讓不同即時通訊軟體也能在一個大群組中互相溝通
也可以用於訊息訂閱，這樣訂閱開發商就不需要為了每個軟體都開一個專案

使用Apache Maven開發工具，Spring framework 3.0.4，JDK 17


###### 目前版本:1.0.1-ALPHA版本(更新中)

## 專案目標
目前目標先定於建立功能完整之微服務
能部屬於kubernetes之上
且實作足夠且全面之Open API供其他開發者使用
並建立swagger API文件讓其他開發者能快速了解如何使用

## Workflow
### When user send a message
![](https://i.imgur.com/FbXfCxv.jpg)

## 如何開始?
這裡會介紹如何將此容器部屬到你的主機！
### 前提條件:
必備條件:
1. 該主機須安裝Docker Engine
2. 要申請自己的line&telegram chat bot

要啟用SSL(HTTPS):
1. 該主機得具備Domain name(域名)和公開IP，用於啟用SSL加密
2. 請準備好你的SSL憑證(要求PEM檔，且private key必須是RSA)

因為line webhook需要HTTPS
所以不想開啟、無法開啟(Ex:沒域名、沒公開IP)或不知道怎麼HTTPS
請下載[Ngrok](https://ngrok.com/)來代替自己設定SSL
### 開始部屬容器
因為此容器需要很多的環境變數設定
所以建議使用Docker Compose
範例也將使用Docker Compose
這裡針對完全不理解的新手
所以會要求更改檔名，建立指定資料夾
如果你了解Docker compose，不一定要照範例步驟
只要能讓容器找到正確檔案就能正常執行

* **docker-compose.yml 範例**
```
version: "1"
services:
  microservice-instant-message:
    image: tairitsu86/cross-instant-messaging-software-service
    container_name: cimss
    ports:
       - 443:8080
    volumes:
       - cimss-database-file:/usr/src/microservice/src/main/resources/db/h2file
       - cimss-ssl:/usr/src/microservice/src/main/resources/SSL 
    restart: always
    environment:
      LINE_BOT_TOKEN: 
      LINE_BOT_SECRET:
      LINE_WEBHOOK:
      TELEGRAM_BOT_TOKEN:
      TELEGRAM_WEBHOOK:
      CIMSS_ADMIN_TOKEN:
      SSL_ENABLE:
volumes:
  cimss-database-file:
  cimss-ssl:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: "C:/SSL"
```
設定完環境變數後(如果不確定該變數值，請參考後面的環境變數介紹)

若要啟用HTTPS，請照以下步驟掛載SSL憑證到容器上
1. 請先在C:下建立SSL資料夾
1. 請在裡面放入SSL憑證(需PEM格式)
1. private key的檔案檔明請命名為 privkey.pem
1. 認證鏈(cahin)憑證請命名為 fullchain.pem

就可以用(此指令需要在docker-compose.yml所在的資料夾)
```
docker-compose up
```
啟動容器了！
#### 環境變數介紹
在environment: 設定環境變數
**注意!** 
值和:之間要有空格
詳情請查閱YAML檔格式規定

* **LINE_BOT_TOKEN** 
line bot的channel access token
![](https://i.imgur.com/qR7GaqS.png)

* **LINE_BOT_SECRET**
line bot的channel secret
![](https://i.imgur.com/zGZl0m3.png)

* **LINE_WEBHOOK**
域名後的URL路徑(照下圖範例就是/lineWebhook)
![](https://i.imgur.com/AmDcGLq.png)

* **TELEGRAM_BOT_TOKEN**
telegram chat bot的token(下圖中60160開頭那一大串)
![](https://i.imgur.com/x3MMwdr.png)

* **TELEGRAM_WEBHOOK**
域名後的URL路徑

* **CIMSS_ADMIN_TOKEN**
這個不一定要設定
這是整個系統的最高權限Token
如果沒有要用可以不用打

* **SSL_ENABLE**
決定是否要開啟SSL加密的變數
若要開啟(使用HTTPS)請設定值為true
若不開啟(使用HTTP)請設定值為false
請不要設定其他的值，有可能導致程式無法執行

以上就是全部的系統變數設定

### 下一步該怎麼做？
如果一切順利，那CIMSS應該已經成功執行了
但現在除了預設路徑的hello訊息什麼都沒有
Swagger UI會在/swagger-ui/index.html#/路徑下
Ex: 
域名為: https://example.com
Swagger UI: https://example.com/swagger-ui/index.html#/

接下來就可以利用裡面介紹的API進行服務開發了！

可以參考[CIMSS-DEMO](https://github.com/tairitsu86/CIMSS-DEMO)



# CIMSS 更新日誌
## 1.0.1-ALPHA版本
### 簡介
發現了很多、很多有趣的技術
像是JWT，Event-driven，到Chat bot的按鈕訊息
所以這個版本又是超級大的更新

### 重點更新
* **資料庫結構修改**
去除了一堆東東
增加了一堆東東
移除了org.liquibase套件，目前使用jpa原生的ddl-auto產生table
更改了一部份的欄名

* **驗證模式修改**
不再使用group對應的group api key
改為使用user的資料產生jwt來做為驗證的token
降低了驗證的複雜度，也簡化了資料庫結構
並使用spring security進行驗證
後續則透過使用者的操作進行授權

* **API修改**(還沒做)


* **Chat bot功能新增**(Line好了，但有Bug，Telegram還沒開始)
現在能透過group表中的FUNCTION_LIST客製化chat bot的選單了
也有系統的按鈕清單
可以透過按鈕使用絕大部分功能




### 未來展望--短期目標
### 未來展望--長期規劃

## 1.0.0-ALPHA版本
### 簡介
這會是第一個正式版本
雖然還有很多小問題和優化沒處理
但整體架構已經是能良好運行的

資料庫架構:
![](https://i.imgur.com/yfEG4gK.png)
[Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-1.0.0.html)




有鑑於某些展望沒有即時的必要性
從最初版本就寫到現在還沒處理
所以我決定將1.0.0-ALPHA之後的版本
展望分成長期規劃與短期目標

### 重點更新
* **建立HTTPS**
目前申請了學校的免費Domain name
https://cimss.csie.fju.edu.tw
並且已經將SSL憑證安裝上程式(使用Certbot)
但還沒設定自動更新憑證
秉持微服務的耦合性，SSL憑證並不存在於映像檔中
而是需要透過volume抓取本地端的SSL憑證
確保安全性的同時
也讓這個容器不需要綁死在某個域名下
換個憑證照樣能執行
另外SSL的啟用與否以系統變數設定
可以自由決定是要用HTTPS還是HTTP

* **新增群組屬性**
經考慮後不採用 使用者訊息廣播啟用/停用 的屬性
已經將其餘四個欄位加入資料表
    1. 公開/隱私群組 -> isPublic(boolean)
    1. 透過群組Id加入功能的啟用/停用 -> joinById(boolean)
    1. 群組敘述 -> groupDescription(String)
    1. 關鍵字 -> groupKeyword(String)
    
    目前已經都實作好了



* **增加系統指令**
    ```
    Command list:

    No require permission command:

    Search group by keyword
    /cimss search <keyword>

    Create new group, you will auto joined this group, and have manager permission
    /cimss new <group name>

    Join any group(witch didn't close the join by id function) by group id
    /cimss join <group id>

    Leave the group you joined
    /cimss leave <group id>

    Show all group you joined now
    /cimss groups

    Require manager permission command:

    Get the detail data about the group
    /cimss detail <group id>

    Get all member data in group
    /cimss members <group id>

    Broadcast message to all member in group
    /cimss broadcast <group id> <message>

    Remove any member in the group
    /cimss remove <group id> <software> <userId>

    Alter the property of group
    /cimss alter <group id> <property> <value>
    Property can be groupName,groupDescription,isPublic,joinById, or allMessageBroadcast(no use)
    When property is groupName or groupDescription, value can be any string
    Else, value only can be true or false
    ```
    自己看，旁邊都有介紹ㄌ

* **新增/修改/刪除API**
發現有些API沒得用會導致開發困難
所以就加了一些API
以及刪除我覺得不妥的API
然後把API變成Restful的(應該ㄅ)
具體內容自己看Swagger

* **刪除Manager table**
突然發現不需要Manager table
改為以Member table中的isManager column實現
我之前怎麼沒想到？

### 未來展望--短期目標

* **開發聊天機器人功能**
目前機器人只能寄文字訊息
也只處理文字訊息
我覺得至少要加上寄圖片的API
和能Handle圖片事件和追隨事件的方法

* **建立更完整的Webhook**
目前只送文字事件
但有人加入這個群組
或離開這個群組應該都要有所通知
總之就是還有很多事件值得傳送


### 未來展望--長期規劃

* **資料庫查詢優化**
從最初版說到現在
其實不做也沒關係
就是優化效能

* **開發聊天機器人功能**
這裡著重於更深入的開發
看看能不能挖到寶
找到什麼有趣的功能

* **進行更深入的套件使用**
就是看看那些套件有甚麼酷東東
能用的就拿來用

## 0.0.2-DEMO版本
### 簡介
現在已經能實際使用了
但實際還有很多細節沒處理
也有很多地方使用上並不便利
不過他已經能稱為一個微服務了(大概ㄅ)
[Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-0.0.2.html)

資料庫架構:
![](https://i.imgur.com/bPluihU.png)

### 重點更新
* **建立Webhook轉送事件和文字事件**
現在可以將即時通訊軟體的事件
透過本服務的webhook轉送過去
但目前先關著，我覺得轉送有安全性問題
現在當任意使用者傳送訊息
所有該使用者加入之群組
都能透過Webhook獲得文字事件
不過後面應該會改成訊息符合特殊前綴才傳送事件
不然隱私性太差了

* **新增和更新API**
原有Database增刪修的API被移除了
只剩刪除所有資料和查詢表的API
增加了給予權限、查詢群組和重新命名群組的API等等
然後把需要0~1個參數的API都改為GET
需要2個或以上的API皆為POST

* **實作權限控管**
權限分為Admin>Group Manager>Normal User>NONE四階
現在大部分API加上了權限控管
需要透過API KEY才能使用


* **新增系統指令**
目前實作了透過群組名稱搜尋的API
但一般使用者可不會用API
所以還是轉回文字指令
但有個大問題是文字指令使用上並不直觀
一般使用者應該也不想用
所以要怎麼提供基本功能還值得思考
目前只有四個指令
搜尋群組、加入群組、退出群組和顯示目前已加入的群組

* **完善Swagger說明文件**
現在把不該出現的API/Schema隱藏
並幫每個API加上介紹
API所要求的參數也有相應的介紹
response也有介紹
目前還在考慮是否要加入200以外的http回傳


### 未來展望
* **新增群組屬性**(已完成)
現在的group都是一樣的
我們應該分成公開/私人的群組
某些有安全性疑慮的特定服務(Ex:IoT門禁系統)
不應該公開讓所有人搜尋
也不應該讓其他人能自行加入
所以目前設想的屬性為
    1. 公開/隱私群組
    1. 透過群組Id加入功能的啟用/停用
    1. 使用者訊息廣播啟用/停用
    1. 群組敘述
    1. 關鍵字

* **增加更多系統指令**(已完成)
還在考慮，如果可以
我不太希望使用者必須使用文字指令
但如果這是最終決定
那就應該完善這套指令

* **資料庫查詢優化**
因為重點放在先讓它動起來
所以資料庫查詢完全沒動
還是暴力搜尋
但其實資料不要太多就沒有差

* **開發聊天機器人功能**
依舊在考慮
不過我認為至少要提供寄圖片的API
然後可以看看有沒有辦法用chat bot的功能(line應該可以)
讓使用者能有更好的介面操作系統
而不是透過系統指令

* **進行更深入的套件使用**
和資料庫優化的部分差不多
因為目前重點不是效能
所以我一樣完全沒動
然後這點應該會一直被推遲
因為他偏錦上添花
錦都還沒織出來，花還是先放著ㄅ

## 0.0.1-DEMO版本
### 簡介
現在已經是個功能不齊全的微服務了
能單獨部署單獨執行
[Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-0.0.1.html)

資料庫架構:
![](https://i.imgur.com/nhkc1xY.png)

### 重點更新
* **現在能以YAML來進行細部設定**
比起原本bot token等資料寫死的情況
現在轉變為以系統環境變數取用
此項更新可以讓未來的服務取用者
利用yaml指定自己的chat bot等等

* **改為使用嵌入式資料庫H2**
原本只是因為電腦上有SQL SERVER
加上熟悉java與SQL SERVER的串接
經過思考，本專案並不需要使用到SQL SERVER這種大型資料庫
還有對於資料庫的依賴性
降低了微服務單獨部屬單獨執行的特性
所以決定改為使用嵌入式資料庫
儲存的資料路徑在resourse/db下的h2file資料夾中
檔名是h2.mv.db和h2.trace.db
放在獨立資料夾是為了方便掛載卷冊(volume)

* **整合Swagger套件**
Swagger是OpenAPI的說明文檔
而springdoc是由Spring官方提供的Swagger實作
springdoc在程式運行時會自己爬code
找到我們的api並產生json和yaml檔
交給Swagger官方提供的前端UI
就能獲得精美的OpenAPI格式文件了

* **建立Database OpenAPI**
目前建立了四張資料表的增刪查API 12個
再加一個刪除所有資料的API共13個
現在可以利用Open API來操作資料庫
不過後來發現H2有console
有點尷尬，不過我還是留著
提供另一種取用資料庫的方法
未來可能移除

* **建立跨即時通訊軟體OpenAPI**
目前只有send, broadcast, join, 和newgroup
有點少，但我有點不知道還需要什麼API
現在主要想盡快能建立基礎應用


* **拔除PK的意義性的依賴性**
現在將原本的具依賴性的PK拔除
改為使用複合PK，以絕後患

* **簡易權限分級**
新增實體Manager
現在有三層權限分級
系統管理員>群組管理員>一般用戶
但實際功能取用尚未進行權限判定
現在人人都是系統管理員

* **去除文字訊息指令**
當初只是用來demo的
現在已經把功能實作到API上
所以就移除了
同時也移除了echo(重複使用者訊息)功能

### 未來展望

* **完善權限分級**(已完成)
就像在重點更新所敘述
目前權限分級是形同虛設的模子
後須需要實作認證行為

* **資料庫查詢優化**
改為使用H2讓安全性問題得到解決
但沒有解決暴力搜尋的問題
依舊需要研究自定義查詢

* **建立Webhook**(已完成)
後續也應該提供Webhook功能
方便開發者接收使用者之訊息

* **轉送聊天機器人webhook**(已完成)
此版本沒有動chat bot的部分
而且我開始考慮是否應該開發chat bot
每個應用對chat bot的實作不盡相同
我不可能實作出人人滿意的功能
目前想法傾向於將chat bot的webhook事件
透果本服務的webhook轉交給使用者
確保原本的chat bot功能
使用者也可以百分百的發揮

* **完善Swagger說明文件**(已完成)
現在幾乎沒有進行說明
應該沒有人能看得懂
所以後續應該要多加註解

* **進行更深入的套件使用**
現在很多套件功能我都只取我要的
但事實是那些套件還有很多更優秀的功能
有些甚至能加強效能與錯誤容忍度
所以好好研究每個套件是必需做的功課


## 0.0.0-DEMO版本
### 簡介
比起微服務，目前更像是一個應用程式
因為目前尚未架設足夠API供他人取用
現階段只有一些基礎功能
資料庫架構:
![](https://i.imgur.com/kvK9ZnM.png)

### 功能介紹
Line和Telegram收到一般訊息都只會複讀
另外有設計一些基礎指令：
```
指令列表:

新增群組(不會自動加入該群組)
/newgroup <groupname>

加入群組
/join <groupId>

目前已加入的群組
/mygroups

列出所有群組成員
/groupmembers <groupId>

進行群組內廣播
/broadcast <groupId> <message>

退出群組(尚未實作)
/leave <groupId>

查詢指令格式
/?

備註:
1.任何以/開頭之文字訊息皆被視為指令
2.指令中英文字母皆為小寫
3.以角括號<>框起之文字皆為參數
4.參數不能包括空格
5.參數需用空格與指令隔開
6.複數參數也應用空格隔開
7.參數輸入時不應該帶有角括號<>

範例:
新增名為MyGroup的群組
/newgroup MyGroup

```
如果認為指令不直覺或難用是正常的
這個是設計給API的功能，只是先用這種方式DEMO

和三個測試的API:
```
@GetMapping("/")
public String home() {
	return "{\"Message\":\"OAO\"}";
}

@GetMapping("/linebot/send/{userId}/{message}")
public String linebotSendText(@PathVariable String userId,@PathVariable String message) {
	lineMessageService.pushTextMessage(userId, message);
	return "{\"Message\":\"OWO\"}";
}
	
@GetMapping("/telegrambot/send/{chatId}/{message}")
public String telegrambotSendText(@PathVariable Long chatId,@PathVariable String message) {
	telegramMessageService.sendTextMessage(chatId, message);
	return "{\"Message\":\"OWO\"}";
}
```
### 未來展望
* **架設完整API**(已完成)
目前API只有三個，基本上做不了什麼事情
除了基本指令應該架設到API上
也應該要求開發者提供chat bot token
讓其他開發者可以使用自己的chat bot

* **開發聊天機器人功能**
目前所接取的事件基本侷限於文字訊息
還有很多事件值得實作
另外Telegram chat bot不能傳送大量文字的問題也尚須解決

* **進行權限分級**(已完成)
目前創立的跨即時通訊軟體群組，組內人人平等
應該新增管理員和管理用指令讓此群組更具功能性

* **資料庫查詢優化**
目前取用資料的方式是全查出來，再透過程式過濾所需資料
這樣不但浪費時間也浪費資源
所以應該建立JPA客製化查詢，甚至搭配預存程序與索引建置等
另外因為處於開發階段，SQL Server帳號貪圖便利直接給了最高權限
這點也應該更正

* **以YAML來進行細部設定**(已完成)
當這個微服務架設完成後
line bot,telegram bot的token,JDBC URL等等
應該要能讓使用者自行設定
目前預計用yaml進行

* **拔除PK的意義性的依賴性**(已完成)
目前PK用組合字
即時通訊軟體平台+使用者ID
這沒什麼問題
但現在取用User資料的方式是直接從webhook的json中把資料挖出來
自行組合PK，然後直接取用
老實講感覺很不賴，不用查詢就有PK能鎖定資料行
更別提查關聯表可以跳過JOIN，效率直線上升
但對資料庫設計這是不好的(應該吧?)
總之也許會造成隱患(又或許沒有?)