emdb/worker-client/worker/worker.go

68 lines
1.5 KiB
Go
Raw Normal View History

2024-03-09 14:59:18 +01:00
package worker
import (
"database/sql"
"errors"
"log/slog"
"time"
"code.ewintr.nl/emdb/client"
"code.ewintr.nl/emdb/job"
"code.ewintr.nl/emdb/storage"
)
const (
interval = 5 * time.Second
)
type Worker struct {
jq *job.JobQueue
movieRepo *storage.MovieRepository
reviewRepo *storage.ReviewRepository
imdb *client.IMDB
logger *slog.Logger
}
func NewWorker(jq *job.JobQueue, movieRepo *storage.MovieRepository, reviewRepo *storage.ReviewRepository, imdb *client.IMDB, logger *slog.Logger) *Worker {
return &Worker{
jq: jq,
movieRepo: movieRepo,
reviewRepo: reviewRepo,
imdb: imdb,
logger: logger.With("service", "worker"),
}
}
func (w *Worker) Run() {
logger := w.logger.With("method", "run")
logger.Info("starting worker")
for {
time.Sleep(interval)
j, err := w.jq.Next()
switch {
case errors.Is(err, sql.ErrNoRows):
logger.Info("no jobs found")
continue
case err != nil:
logger.Error("could not get next job", "error", err)
continue
}
logger.Info("got a new job", "jobID", j.ID, "movieID", j.ActionID, "action", j.Action)
switch j.Action {
case job.ActionRefreshIMDBReviews:
w.RefreshReviews(j.ID, j.ActionID)
case job.ActionRefreshAllIMDBReviews:
w.RefreshAllReviews(j.ID)
case job.ActionFindTitles:
//w.FindTitles(j.ID, j.ActionID)
case job.ActionFindAllTitles:
w.FindAllTitles(j.ID)
default:
logger.Error("unknown job action", "action", j.Action)
}
}
}