user sessions

main
alex 2023-05-14 22:12:09 +02:00
parent f252c76c46
commit 704ae06edd
5 changed files with 64 additions and 27 deletions

View File

@ -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
}

View File

@ -16,6 +16,7 @@ type UserSession struct {
Id string
UserId string
UserAgent string
LastUsed time.Time
ExpiresAt time.Time
}

View File

@ -24,6 +24,7 @@ const (
SentCmdUpdateGroupTask = 6
SentCmdReloadingGroupTasks = 7
SendCmdGroupTasksReloaded = 8
SendCmdUpdateUserSessions = 9
)
// commands received from web clients

View File

@ -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
}

View File

@ -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()
}
}