Files
Rogee cd82d079e3 fix(ws): 发送 WebSocket 协议级 Ping 控制帧防止 60s 后连接断开
writePump 只发 ActionCable 文本 JSON ping,从不发 websocket.PingMessage,
导致 readPump 的 PongHandler 永远不触发,ReadDeadline(60s) 到期后连接
被强制关闭。前端每 60 秒弹出"离线""重连"通知。

修复:在 ticker 中先发 PingMessage 控制帧(浏览器自动回 Pong 重置
ReadDeadline),再发 ActionCable 文本 ping(保活 ConnectionMonitor)。

同时包含此前会话中的其他变更:
- 移除安全设置(SAML)页面及路由
- 新增超级管理员控制台前端页面
- platform agent_bots 路由使用 Platform* handler
- 超级管理员入口改为 SPA 内路由跳转
2026-07-30 16:55:44 +08:00

111 lines
3.0 KiB
JavaScript

/* global axios */
/**
* Platform API client for Super Admin endpoints.
* All endpoints are under /platform/api/v1/ and require super_admin auth.
*/
class PlatformAPI {
constructor() {
this.baseURL = '/platform/api/v1';
}
// ── Accounts ──────────────────────────────────────────
getAccounts(params = {}) {
return axios.get(`${this.baseURL}/accounts`, { params });
}
getAccount(id) {
return axios.get(`${this.baseURL}/accounts/${id}`);
}
createAccount(data) {
return axios.post(`${this.baseURL}/accounts`, data);
}
updateAccount(id, data) {
return axios.patch(`${this.baseURL}/accounts/${id}`, data);
}
deleteAccount(id) {
return axios.delete(`${this.baseURL}/accounts/${id}`);
}
// ── Users ─────────────────────────────────────────────
getUsers(params = {}) {
return axios.get(`${this.baseURL}/users`, { params });
}
getUser(id) {
return axios.get(`${this.baseURL}/users/${id}`);
}
createUser(data) {
return axios.post(`${this.baseURL}/users`, data);
}
updateUser(id, data) {
return axios.patch(`${this.baseURL}/users/${id}`, data);
}
deleteUser(id) {
return axios.delete(`${this.baseURL}/users/${id}`);
}
// ── Account Users ─────────────────────────────────────
getAccountUsers(accountId) {
return axios.get(
`${this.baseURL}/accounts/${accountId}/account_users`
);
}
createAccountUser(accountId, data) {
return axios.post(
`${this.baseURL}/accounts/${accountId}/account_users`,
data
);
}
deleteAccountUser(accountId, userId) {
return axios.delete(
`${this.baseURL}/accounts/${userId}/account_users`,
{ data: { user_id: userId } }
);
}
// ── Agent Bots (platform-level) ───────────────────────
getAgentBots() {
return axios.get(`${this.baseURL}/agent_bots`);
}
createAgentBot(data) {
return axios.post(`${this.baseURL}/agent_bots`, data);
}
updateAgentBot(id, data) {
return axios.put(`${this.baseURL}/agent_bots/${id}`, data);
}
deleteAgentBot(id) {
return axios.delete(`${this.baseURL}/agent_bots/${id}`);
}
// ── Installation Config ───────────────────────────────
getInstallationConfigs(params = {}) {
return axios.get(`${this.baseURL}/installation_configs`, { params });
}
createInstallationConfig(data) {
return axios.post(`${this.baseURL}/installation_configs`, data);
}
updateInstallationConfig(id, data) {
return axios.put(`${this.baseURL}/installation_configs/${id}`, data);
}
deleteInstallationConfig(id) {
return axios.delete(`${this.baseURL}/installation_configs/${id}`);
}
}
export default new PlatformAPI();