emdb/cmd/api-service/job/worker.go

93 lines
2.1 KiB
Go
Raw Normal View History

2023-12-30 09:19:53 +01:00
package job
import (
"log/slog"
"ewintr.nl/emdb/client"
"ewintr.nl/emdb/cmd/api-service/moviestore"
)
type Worker struct {
jq *JobQueue
movieRepo *moviestore.MovieRepository
reviewRepo *moviestore.ReviewRepository
imdb *client.IMDB
logger *slog.Logger
}
func NewWorker(jq *JobQueue, movieRepo *moviestore.MovieRepository, reviewRepo *moviestore.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() {
w.logger.Info("starting worker")
for j := range w.jq.Next() {
w.logger.Info("got a new job", "jobID", j.ID, "movieID", j.MovieID, "action", j.Action)
switch j.Action {
case ActionRefreshIMDBReviews:
w.RefreshReviews(j.ID, j.MovieID)
case ActionRefreshAllIMDBReviews:
w.RefreshAllReviews(j.ID)
default:
w.logger.Warn("unknown job action", "action", j.Action)
}
}
}
2024-01-17 07:57:52 +01:00
func (w *Worker) FindNewJobs() {
}
2023-12-30 09:19:53 +01:00
func (w *Worker) RefreshAllReviews(jobID int) {
logger := w.logger.With("method", "fetchReviews", "jobID", jobID)
movies, err := w.movieRepo.FindAll()
if err != nil {
logger.Error("could not get movies", "error", err)
return
}
for _, m := range movies {
2024-01-06 14:32:32 +01:00
if err := w.jq.Add(m.ID, ActionRefreshIMDBReviews); err != nil {
logger.Error("could not add job", "error", err)
return
}
2023-12-30 09:19:53 +01:00
}
}
func (w *Worker) RefreshReviews(jobID int, movieID string) {
logger := w.logger.With("method", "fetchReviews", "jobID", jobID, "movieID", movieID)
m, err := w.movieRepo.FindOne(movieID)
if err != nil {
logger.Error("could not get movie", "error", err)
return
}
if err := w.reviewRepo.DeleteByMovieID(m.ID); err != nil {
logger.Error("could not delete reviews", "error", err)
return
}
2024-01-17 07:57:52 +01:00
reviews, err := w.imdb.GetReviews(m)
2023-12-30 09:19:53 +01:00
if err != nil {
logger.Error("could not get reviews", "error", err)
return
}
2024-01-17 07:57:52 +01:00
for _, review := range reviews {
if err := w.reviewRepo.Store(review); err != nil {
2023-12-30 09:19:53 +01:00
logger.Error("could not store review", "error", err)
return
}
}
logger.Info("refresh reviews", "count", len(reviews))
}