From fd6cfd26a0bc3ea2ed0fc2e14b2097c9d2557900 Mon Sep 17 00:00:00 2001 From: zhanghan Date: Wed, 4 Dec 2024 17:04:15 +0800 Subject: [PATCH] to publish 'Plugin Offline' Event --- cmd/server/app/network/controller/plugin.go | 3 ++ cmd/server/app/network/controller/user.go | 4 +-- cmd/server/app/service/plugin/heartbeat.go | 36 ++++++++++++++++++++- frontend/src/stores/index.ts | 4 +-- pkg/dbmanager/redismanager/common.go | 17 ++++++++++ 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/cmd/server/app/network/controller/plugin.go b/cmd/server/app/network/controller/plugin.go index f6b1bb0d..779878f3 100644 --- a/cmd/server/app/network/controller/plugin.go +++ b/cmd/server/app/network/controller/plugin.go @@ -88,6 +88,7 @@ func AddPluginHandler(c *gin.Context) { return } + // 发布“插件添加”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgPluginAdd, MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgPluginAdd), @@ -97,6 +98,7 @@ func AddPluginHandler(c *gin.Context) { Version: p.Version, Url: p.Url, Description: p.Description, + Status: true, }, } msgDataString, err := msgData.ToMessageDataString() @@ -183,6 +185,7 @@ func UnloadPluginHandler(c *gin.Context) { } auditlog.Add(log) + // 发布“插件卸载”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgPluginRemove, MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgPluginRemove), diff --git a/cmd/server/app/network/controller/user.go b/cmd/server/app/network/controller/user.go index be8503f6..c5cde7ba 100644 --- a/cmd/server/app/network/controller/user.go +++ b/cmd/server/app/network/controller/user.go @@ -133,7 +133,7 @@ func LoginHandler(c *gin.Context) { Action: "用户登录", } auditlog.Add(log) - + // 发布“用户登录”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgUserLogin, MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgUserLogin), @@ -186,7 +186,7 @@ func Logout(c *gin.Context) { Action: "用户退出", } auditlog.Add(log) - + // 发布“用户退出”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgUserLogout, MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgUserLogout), diff --git a/cmd/server/app/service/plugin/heartbeat.go b/cmd/server/app/service/plugin/heartbeat.go index cb60ff61..0dbd90e5 100644 --- a/cmd/server/app/service/plugin/heartbeat.go +++ b/cmd/server/app/service/plugin/heartbeat.go @@ -47,6 +47,38 @@ func checkAndRebind() { LastConnect: plugin_status.(*client.PluginStatus).LastConnect, } redismanager.Set(key, value) + + // 缓存,发布“插件离线”事件 + offlineKey := "offline:" + p.UUID + offlineValue := struct { + OfflineTime time.Time + }{ + OfflineTime: time.Now(), + } + ok, err := redismanager.SetNX(offlineKey, offlineValue) + if ok && err == nil { + msgData := commonSDK.MessageData{ + MsgType: eventSDK.MsgPluginOffline, + MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgPluginOffline), + TimeStamp: time.Now(), + Data: eventSDK.MDPluginChange{ + PluginName: p.Name, + Version: p.Version, + Url: p.Url, + Description: p.Description, + Status: false, + }, + } + msgDataString, err := msgData.ToMessageDataString() + if err != nil { + logger.Error("event message data marshal failed:%v", err.Error()) + } + ms := commonSDK.EventMessage{ + MessageType: eventSDK.MsgPluginOffline, + MessageData: msgDataString, + } + PublishEvent(ms) + } } else { value := client.PluginStatus{ Connected: true, @@ -54,7 +86,8 @@ func checkAndRebind() { } redismanager.Set(key, value) - // + //删除缓存,发布“插件上线”事件 + redismanager.Delete("offline:" + p.UUID) msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgPluginOnline, MessageType: eventSDK.GetMessageTypeString(eventSDK.MsgPluginOnline), @@ -64,6 +97,7 @@ func checkAndRebind() { Version: p.Version, Url: p.Url, Description: p.Description, + Status: true, }, } msgDataString, err := msgData.ToMessageDataString() diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts index 24ae4908..e6daf5eb 100644 --- a/frontend/src/stores/index.ts +++ b/frontend/src/stores/index.ts @@ -12,7 +12,7 @@ const pinia = createPinia(); pinia.use(piniaPersisted); // 全局数据入口,persist无效 -/ * import { usePluginStore } from './plugin'; +import { usePluginStore } from './plugin'; export interface AppStore { usePluginStore: ReturnType, } @@ -21,6 +21,6 @@ const appStore: AppStore = {} as AppStore; // 注册app状态库 export const registerStore = () => { appStore.usePluginStore = usePluginStore() -} */ +} export default pinia; \ No newline at end of file diff --git a/pkg/dbmanager/redismanager/common.go b/pkg/dbmanager/redismanager/common.go index dbcdbda0..277e77a6 100644 --- a/pkg/dbmanager/redismanager/common.go +++ b/pkg/dbmanager/redismanager/common.go @@ -13,6 +13,23 @@ import ( "fmt" ) +func SetNX(key string, value interface{}) (bool, error) { + var ctx = context.Background() + if EnableRedis { + bytes, err := json.Marshal(value) + if err != nil { + return false, err + } + + set := Redis().SetNX(ctx, key, string(bytes), 0) + if err := set.Err(); err != nil { + return false, err + } + return set.Val(), nil + } + return false, nil +} + func Set(key string, value interface{}) error { var ctx = context.Background() if EnableRedis { -- Gitee