diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2022-06-16 22:09:39 +0200 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2022-06-16 22:09:39 +0200 |
commit | db7e822dda56d32135eca6d3e3211a50cf93d31a (patch) | |
tree | a3cdebdb6befe370b66dafd13340d533940c6467 | |
parent | d06f6e1398c5dedb3359ff929c5aaf7317c73ce1 (diff) | |
download | mdir-db7e822dda56d32135eca6d3e3211a50cf93d31a.tar.gz mdir-db7e822dda56d32135eca6d3e3211a50cf93d31a.tar.bz2 mdir-db7e822dda56d32135eca6d3e3211a50cf93d31a.zip |
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.
-rw-r--r-- | controller/controller.go | 5 | ||||
-rw-r--r-- | routes/routes.go | 1 | ||||
-rw-r--r-- | templates/_footer.tmpl | 14 | ||||
-rw-r--r-- | templates/_head.tmpl | 1 | ||||
-rw-r--r-- | templates/index.tmpl | 4 | ||||
-rw-r--r-- | 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); + </script> </body> </html> 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 @@ <!DOCTYPE html> <html> <head> + <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/assets/bulma.min.css"> </head> <body> 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 @@ <th scope="col">Title</th> <th scope="col">Link</th> <th scope="col">Output</th> + <th scope="col">Status</th> <th scope="col"></th> </tr> </thead> @@ -19,6 +20,9 @@ <td>{{ .Link }}</td> <td>{{ .OutputFolder }}</td> <td> + <span id="status_{{ .ID }}" class="tag is-primary is-light"></span> + </td> + <td> <a href="entries/{{ .ID }}" >Edit</a> </span> <a onclick="deleteEntry({{ .ID }})">Delete</a> 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 +} |