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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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