From 3e952c2921fd2f886c46b15ad2fa293b18c894e7 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 2 Jun 2023 10:59:47 +0200 Subject: [PATCH] task locking --- grouptasks/grouptasks.go | 7 +++++-- modules/cache/grouptaskstepsinput.go | 13 +++++++++++++ modules/cache/lockedgrouptasksteps.go | 20 ++++++++++++++++++++ modules/structs/grouptasks.go | 9 ++++++++- routers/router/api/v1/jxscanner/scanner.go | 2 +- socketserver/hub.go | 8 ++++++-- socketserver/server.go | 2 +- 7 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 modules/cache/grouptaskstepsinput.go diff --git a/grouptasks/grouptasks.go b/grouptasks/grouptasks.go index b10e35f..09c7baf 100644 --- a/grouptasks/grouptasks.go +++ b/grouptasks/grouptasks.go @@ -262,6 +262,9 @@ func GetAllGroupTasksSteps() []structs.GroupTaskSteps { database.DB.Find(&groupTaskStepsLogs) + // TODO: locked state + // groupTaskStepsLogs[0].LockedByUserId = cache... + return groupTaskStepsLogs } @@ -282,10 +285,10 @@ func GetCategoryGroupTaskByCategoryAndGroupId(category string, groupId string) s func StartUnlockLockedGroupTaskStepsTicker() { ticker := time.NewTicker(1 * time.Second) - for _ = range ticker.C { + for range ticker.C { for index, taskStep := range cache.GetLockedGroupTaskSteps() { if time.Since(taskStep.LockedAt).Seconds() > 3 { - log.Debug().Msgf("Unlocked task step", index) + log.Debug().Msgf("Unlocked task step %v", index) cache.RemoveLockedGroupTaskStep(index) socketclients.BroadcastMessageExceptUserSessionId(taskStep.LockedByUserSession, diff --git a/modules/cache/grouptaskstepsinput.go b/modules/cache/grouptaskstepsinput.go new file mode 100644 index 0000000..960540b --- /dev/null +++ b/modules/cache/grouptaskstepsinput.go @@ -0,0 +1,13 @@ +package cache + +import ( + "janex/admin-dashboard-backend/modules/structs" + "sync" +) + +/* +This stores the inputs that a user makes when typing into the input fields at a Group Task step. +This storage is necessary so that other users when opening this GroupTask or reloading the browser receive the data entered by the one user. +*/ +var groupTaskStepsInputs []structs.GroupTaskStepsInput +var gtsi sync.RWMutex diff --git a/modules/cache/lockedgrouptasksteps.go b/modules/cache/lockedgrouptasksteps.go index 6a0cc65..b3bbfa2 100644 --- a/modules/cache/lockedgrouptasksteps.go +++ b/modules/cache/lockedgrouptasksteps.go @@ -2,8 +2,11 @@ package cache import ( "janex/admin-dashboard-backend/modules/structs" + "janex/admin-dashboard-backend/modules/utils" "sync" "time" + + "github.com/rs/zerolog/log" ) var lockedGroupTaskSteps []*structs.LockedGroupTaskSteps @@ -42,3 +45,20 @@ func GetLockedGroupTaskSteps() []*structs.LockedGroupTaskSteps { return lockedGroupTaskSteps } + +func ExtendLockedGroupTaskStepLockedAtTime(lockedGroupTaskStep structs.LockedGroupTaskSteps) { + lgtMu.Lock() + + log.Debug().Msg("start extending") + + for i, step := range lockedGroupTaskSteps { + if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId { + step.LockedAt = time.Now().Add(utils.GroupTaskLockedTime * time.Second) + lockedGroupTaskSteps[i] = step + log.Debug().Msg("time extended") + break + } + } + + lgtMu.Unlock() +} diff --git a/modules/structs/grouptasks.go b/modules/structs/grouptasks.go index 0573416..78d3468 100644 --- a/modules/structs/grouptasks.go +++ b/modules/structs/grouptasks.go @@ -81,7 +81,6 @@ type TaskParameter struct { } // used for ui when a user is writing into input field to lock the task step for other users - type LockedGroupTaskSteps struct { LockedByUserId string LockedByUserSession string // user session is needed to prevent sending the unlocking message to the user who are writing @@ -89,3 +88,11 @@ type LockedGroupTaskSteps struct { Step uint8 LockedAt time.Time } + +// used for ui when a user types into input fields to sync to other users and show them this when opening the group task view +type GroupTaskStepsInput struct { + GroupTaskId string + Step string + ParameterName string + Value string +} diff --git a/routers/router/api/v1/jxscanner/scanner.go b/routers/router/api/v1/jxscanner/scanner.go index cec7d8b..774270e 100644 --- a/routers/router/api/v1/jxscanner/scanner.go +++ b/routers/router/api/v1/jxscanner/scanner.go @@ -22,7 +22,7 @@ func AddScanner(c *fiber.Ctx) error { } if err := utils.ValidateStruct(body); err != nil { - log.Error().Msgf("Failed to validate body, err: %s", err) + log.Error().Msgf("Failed to validate body, err: %v", err) return c.SendStatus(fiber.StatusBadRequest) } diff --git a/socketserver/hub.go b/socketserver/hub.go index 467fc1b..3dc839d 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -73,7 +73,7 @@ func RunHub() { continue } - log.Info().Msgf("Received message: %s", receivedMessage, receivedMessage.Cmd) + log.Info().Msgf("Received message: %v %v", receivedMessage, receivedMessage.Cmd) switch receivedMessage.Cmd { case utils.ReceivedCmdStartGroupTasks: @@ -178,10 +178,14 @@ func RunHub() { Cmd: utils.SentCmdUpdateGroupTaskStepUserInputValue, Body: receivedMessage.Body, }) + + cache.ExtendLockedGroupTaskStepLockedAtTime(structs.LockedGroupTaskSteps{ + GroupTaskId: receivedMessage.Body["groupTaskId"].(string), + }) break default: - log.Error().Msgf("Received unknown message: %s", receivedMessage) + log.Error().Msgf("Received unknown message: %v", receivedMessage) break } diff --git a/socketserver/server.go b/socketserver/server.go index 8c1bfa1..87cf143 100644 --- a/socketserver/server.go +++ b/socketserver/server.go @@ -31,7 +31,7 @@ func WebSocketServer(app *fiber.App) { if messageType == websocket.TextMessage { broadcast <- structs.SocketMessage{Conn: c, Msg: msg} } else { - log.Error().Msgf("websocket message received of type %s", messageType) + log.Error().Msgf("websocket message received of type %v", messageType) } } }))