diff --git a/backend/internal/handlers/jobs.go b/backend/internal/handlers/jobs.go new file mode 100644 index 0000000..643b05f --- /dev/null +++ b/backend/internal/handlers/jobs.go @@ -0,0 +1,67 @@ +package handlers + +import ( + "fmt" + + "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander" + "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models" + "github.com/gin-gonic/gin" +) + +type JobsHandlers struct { + cmder *commander.Commander +} + +func NewJobsHandlers(cmder *commander.Commander) JobsHandlers { + return JobsHandlers{cmder} +} + +func (self *JobsHandlers) AddJob(c *gin.Context) { + err := func() error { + type In struct { + Command []string `json:"command"` + Stdin *string `json:"stdin"` + AID string `json:"agent_id"` + } + var in In + if err := c.Bind(&in); err != nil { + return err + } + agent, ok := self.cmder.GetAgent(in.AID) + if !ok { + c.Status(404) + return fmt.Errorf("Agent not found") + } + jid, err := agent.AddJob(models.JobForInsert{ + Command: in.Command, + Stdin: in.Stdin, + }) + if err != nil { + return err + } + job, err := agent.WaitJob(jid) + if err != nil { + return err + } + type Out struct { + ID int64 `json:"id"` + Command []string `json:"command"` + Stdin *string `json:"stdin"` + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + Status int32 `json:"status"` + } + c.JSON(201, Out{ + ID: job.ID, + Command: job.Command, + Stdin: job.Stdin, + Stdout: job.Stdout, + Stderr: job.Stderr, + Status: job.Status, + }) + return nil + }() + if err != nil { + c.Error(err) + } +}