From 69de96b3aa589bb246984cfe8c52f3dc8cb5b368 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 3 Jun 2023 17:32:19 +0200 Subject: [PATCH] save dynamic inputs to task steps as its not working perfectly with getElementById if user has other task open --- grouptasks/grouptasks.go | 35 +++++++++++------ modules/cache/categorygroup.go | 6 +-- modules/cache/grouptaskstepsinput.go | 54 ++++++++++++++++++++++++++- modules/cache/lockedgrouptasksteps.go | 11 ++---- modules/structs/grouptasks.go | 12 +----- modules/utils/globals.go | 8 ++++ modules/utils/utils.go | 4 -- socketserver/hub.go | 9 ++++- 8 files changed, 102 insertions(+), 37 deletions(-) diff --git a/grouptasks/grouptasks.go b/grouptasks/grouptasks.go index 09c7baf..e76ff26 100644 --- a/grouptasks/grouptasks.go +++ b/grouptasks/grouptasks.go @@ -107,7 +107,7 @@ func RunGroupTask(args RunGroupTaskArgs) { CreatorUserId: args.CreatorUserId, GroupTasksId: args.GroupTaskId, Step: args.Step, - Status: structs.GroupTasksStatusRunning, + Status: utils.GroupTasksStatusRunning, Inputs: args.TaskInputs, StartedAt: time.Now(), } @@ -130,7 +130,7 @@ func RunGroupTask(args RunGroupTaskArgs) { // set group task to running dbGroupTask := updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ - Status: structs.GroupTasksStatusRunning, + Status: utils.GroupTasksStatusRunning, }) // global inputs @@ -147,14 +147,15 @@ func RunGroupTask(args RunGroupTaskArgs) { } // task parameters + log.Debug().Msgf("script path %s", categoryGroup.Tasks[args.Step-1].ScriptPath) commandArgs := []string{root + categoryGroup.Id + "/" + categoryGroup.Tasks[args.Step-1].ScriptPath} if len(categoryGroup.Tasks[args.Step-1].Parameters) != 0 && len(args.TaskInputs) == 0 { updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ - Status: structs.GroupTasksStatusInputRequired, + Status: utils.GroupTasksStatusInputRequired, }) - groupTaskStep.Status = structs.GroupTasksStatusInputRequired + groupTaskStep.Status = utils.GroupTasksStatusInputRequired updateGroupTaskSteps(groupTaskStep) return @@ -183,9 +184,9 @@ func RunGroupTask(args RunGroupTaskArgs) { } log.Error().Msgf("error exec command %s", err.Error()) - groupTaskStep.Status = structs.GroupTasksStatusFailed + groupTaskStep.Status = utils.GroupTasksStatusFailed } else { - groupTaskStep.Status = structs.GroupTasksStatusFinished + groupTaskStep.Status = utils.GroupTasksStatusFinished } fmt.Println(cmdLog) @@ -196,10 +197,10 @@ func RunGroupTask(args RunGroupTaskArgs) { updateGroupTaskSteps(groupTaskStep) if int(args.Step) < len(categoryGroup.Tasks) { - if groupTaskStep.Status == structs.GroupTasksStatusFailed { + if groupTaskStep.Status == utils.GroupTasksStatusFailed { // set group task to failed updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ - Status: structs.GroupTasksStatusFailed, + Status: utils.GroupTasksStatusFailed, }) } else { args.StartType = RunGroupTaskStartTypeNormal @@ -217,7 +218,7 @@ func RunGroupTask(args RunGroupTaskArgs) { } else { // set group task to finished updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ - Status: structs.GroupTasksStatusFinished, + Status: utils.GroupTasksStatusFinished, EndedAt: time.Now(), }) } @@ -262,8 +263,20 @@ func GetAllGroupTasksSteps() []structs.GroupTaskSteps { database.DB.Find(&groupTaskStepsLogs) - // TODO: locked state - // groupTaskStepsLogs[0].LockedByUserId = cache... + lockedGroupTaskSteps := cache.GetLockedGroupTaskSteps() + groupTaskStepsInputs := cache.GetGroupTaskStepsInputs() + + for i, groupTaskStep := range groupTaskStepsLogs { + if groupTaskStep.Status == utils.GroupTasksStatusInputRequired { + groupTaskStepsLogs[i].Inputs = cache.GetGroupTaskStepsInputsValue(groupTaskStepsInputs, groupTaskStep.GroupTasksId, groupTaskStep.Step) + + for _, lockedGroupTaskStep := range lockedGroupTaskSteps { + if groupTaskStep.GroupTasksId == lockedGroupTaskStep.GroupTaskId { + groupTaskStepsLogs[i].LockedByUserId = lockedGroupTaskStep.LockedByUserId + } + } + } + } return groupTaskStepsLogs } diff --git a/modules/cache/categorygroup.go b/modules/cache/categorygroup.go index 6ae9d6c..b5450b7 100644 --- a/modules/cache/categorygroup.go +++ b/modules/cache/categorygroup.go @@ -47,13 +47,13 @@ func GetCategoryGroupsSorted() []structs.CategoryGroup { defer cgMu.Unlock() // removing script path for security - for i, categoryGroup := range categoryGroups { + /*for i, categoryGroup := range cGroups { for i2, group := range categoryGroup.Groups { for i3 := range group.Tasks { - categoryGroups[i].Groups[i2].Tasks[i3].ScriptPath = "" + //cGroups[i].Groups[i2].Tasks[i3].ScriptPath = "" } } - } + }*/ sort.SliceStable(categoryGroups, func(i, j int) bool { return categoryGroups[i].Category < categoryGroups[j].Category }) diff --git a/modules/cache/grouptaskstepsinput.go b/modules/cache/grouptaskstepsinput.go index 960540b..324f10c 100644 --- a/modules/cache/grouptaskstepsinput.go +++ b/modules/cache/grouptaskstepsinput.go @@ -2,12 +2,64 @@ package cache import ( "janex/admin-dashboard-backend/modules/structs" + "janex/admin-dashboard-backend/modules/utils" "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. +This storage is necessary so that other users when opening this GroupTask or reloading the browser receive the data entered by the other user. */ var groupTaskStepsInputs []structs.GroupTaskStepsInput var gtsi sync.RWMutex + +func AddGroupTaskStepsInput(groupTaskStepsInput structs.GroupTaskStepsInput) { + gtsi.Lock() + + var isAlreadyInList bool + + for i, input := range groupTaskStepsInputs { + if input.GroupTaskId == groupTaskStepsInput.GroupTaskId && input.Step == groupTaskStepsInput.Step && input.ParameterName == groupTaskStepsInput.ParameterName { + isAlreadyInList = true + groupTaskStepsInputs[i].Value = groupTaskStepsInput.Value + break + } + } + + if !isAlreadyInList { + groupTaskStepsInputs = append(groupTaskStepsInputs, groupTaskStepsInput) + } + + gtsi.Unlock() +} + +func GetGroupTaskStepsInputs() []structs.GroupTaskStepsInput { + gtsi.RLock() + defer gtsi.RUnlock() + + return groupTaskStepsInputs +} + +type InputParameters struct { + ParameterName string `json:"parameterName"` + Value interface{} `json:"value"` +} + +func GetGroupTaskStepsInputsValue(inputs []structs.GroupTaskStepsInput, groupTaskId string, step uint8) string { + var inputParameters []InputParameters + + for _, input := range inputs { + if input.GroupTaskId == groupTaskId && input.Step == step { + inputParameters = append(inputParameters, InputParameters{ + ParameterName: input.ParameterName, + Value: input.Value, + }) + } + } + + if len(inputParameters) == 0 { + return "" + } + + return utils.MarshalJson(inputParameters) +} diff --git a/modules/cache/lockedgrouptasksteps.go b/modules/cache/lockedgrouptasksteps.go index b3bbfa2..ce6f30b 100644 --- a/modules/cache/lockedgrouptasksteps.go +++ b/modules/cache/lockedgrouptasksteps.go @@ -5,8 +5,6 @@ import ( "janex/admin-dashboard-backend/modules/utils" "sync" "time" - - "github.com/rs/zerolog/log" ) var lockedGroupTaskSteps []*structs.LockedGroupTaskSteps @@ -17,11 +15,11 @@ func AddLockedGroupTaskStep(lockedGroupTaskStep structs.LockedGroupTaskSteps) (I var isAlreadyInList = false - for _, step := range lockedGroupTaskSteps { + for i, step := range lockedGroupTaskSteps { if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId && step.LockedByUserId == lockedGroupTaskStep.LockedByUserId { isAlreadyInList = true - step.LockedAt = time.Now() + lockedGroupTaskSteps[i].LockedAt = time.Now() break } } @@ -36,7 +34,9 @@ func AddLockedGroupTaskStep(lockedGroupTaskStep structs.LockedGroupTaskSteps) (I } func RemoveLockedGroupTaskStep(i int) { + lgtMu.Lock() lockedGroupTaskSteps = append(lockedGroupTaskSteps[:i], lockedGroupTaskSteps[i+1:]...) + lgtMu.Unlock() } func GetLockedGroupTaskSteps() []*structs.LockedGroupTaskSteps { @@ -49,13 +49,10 @@ func GetLockedGroupTaskSteps() []*structs.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 } } diff --git a/modules/structs/grouptasks.go b/modules/structs/grouptasks.go index 78d3468..1ee1298 100644 --- a/modules/structs/grouptasks.go +++ b/modules/structs/grouptasks.go @@ -6,14 +6,6 @@ import ( // structure for database -const ( - GroupTasksStatusFinished uint8 = 1 - GroupTasksStatusRunning uint8 = 2 - GroupTasksStatusCanceled uint8 = 3 - GroupTasksStatusFailed uint8 = 4 - GroupTasksStatusInputRequired uint8 = 5 -) - type GroupTasks struct { Id string CreatorUserId string @@ -92,7 +84,7 @@ type LockedGroupTaskSteps struct { // 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 + Step uint8 ParameterName string - Value string + Value interface{} } diff --git a/modules/utils/globals.go b/modules/utils/globals.go index ce23a70..77d0c08 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -53,6 +53,14 @@ const ( ReceivedCmdUpdateGroupTaskStepUserInputValue = 6 ) +const ( + GroupTasksStatusFinished uint8 = 1 + GroupTasksStatusRunning uint8 = 2 + GroupTasksStatusCanceled uint8 = 3 + GroupTasksStatusFailed uint8 = 4 + GroupTasksStatusInputRequired uint8 = 5 +) + var ( generalRules = map[string]string{ "Username": "required,min=" + minUsername + ",max=" + maxUsername, diff --git a/modules/utils/utils.go b/modules/utils/utils.go index 1075e02..1c513ab 100644 --- a/modules/utils/utils.go +++ b/modules/utils/utils.go @@ -12,8 +12,6 @@ func GetXAuhorizationHeader(c *fiber.Ctx) string { } func MarshalJson(v any) string { - log.Debug().Msgf("MarshalJson input %s", v) - json, err := json.Marshal(v) if err != nil { @@ -21,7 +19,5 @@ func MarshalJson(v any) string { return "" } - log.Debug().Msgf("Marshal json %s", json) - return string(json) } diff --git a/socketserver/hub.go b/socketserver/hub.go index 3dc839d..dab8845 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -95,7 +95,7 @@ func RunHub() { Description: receivedMessage.Body["description"].(string), CurrentTasksStep: 1, NumberOfSteps: uint8(receivedMessage.Body["numberOfSteps"].(float64)), - Status: structs.GroupTasksStatusRunning, + Status: utils.GroupTasksStatusRunning, GlobalInputs: globalInputsJsonString, StartedAt: time.Now(), RememberId: receivedMessage.Body["rememberId"].(string), @@ -182,6 +182,13 @@ func RunHub() { cache.ExtendLockedGroupTaskStepLockedAtTime(structs.LockedGroupTaskSteps{ GroupTaskId: receivedMessage.Body["groupTaskId"].(string), }) + + cache.AddGroupTaskStepsInput(structs.GroupTaskStepsInput{ + GroupTaskId: receivedMessage.Body["groupTaskId"].(string), + Step: uint8(receivedMessage.Body["step"].(float64)), + ParameterName: receivedMessage.Body["parameterName"].(string), + Value: receivedMessage.Body["value"], + }) break default: