save dynamic inputs to task steps as its not working perfectly with getElementById if user has other task open
parent
07bbe52530
commit
69de96b3aa
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 })
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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{}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue