# 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

## 如何開始?
這裡會介紹如何將此容器部屬到你的主機!
### 前提條件:
必備條件:
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

* **LINE_BOT_SECRET**
line bot的channel secret

* **LINE_WEBHOOK**
域名後的URL路徑(照下圖範例就是/lineWebhook)

* **TELEGRAM_BOT_TOKEN**
telegram chat bot的token(下圖中60160開頭那一大串)

* **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版本
### 簡介
這會是第一個正式版本
雖然還有很多小問題和優化沒處理
但整體架構已經是能良好運行的
資料庫架構:

[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)
資料庫架構:

### 重點更新
* **建立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)
資料庫架構:

### 重點更新
* **現在能以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供他人取用
現階段只有一些基礎功能
資料庫架構:

### 功能介紹
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,效率直線上升
但對資料庫設計這是不好的(應該吧?)
總之也許會造成隱患(又或許沒有?)