save dynamic inputs to task steps as its not working perfectly with getElementById if user has other task open

main
alex 2023-06-03 17:32:19 +02:00
parent 07bbe52530
commit 69de96b3aa
8 changed files with 102 additions and 37 deletions

View File

@ -107,7 +107,7 @@ func RunGroupTask(args RunGroupTaskArgs) {
CreatorUserId: args.CreatorUserId, CreatorUserId: args.CreatorUserId,
GroupTasksId: args.GroupTaskId, GroupTasksId: args.GroupTaskId,
Step: args.Step, Step: args.Step,
Status: structs.GroupTasksStatusRunning, Status: utils.GroupTasksStatusRunning,
Inputs: args.TaskInputs, Inputs: args.TaskInputs,
StartedAt: time.Now(), StartedAt: time.Now(),
} }
@ -130,7 +130,7 @@ func RunGroupTask(args RunGroupTaskArgs) {
// set group task to running // set group task to running
dbGroupTask := updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ dbGroupTask := updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusRunning, Status: utils.GroupTasksStatusRunning,
}) })
// global inputs // global inputs
@ -147,14 +147,15 @@ func RunGroupTask(args RunGroupTaskArgs) {
} }
// task parameters // 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} commandArgs := []string{root + categoryGroup.Id + "/" + categoryGroup.Tasks[args.Step-1].ScriptPath}
if len(categoryGroup.Tasks[args.Step-1].Parameters) != 0 && len(args.TaskInputs) == 0 { if len(categoryGroup.Tasks[args.Step-1].Parameters) != 0 && len(args.TaskInputs) == 0 {
updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusInputRequired, Status: utils.GroupTasksStatusInputRequired,
}) })
groupTaskStep.Status = structs.GroupTasksStatusInputRequired groupTaskStep.Status = utils.GroupTasksStatusInputRequired
updateGroupTaskSteps(groupTaskStep) updateGroupTaskSteps(groupTaskStep)
return return
@ -183,9 +184,9 @@ func RunGroupTask(args RunGroupTaskArgs) {
} }
log.Error().Msgf("error exec command %s", err.Error()) log.Error().Msgf("error exec command %s", err.Error())
groupTaskStep.Status = structs.GroupTasksStatusFailed groupTaskStep.Status = utils.GroupTasksStatusFailed
} else { } else {
groupTaskStep.Status = structs.GroupTasksStatusFinished groupTaskStep.Status = utils.GroupTasksStatusFinished
} }
fmt.Println(cmdLog) fmt.Println(cmdLog)
@ -196,10 +197,10 @@ func RunGroupTask(args RunGroupTaskArgs) {
updateGroupTaskSteps(groupTaskStep) updateGroupTaskSteps(groupTaskStep)
if int(args.Step) < len(categoryGroup.Tasks) { if int(args.Step) < len(categoryGroup.Tasks) {
if groupTaskStep.Status == structs.GroupTasksStatusFailed { if groupTaskStep.Status == utils.GroupTasksStatusFailed {
// set group task to failed // set group task to failed
updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusFailed, Status: utils.GroupTasksStatusFailed,
}) })
} else { } else {
args.StartType = RunGroupTaskStartTypeNormal args.StartType = RunGroupTaskStartTypeNormal
@ -217,7 +218,7 @@ func RunGroupTask(args RunGroupTaskArgs) {
} else { } else {
// set group task to finished // set group task to finished
updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusFinished, Status: utils.GroupTasksStatusFinished,
EndedAt: time.Now(), EndedAt: time.Now(),
}) })
} }
@ -262,8 +263,20 @@ func GetAllGroupTasksSteps() []structs.GroupTaskSteps {
database.DB.Find(&groupTaskStepsLogs) database.DB.Find(&groupTaskStepsLogs)
// TODO: locked state lockedGroupTaskSteps := cache.GetLockedGroupTaskSteps()
// groupTaskStepsLogs[0].LockedByUserId = cache... 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 return groupTaskStepsLogs
} }

View File

@ -47,13 +47,13 @@ func GetCategoryGroupsSorted() []structs.CategoryGroup {
defer cgMu.Unlock() defer cgMu.Unlock()
// removing script path for security // removing script path for security
for i, categoryGroup := range categoryGroups { /*for i, categoryGroup := range cGroups {
for i2, group := range categoryGroup.Groups { for i2, group := range categoryGroup.Groups {
for i3 := range group.Tasks { 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 }) sort.SliceStable(categoryGroups, func(i, j int) bool { return categoryGroups[i].Category < categoryGroups[j].Category })

View File

@ -2,12 +2,64 @@ package cache
import ( import (
"janex/admin-dashboard-backend/modules/structs" "janex/admin-dashboard-backend/modules/structs"
"janex/admin-dashboard-backend/modules/utils"
"sync" "sync"
) )
/* /*
This stores the inputs that a user makes when typing into the input fields at a Group Task step. 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 groupTaskStepsInputs []structs.GroupTaskStepsInput
var gtsi sync.RWMutex 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)
}

View File

@ -5,8 +5,6 @@ import (
"janex/admin-dashboard-backend/modules/utils" "janex/admin-dashboard-backend/modules/utils"
"sync" "sync"
"time" "time"
"github.com/rs/zerolog/log"
) )
var lockedGroupTaskSteps []*structs.LockedGroupTaskSteps var lockedGroupTaskSteps []*structs.LockedGroupTaskSteps
@ -17,11 +15,11 @@ func AddLockedGroupTaskStep(lockedGroupTaskStep structs.LockedGroupTaskSteps) (I
var isAlreadyInList = false var isAlreadyInList = false
for _, step := range lockedGroupTaskSteps { for i, step := range lockedGroupTaskSteps {
if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId && if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId &&
step.LockedByUserId == lockedGroupTaskStep.LockedByUserId { step.LockedByUserId == lockedGroupTaskStep.LockedByUserId {
isAlreadyInList = true isAlreadyInList = true
step.LockedAt = time.Now() lockedGroupTaskSteps[i].LockedAt = time.Now()
break break
} }
} }
@ -36,7 +34,9 @@ func AddLockedGroupTaskStep(lockedGroupTaskStep structs.LockedGroupTaskSteps) (I
} }
func RemoveLockedGroupTaskStep(i int) { func RemoveLockedGroupTaskStep(i int) {
lgtMu.Lock()
lockedGroupTaskSteps = append(lockedGroupTaskSteps[:i], lockedGroupTaskSteps[i+1:]...) lockedGroupTaskSteps = append(lockedGroupTaskSteps[:i], lockedGroupTaskSteps[i+1:]...)
lgtMu.Unlock()
} }
func GetLockedGroupTaskSteps() []*structs.LockedGroupTaskSteps { func GetLockedGroupTaskSteps() []*structs.LockedGroupTaskSteps {
@ -49,13 +49,10 @@ func GetLockedGroupTaskSteps() []*structs.LockedGroupTaskSteps {
func ExtendLockedGroupTaskStepLockedAtTime(lockedGroupTaskStep structs.LockedGroupTaskSteps) { func ExtendLockedGroupTaskStepLockedAtTime(lockedGroupTaskStep structs.LockedGroupTaskSteps) {
lgtMu.Lock() lgtMu.Lock()
log.Debug().Msg("start extending")
for i, step := range lockedGroupTaskSteps { for i, step := range lockedGroupTaskSteps {
if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId { if step.GroupTaskId == lockedGroupTaskStep.GroupTaskId {
step.LockedAt = time.Now().Add(utils.GroupTaskLockedTime * time.Second) step.LockedAt = time.Now().Add(utils.GroupTaskLockedTime * time.Second)
lockedGroupTaskSteps[i] = step lockedGroupTaskSteps[i] = step
log.Debug().Msg("time extended")
break break
} }
} }

View File

@ -6,14 +6,6 @@ import (
// structure for database // structure for database
const (
GroupTasksStatusFinished uint8 = 1
GroupTasksStatusRunning uint8 = 2
GroupTasksStatusCanceled uint8 = 3
GroupTasksStatusFailed uint8 = 4
GroupTasksStatusInputRequired uint8 = 5
)
type GroupTasks struct { type GroupTasks struct {
Id string Id string
CreatorUserId 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 // 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 { type GroupTaskStepsInput struct {
GroupTaskId string GroupTaskId string
Step string Step uint8
ParameterName string ParameterName string
Value string Value interface{}
} }

View File

@ -53,6 +53,14 @@ const (
ReceivedCmdUpdateGroupTaskStepUserInputValue = 6 ReceivedCmdUpdateGroupTaskStepUserInputValue = 6
) )
const (
GroupTasksStatusFinished uint8 = 1
GroupTasksStatusRunning uint8 = 2
GroupTasksStatusCanceled uint8 = 3
GroupTasksStatusFailed uint8 = 4
GroupTasksStatusInputRequired uint8 = 5
)
var ( var (
generalRules = map[string]string{ generalRules = map[string]string{
"Username": "required,min=" + minUsername + ",max=" + maxUsername, "Username": "required,min=" + minUsername + ",max=" + maxUsername,

View File

@ -12,8 +12,6 @@ func GetXAuhorizationHeader(c *fiber.Ctx) string {
} }
func MarshalJson(v any) string { func MarshalJson(v any) string {
log.Debug().Msgf("MarshalJson input %s", v)
json, err := json.Marshal(v) json, err := json.Marshal(v)
if err != nil { if err != nil {
@ -21,7 +19,5 @@ func MarshalJson(v any) string {
return "" return ""
} }
log.Debug().Msgf("Marshal json %s", json)
return string(json) return string(json)
} }

View File

@ -95,7 +95,7 @@ func RunHub() {
Description: receivedMessage.Body["description"].(string), Description: receivedMessage.Body["description"].(string),
CurrentTasksStep: 1, CurrentTasksStep: 1,
NumberOfSteps: uint8(receivedMessage.Body["numberOfSteps"].(float64)), NumberOfSteps: uint8(receivedMessage.Body["numberOfSteps"].(float64)),
Status: structs.GroupTasksStatusRunning, Status: utils.GroupTasksStatusRunning,
GlobalInputs: globalInputsJsonString, GlobalInputs: globalInputsJsonString,
StartedAt: time.Now(), StartedAt: time.Now(),
RememberId: receivedMessage.Body["rememberId"].(string), RememberId: receivedMessage.Body["rememberId"].(string),
@ -182,6 +182,13 @@ func RunHub() {
cache.ExtendLockedGroupTaskStepLockedAtTime(structs.LockedGroupTaskSteps{ cache.ExtendLockedGroupTaskStepLockedAtTime(structs.LockedGroupTaskSteps{
GroupTaskId: receivedMessage.Body["groupTaskId"].(string), 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 break
default: default: