From eeefb79f7bfaef2d79167020e0cbad461343b95c Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 7 May 2023 21:57:29 +0200 Subject: [PATCH] input required handling --- grouptasks/grouptasks.go | 146 +++++++++++++++++++++++++++------- modules/structs/grouptasks.go | 10 +-- socketserver/hub.go | 2 +- 3 files changed, 123 insertions(+), 35 deletions(-) diff --git a/grouptasks/grouptasks.go b/grouptasks/grouptasks.go index 3b2726c..f5fb0b9 100644 --- a/grouptasks/grouptasks.go +++ b/grouptasks/grouptasks.go @@ -73,7 +73,13 @@ type RunGroupTaskArgs struct { GroupId string Step uint8 TaskStepId string - GlobalInputs []interface{} + GlobalInputs string + Parameters string +} + +type GlobalInputParameters struct { + ParameterName string `json:"parameterName"` + Value string `json:"value"` } func RunGroupTask(args RunGroupTaskArgs) { @@ -82,7 +88,6 @@ func RunGroupTask(args RunGroupTaskArgs) { categoryGroup := GetCategoryGroupTaskByCategoryAndGroupId(args.Category, args.GroupId) log.Debug().Msgf("RunGroupTask %s", categoryGroup) - log.Debug().Msgf("script path %s", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath) groupTaskStep := structs.GroupTaskSteps{ @@ -104,27 +109,67 @@ func RunGroupTask(args RunGroupTaskArgs) { } else if args.StartType == RunGroupTaskStartTypeTryAgain { groupTaskStep.Id = args.TaskStepId - database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) + updateGroupTaskSteps(groupTaskStep) - socketclients.BroadcastMessage(structs.SendSocketMessage{ - Cmd: utils.SentCmdUpdateGroupTaskStep, - Body: groupTaskStep, - }) + /* + database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) + + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTaskStep, + Body: groupTaskStep, + }) */ } // set group task to running - database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + dbGroupTask := updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ Status: structs.GroupTasksStatusRunning, }) + /* + database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + Status: structs.GroupTasksStatusRunning, + }) - var dbGroupTask structs.GroupTasks + var dbGroupTask structs.GroupTasks - database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) + database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) - socketclients.BroadcastMessage(structs.SendSocketMessage{ - Cmd: utils.SentCmdUpdateGroupTask, - Body: dbGroupTask, - }) + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTask, + Body: dbGroupTask, + })*/ + + // check task parameters + var globalInputParameters []GlobalInputParameters + + if len(args.GlobalInputs) > 0 { // global inputs given in args because the group task was just created + log.Info().Msgf("global inputs given %s", args.GlobalInputs) + + if err := json.Unmarshal([]byte(args.GlobalInputs), &globalInputParameters); err != nil { + log.Error().Msgf("err unmarshalling global inputs %s", err.Error()) + } + } else { // global inputs not given in args - fetch it from the database + log.Info().Msgf("global inputs not given in args %s", dbGroupTask.GlobalInputs) + + if err := json.Unmarshal([]byte(dbGroupTask.GlobalInputs), &globalInputParameters); err != nil { + log.Error().Msgf("err unmarshalling global inputs %s", err.Error()) + } + } + + log.Info().Msgf("unmarshalled global inputs %s", globalInputParameters) + log.Info().Msgf("task parameters %s", categoryGroup.Tasks[args.Step-1].Parameters) + + if len(categoryGroup.Tasks[args.Step-1].Parameters) != 0 && len(args.Parameters) == 0 { + log.Error().Msg("task parameters not specified") + + updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ + Status: structs.GroupTasksStatusInputRequired, + }) + + groupTaskStep.Status = structs.GroupTasksStatusInputRequired + + updateGroupTaskSteps(groupTaskStep) + return + } // execute script cmd, err := exec.Command("python3", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath).Output() @@ -149,19 +194,22 @@ func RunGroupTask(args RunGroupTaskArgs) { groupTaskStep.Log = cmdLog groupTaskStep.EndedAt = time.Now() - database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) + updateGroupTaskSteps(groupTaskStep) - socketclients.BroadcastMessage(structs.SendSocketMessage{ - Cmd: utils.SentCmdUpdateGroupTaskStep, - Body: groupTaskStep, - }) + /* + database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) + + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTaskStep, + Body: groupTaskStep, + }) */ log.Info().Msgf("run next task") if int(args.Step) < len(categoryGroup.Tasks) { if groupTaskStep.Status == structs.GroupTasksStatusFailed { // set group task to failed - database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + /*database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ Status: structs.GroupTasksStatusFailed, }) @@ -172,12 +220,20 @@ func RunGroupTask(args RunGroupTaskArgs) { socketclients.BroadcastMessage(structs.SendSocketMessage{ Cmd: utils.SentCmdUpdateGroupTask, Body: dbGroupTask, + }) */ + + updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ + Status: structs.GroupTasksStatusFailed, }) } else { args.StartType = RunGroupTaskStartTypeNormal args.Step = args.Step + 1 - database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ + CurrentTasksStep: args.Step, + }) + + /*database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ CurrentTasksStep: args.Step, }) @@ -188,31 +244,63 @@ func RunGroupTask(args RunGroupTaskArgs) { socketclients.BroadcastMessage(structs.SendSocketMessage{ Cmd: utils.SentCmdUpdateGroupTask, Body: dbGroupTask, - }) + })*/ log.Debug().Msgf("RUN NEXT TASK %s", groupTaskStep) RunGroupTask(args) } } else { // set group task to finished - database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{ Status: structs.GroupTasksStatusFinished, EndedAt: time.Now(), }) - var dbGroupTask structs.GroupTasks + /* + database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ + Status: structs.GroupTasksStatusFinished, + EndedAt: time.Now(), + }) - database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) + var dbGroupTask structs.GroupTasks - socketclients.BroadcastMessage(structs.SendSocketMessage{ - Cmd: utils.SentCmdUpdateGroupTask, - Body: dbGroupTask, - }) + database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) + + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTask, + Body: dbGroupTask, + })*/ log.Info().Msg("SET TO FINISHED") } } +// Updates group task and send it to websocket users +func updateGroupTask(groupTasksId string, updates structs.GroupTasks) structs.GroupTasks { + database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTasksId).Updates(updates) + + var dbGroupTask structs.GroupTasks + + database.DB.First(&dbGroupTask, "id = ?", groupTasksId) + + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTask, + Body: dbGroupTask, + }) + + return dbGroupTask +} + +// Updates group task steps and send it to websocket users +func updateGroupTaskSteps(groupTaskStep structs.GroupTaskSteps) { + database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) + + socketclients.BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdUpdateGroupTaskStep, + Body: groupTaskStep, + }) +} + func GetAllGroupTasks() []structs.GroupTasks { var groupTasks []structs.GroupTasks diff --git a/modules/structs/grouptasks.go b/modules/structs/grouptasks.go index b3d7f9a..ea17e7c 100644 --- a/modules/structs/grouptasks.go +++ b/modules/structs/grouptasks.go @@ -7,11 +7,11 @@ import ( // structure for database const ( - GroupTasksStatusFinished uint8 = 1 - GroupTasksStatusRunning uint8 = 2 - GroupTasksStatusCanceled uint8 = 3 - GroupTasksStatusFailed uint8 = 4 - GroupTasksInputRequired uint8 = 5 + GroupTasksStatusFinished uint8 = 1 + GroupTasksStatusRunning uint8 = 2 + GroupTasksStatusCanceled uint8 = 3 + GroupTasksStatusFailed uint8 = 4 + GroupTasksStatusInputRequired uint8 = 5 ) type GroupTasks struct { diff --git a/socketserver/hub.go b/socketserver/hub.go index 316e060..dc6e83f 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -120,7 +120,7 @@ func RunHub() { GroupId: groupId, Step: 1, TaskStepId: "", - GlobalInputs: globalInputs.([]interface{}), + GlobalInputs: globalInputsJsonString, }) break case utils.ReceivedCmdTaskFailedTryAgainRunTaskStep: