1. Nguyên lý Publish/Subscribe
Trên Stringee, các Client App có thể theo dõi 1 cách realtime các thông tin/thuộc tính của nhau, bao gồm:
- Trạng thái cuộc gọi
- Trạng thái Online/Offline
- Một thuộc tính bất kỳ do developer định nghĩa
Client A muốn theo dõi sự thay đổi thông tin/thuộc tính của Client B thì 2 bên phải định nghĩa 1 toppic ví dụ có tên là toppic_1:
- Client A subscribe toppic_1
- khi Client B có thuộc tính được chỉ ra thay đổi, nó sẽ publish thông tin vào toppic_1
- Client A sẽ nhận được thông báo từ toppic_1
2. Quyết định việc pub/sub bằng Access token
Để chỉ ra 1 Client App muốn publish hay subscribe topic nào, bạn có thể chỉ ra trong Access token payload; đọc thêm về Access token tại đây
Cụ thể trong payload chỉ ra 2 trường (không nhất thiết phải có đủ cả 2):
subscribe: danh sách topic muốn subscribe cách nhau bởi dấu phẩy (,)
attributes: danh sách các thuộc tính và topic tương ứng mà Client sẽ publish thông tin vào khi thuộc tính thay đổi:
[{
"attribute": "ATTRIBUTE_NAME",
"topic": "TOPIC_NAME"
}]
Có 2 thuộc tính hệ thống sau (bạn không thể đặt trùng tên thuộc tính với 2 thuộc tính hệ thống này):
- onlineStatus: Trạng thái Online/Offline của client
- call: Trạng thái cuộc gọi (Calling/Ringing/Answered/Ended)
ngoài ra bạn có thể tự định nghĩa bất kỳ thuộc tính nào khác cho Client.
Có 1 topic mặc định của hệ thống:
- ALL_CALL_STATUS: khi trạng thái cuộc gọi thay đổi, hệ thống sẽ publish thông tin vào topic này (cuộc gọi vào bất kỳ user nào)
Ví dụ về 1 access token payload:
{
"jti": "...-1554197947",
"iss": "...",
"exp": 1555197947,
"userId": "agent_1",
"subscribe": "online_status_GRDHG0HI,ALL_CALL_STATUS,agent_manual_status",
"attributes": [{
"attribute": "onlineStatus",
"topic": "online_status_GRDHG0HI"
},
{
"attribute": "call",
"topic": "call_GRDHG0HI"
},
{
"attribute": "manual_status",
"topic": "agent_manual_status"
}
]
}
ở trên chỉ ra Client App khi xác thực bằng access token này sẽ:
Subscribe các topic:
- online_status_GRDHG0HI
- ALL_CALL_STATUS
- agent_manual_status
Publish các thuộc tính sau:
- Trạng thái online/offline vào topic online_status_GRDHG0HI
- Trạng thái cuộc gọi vào topic call_GRDHG0HI
- Thuộc tính manual_status thay đổi giá trị sẽ publish vào topic agent_manual_status
3. Lấy các thuộc tính hiện tại của 1 user
GET https://api.stringee.com/v1/users/USER_ID
Response:
{
"loginTime": 1554204151774,
"attributes": [
{
"attribute": "onlineStatus",
"value": "online"
},
{
"attribute": "call"
},
{
"attribute": "app_is_foreground",
"value": true
}
],
"chatCustomer": false,
"userId": "USER_ID"
}
Lưu ý: REST API phải xác thực, xem chi tiết: https://developer.stringee.com/docs/call-rest-api/call-rest-api-authentication
4. Thay đổi thuộc tính của 1 user
a) Qua REST API
PUT https://api.stringee.com/v1/users/USER_ID/attributes
[
{
"attribute": "ATTRIBUTE_NAME",
"value": "NEW_VALUE"
}
]
Response:
{
"loginTime": 1554204151774,
"attributes": [
{
"attribute": "onlineStatus",
"value": "online"
},
{
"attribute": "call"
},
{
"attribute": "ATTRIBUTE_NAME",
"value": "NEW_VALUE"
}
],
"chatCustomer": false,
"userId": "USER_ID"
}
Lưu ý: REST API phải xác thực, xem chi tiết: https://developer.stringee.com/docs/call-rest-api/call-rest-api-authentication
b) Từ Client App
Gọi hàm:
stringeeClient.changeAttribute('ATTRIBUTE_NAME', "NEW_VALUE")
5. Client nhận thông báo thay đổi thuộc tính/thông tin từ Client mình đã subscribe
stringeeClient.on('messagefromtopic', function (data) {
console.log('++++++++++++++ messagefromtopic++++', data);
});
dữ liệu nhận sẽ có dạng:
{
"topic": "online_status_GRDHG0HI",
"message": {
"newValue": "online",
"callEnded": true,
"attribute": "onlineStatus",
"userId": "user_1",
"projectId": 25,
"timestamp": 1554261314286
}
}