---
# System prepended metadata

title: airaConnect 架構解析
tags: [airaConnect]

---

---
tags: airaConnect
---
## 架構解析

### Entrypoints
`src/main.js`。

---
### Bootstraps
設定的初始化： `src/main.js`。
依賴的初始化： `src/spidermain/index.js`
對依賴作包裝： `src/domain/index.js`
資料的初始化： `src/domain/initdb.js`

---
### Presentation Layer
#### REST
1. 在 `src/main.js` 註冊 `middlewares`。
2. 其中在 `/${global.params.server.prefix}` 的 middleware 引入 `src/interface/api/airaconnect.js` 裡面的內容。
3. 如果是 `publicCgi` 的其中一個，將不作 `token` 的檢查。

#### UDP Server（Message Worker）
目前單純只是在收到訊息時往 socket 推送（透過 `socket.broadcastMessage`）。
> workerMsgSender 以及 workerFriendTrolGateway 目前沒用到。

---
### Application Layer

#### Authentication
1. 在 `src/interface/api/index.js` 定義了 `authorize` 方法，這個方法會嘗試從 `headers["token"]` 取出 token，並呼叫 `global.spiderman.token.decryptToAccountInTime()` 解析出 `profile`。
2. 如果解析不出來就會拋出 `Unauthorized` 錯誤。

#### Application Services
在 `src/api/airaconnect` 定義了許多 `CRUD` 方法。他們都沿用了 `src/api/airaconnect/crud.js` 提供的基礎方法，並對接收到的資料作驗證（使用 `src/spiderman/validate.js`）。

#### Use Cases
CRUD：
- devicegroup
- devices
- devicetype
- eventhandle
- map

Analysis／Aggregation：
- report

---
### Domain Layer
目前是空的。
其實可以把領域模型的產生，驗證作在這層。

---
### Adapters
- express server
- mongo client
- udp server
- socket
- file system

---
### infrastructure
- worker-nx／nxdriver： 負責產生影音串流的 `token`。
- decryptToAccount／encryptFromAccount／decryptToAccountInTime： 將使用者的 `profile` 打成 token／嘗試解開 token 的方法。
- parse： 解析 json 時額外作了防呆。
- mailer： 寄 Mail 通知的方法。
- systemlog： 可能是想要抽 logger interface。
- request： 作 Server to server API Call 的包裝。

---
## 設定
設定最後會存回 global commands
> dotenv 雖然有但是是空的

### argObject
- process.env.UV_THREADPOOL_SIZE
- process.env.NODE_TLS_REJECT_UNAUTHORIZED
- process.env.NODE_TLS_MIN_PROTOCOL_VERSION

---
### hardcoded 的部分
### 能指定的部分
- fileroot
- localhost

---
### 寫在設定檔的部分
- server
    - httpEnable
    - httpPort
    - httpsEnable
    - httpsPort
    - prefix
- session
    - checkTimer
    - timeOut
    - godSession
- mongodb
    - ip
    - port
    - user
    - pass
    - db
- mqtt
    - mqttServerEnable
    - mqttClientEnable
    - ip
    - port
    - user
    - pass
- create_date
- last_modify_date
- vms
    - authorization
    - host
    - port
    - username
    - password
- smtp
    - host
    - secure
    - port
    - user
    - pass
    - from
    - enable
    - security
    - security
    - account
    - password
    - sender
    - email

---
### 自動衍生的部分
- dataPath
- swPath
- fwPath
- importPath
- wwwdist

---

## 其他
### 目前看起來用不到的依賴
`src/spiderman/index.js`：
- dayjs
- calculate
- image
- tcpclient
- tcpserver
- encryption
- nxdriver

`src/domain/index.js`：
- workerMsgSender

> 另外，express() 執行了多次。

---

## 一些想法
- [ ] 1. 目前路由載入有點 Tricky（而且看得出有想抽 Application Services），改為一個一個指定比較明確（且不用集中在同一個檔案改完）。
- [x] 2. 把 Credentials 打成 Token 或者從 Token 解析出來的這段中間可以過 Redis（不然流量上來的時候會比較吃 CPU）。Authentication 的邏輯可以擺在 Application Services 或 Utils 下。
- [ ] 3. 資料驗證可以作成每一支路由有各自的驗證（太抽象會比較不好寫且沒那麼好用）。
- [ ] 4. 看得出有想要分層，譬如 spiderman 是偏 infrastructure、utils 和 adapters，而 domain 比較像 Application Layer。
- [x] 5. Adapter 有點包太多層（spiderman 一層, domain 又一層），然後 File System 的 Adapter 也包了 proxy。
- [ ] 6. 現在 module export 的時候可以個別分開 export 了，功能比較雜的時候應該切開成不同檔案，不要直接 export { ... }。
- [x] 7. 設定檔可以集中到 .env。
- [ ] 8. logs 可以考慮寫到別的地方（最好能設定 alert manager）。
- [ ] 9. 用 typescript 改寫（定義了什麼、有什麼能用會比較清楚）。
- [x] 10. 可以用 prettier 幫助程式碼排版。