diff --git a/modules/structs/socket.go b/modules/structs/socket.go index 20de531..dd1eda6 100644 --- a/modules/structs/socket.go +++ b/modules/structs/socket.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "sync" + "time" "github.com/gofiber/websocket/v2" "github.com/rs/zerolog/log" @@ -87,4 +88,12 @@ type InitUserSocketConnection struct { type UserData struct { Username string Email string + Sessions []UserSessionSocket +} + +type UserSessionSocket struct { + UserAgent string + ConnectionStatus uint8 + LastUsed time.Time + ExpiresAt time.Time } diff --git a/modules/structs/user.go b/modules/structs/user.go index c30deaa..f676e5c 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -16,6 +16,7 @@ type UserSession struct { Id string UserId string UserAgent string + LastUsed time.Time ExpiresAt time.Time } diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 195baf9..445f23a 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -24,6 +24,7 @@ const ( SentCmdUpdateGroupTask = 6 SentCmdReloadingGroupTasks = 7 SendCmdGroupTasksReloaded = 8 + SendCmdUpdateUserSessions = 9 ) // commands received from web clients diff --git a/socketclients/socketclients.go b/socketclients/socketclients.go index ae310b2..74d3a41 100644 --- a/socketclients/socketclients.go +++ b/socketclients/socketclients.go @@ -2,6 +2,7 @@ package socketclients import ( "janex/admin-dashboard-backend/modules/cache" + "janex/admin-dashboard-backend/modules/database" "janex/admin-dashboard-backend/modules/structs" "janex/admin-dashboard-backend/modules/utils" ) @@ -18,3 +19,51 @@ func UpdateConnectedUsers() { Body: len(cache.GetSocketClients()), }) } + +func SendMessageToUser(userId string, ignoreUserSessionId string, sendSocketMessage structs.SendSocketMessage) { + for _, client := range cache.GetSocketClients() { + if client.UserId == userId && client.SessionId != ignoreUserSessionId { + client.SendMessage(sendSocketMessage) + } + } +} + +func GetUserSessions(userId string) []structs.UserSessionSocket { + var userSessions []structs.UserSession + + database.DB.Where("user_id = ?", userId).Find(&userSessions) + + var userSessionsSocket []structs.UserSessionSocket + + socketClients := cache.GetSocketClients() + + for _, userSession := range userSessions { + userSessionsSocket = append(userSessionsSocket, structs.UserSessionSocket{ + UserAgent: userSession.UserAgent, + ConnectionStatus: isUserSessionConnected(userSession.Id, socketClients), + LastUsed: userSession.LastUsed, + ExpiresAt: userSession.ExpiresAt, + }) + } + + return userSessionsSocket +} + +func UpdateUserSessionsForUser(userId string, ignoreUserSessionId string) { + GetUserSessions(userId) + + SendMessageToUser(userId, ignoreUserSessionId, structs.SendSocketMessage{ + Cmd: utils.SendCmdUpdateUserSessions, + Body: GetUserSessions(userId), + }) +} + +func isUserSessionConnected(userSessionId string, socketClients []*structs.SocketClient) uint8 { + for _, socketClient := range socketClients { + if socketClient.SessionId == userSessionId { + return 1 + } + } + + return 0 +} diff --git a/socketserver/hub.go b/socketserver/hub.go index 1ec6445..0320c0a 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -51,6 +51,7 @@ func RunHub() { User: structs.UserData{ Username: user.Username, Email: user.Email, + Sessions: socketclients.GetUserSessions(userId), }, CategoryGroups: cache.GetCategoryGroupsSorted(), GroupTasks: grouptasks.GetAllGroupTasks(), @@ -59,6 +60,7 @@ func RunHub() { }) socketclients.UpdateConnectedUsers() + socketclients.UpdateUserSessionsForUser(userId, sessionId) case data := <-broadcast: var receivedMessage structs.ReceivedMessage @@ -77,20 +79,6 @@ func RunHub() { category := receivedMessage.Body["category"].(string) groupId := receivedMessage.Body["id"].(string) - /* - var globalInputsJsonString string - - if globalInputs != nil { - jsonString, err := json.Marshal(globalInputs) - - if err != nil { - log.Error().Msgf("Failed to marshal global inputs %s", err) - continue - } - - globalInputsJsonString = string(jsonString) - } */ - globalInputsJsonString := utils.MarshalJson(receivedMessage.Body["globalInputs"]) groupTaskId := uuid.New().String() @@ -136,19 +124,6 @@ func RunHub() { }) break case utils.ReceivedCmdTaskContinueTaskStep: - /* - - if taskInputs != nil { - jsonString, err := json.Marshal(taskInputs) - - if err != nil { - log.Error().Msgf("Failed to marshal task inputs %s", err) - continue - } - - taskInputsJsonString = string(jsonString) - } */ - go grouptasks.RunGroupTask(grouptasks.RunGroupTaskArgs{ StartType: grouptasks.RunGroupTaskStartTypeTryAgain, GroupTaskId: receivedMessage.Body["groupTaskId"].(string), @@ -180,6 +155,8 @@ func RunHub() { case connection := <-unregister: cache.DeleteClientByConn(connection) + socketclients.UpdateUserSessionsForUser(connection.Locals("userId").(string), connection.Locals("sessionId").(string)) + socketclients.UpdateConnectedUsers() } }