From db7e822dda56d32135eca6d3e3211a50cf93d31a Mon Sep 17 00:00:00 2001 From: "Gabriel A. Giovanini" Date: Thu, 16 Jun 2022 22:09:39 +0200 Subject: feat: Add one more state Add a new state to the worker so it can better report what is happening. Also added a status report in the index page. --- controller/controller.go | 5 +++++ routes/routes.go | 1 + templates/_footer.tmpl | 14 ++++++++++++++ templates/_head.tmpl | 1 + templates/index.tmpl | 4 ++++ worker/worker.go | 43 ++++++++++++++++++++++++++++++++++--------- 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 3e029f0..7cbee6a 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -49,3 +49,8 @@ func (e *Env) DeleteEntry(c *gin.Context) { e.Entries.Delete(id) c.HTML(http.StatusOK, "entry", entry) } + +func (e *Env) GetJobs(c *gin.Context) { + jobs := e.Worker.GetJobs() + c.JSON(http.StatusOK, jobs) +} diff --git a/routes/routes.go b/routes/routes.go index a609019..79264c5 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -29,5 +29,6 @@ func HandleRequests() { r.GET("entries/:id", env.GetEntry) r.POST("entries/:id", env.UpdateEntry) r.DELETE("entries/:id", env.DeleteEntry) + r.GET("jobs/", env.GetJobs) r.Run(":8000") } diff --git a/templates/_footer.tmpl b/templates/_footer.tmpl index 07bc857..97a5bf8 100644 --- a/templates/_footer.tmpl +++ b/templates/_footer.tmpl @@ -8,6 +8,20 @@ window.location.href = '/' }); } + + function getStatus() { + fetch("/jobs/", { method: 'GET'}) + .then((res) => { return objs = res.json(); }) + .then((objs) => { + for (i in objs) { + span = document.getElementById("status_"+objs[i].Id); + span.textContent = objs[i].Status; + } + }); + } + +setInterval(getStatus, 1000); + diff --git a/templates/_head.tmpl b/templates/_head.tmpl index 2bb58c4..b99510f 100644 --- a/templates/_head.tmpl +++ b/templates/_head.tmpl @@ -2,6 +2,7 @@ + diff --git a/templates/index.tmpl b/templates/index.tmpl index 9bb7512..ae7f674 100644 --- a/templates/index.tmpl +++ b/templates/index.tmpl @@ -8,6 +8,7 @@ Title Link Output + Status @@ -18,6 +19,9 @@ {{ .Title }} {{ .Link }} {{ .OutputFolder }} + + + Edit diff --git a/worker/worker.go b/worker/worker.go index 5e0c844..f56716f 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -10,11 +10,13 @@ import ( ) const ( - statusStoped = "STOPPED" - statusStarted = "STARTED" + statusNotQueued = "NOTQUEUED" + statusQueued = "QUEUED" + statusStarted = "RUNNING" - commandStart = "START" - commandStop = "STOP" + commandStart = "START" + commandEnqueue = "ENQUEUE" + commandDequeue = "DEQUEUE" ) type command struct { @@ -27,18 +29,29 @@ type Worker struct { c chan command } +type Job struct { + Id uint + Status string +} + +func (w *Worker) CanEnqueue(index uint) bool { + v, found := w.jobs[index] + return !found || v == statusNotQueued +} + func (w *Worker) SpawnWorker(index uint, link string, output string) { - if v, found := w.jobs[index]; found && v == statusStarted { + if !w.CanEnqueue(index) { return } - w.c <- command{action: commandStart, index: index} + w.c <- command{action: commandEnqueue, index: index} task := work.NewTask(func(ctx context.Context) error { + w.c <- command{action: commandStart, index: index} yt.RunYtDlpProcess(link, output) return nil }).After(func(ctx context.Context, task *work.Task) { - w.c <- command{action: commandStop, index: index} + w.c <- command{action: commandDequeue, index: index} }) work.Enqueue(task) @@ -48,10 +61,12 @@ func (w *Worker) startReader() { for true { command := <-w.c - if command.action == commandStop { - w.jobs[command.index] = statusStoped + if command.action == commandEnqueue { + w.jobs[command.index] = statusQueued } else if command.action == commandStart { w.jobs[command.index] = statusStarted + } else if command.action == commandDequeue { + w.jobs[command.index] = statusNotQueued } else { panic(1) } @@ -74,3 +89,13 @@ func (w *Worker) StartWorker(model db.EntryModel) { go w.startReader() go w.startScheduler(model) } + +func (w *Worker) GetJobs() []Job { + jobs := []Job{} + + for k, v := range w.jobs { + jobs = append(jobs, Job{Id: k, Status: v}) + } + + return jobs +} -- cgit v1.2.3