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,
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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 })
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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{}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue