diff --git a/backend/models/episodes.go b/backend/models/episodes.go index d5ea828..e91c192 100644 --- a/backend/models/episodes.go +++ b/backend/models/episodes.go @@ -127,42 +127,18 @@ func GetEpisodes(db *sqlx.DB, pShow *polochon.Show, log *logrus.Entry) error { // updateFromEpisode will update the episodeDB from a ShowEpisode // We just make sure to never update the episodeDB with empty value func (e *episodeDB) updateFromEpisode(showEpisode *polochon.ShowEpisode) { - if showEpisode.TvdbID != 0 { - e.TvdbID = showEpisode.TvdbID - } - if showEpisode.EpisodeImdbID != "" { - e.ImdbID = showEpisode.EpisodeImdbID - } - if showEpisode.ShowImdbID != "" { - e.ShowImdbID = showEpisode.ShowImdbID - } - if showEpisode.ShowTvdbID != 0 { - e.ShowTvdbID = showEpisode.ShowTvdbID - } - if showEpisode.Season != 0 { - e.Season = showEpisode.Season - } - if showEpisode.Episode != 0 { - e.Episode = showEpisode.Episode - } - if showEpisode.Title != "" { - e.Title = showEpisode.Title - } - if showEpisode.Rating != 0 { - e.Rating = showEpisode.Rating - } - if showEpisode.Plot != "" { - e.Plot = showEpisode.Plot - } - if showEpisode.Thumb != "" { - e.Thumb = showEpisode.Thumb - } - if showEpisode.Runtime != 0 { - e.Runtime = showEpisode.Runtime - } - if showEpisode.Aired != "" { - e.Aired = showEpisode.Aired - } + updateIfNonEmpty(&e.ImdbID, showEpisode.EpisodeImdbID) + updateIfNonEmpty(&e.ShowImdbID, showEpisode.ShowImdbID) + updateIfNonEmpty(&e.Title, showEpisode.Title) + updateIfNonEmpty(&e.Plot, showEpisode.Plot) + updateIfNonEmpty(&e.Thumb, showEpisode.Thumb) + updateIfNonEmpty(&e.Aired, showEpisode.Aired) + updateIfNonZeroInt(&e.TvdbID, showEpisode.TvdbID) + updateIfNonZeroInt(&e.ShowTvdbID, showEpisode.ShowTvdbID) + updateIfNonZeroInt(&e.Season, showEpisode.Season) + updateIfNonZeroInt(&e.Episode, showEpisode.Episode) + updateIfNonZeroInt(&e.Runtime, showEpisode.Runtime) + updateIfNonZeroFloat(&e.Rating, showEpisode.Rating) } // UpsertEpisode upserts the episode diff --git a/backend/models/movies.go b/backend/models/movies.go index ee71748..eee2dfc 100644 --- a/backend/models/movies.go +++ b/backend/models/movies.go @@ -1,6 +1,7 @@ package models import ( + "database/sql" "fmt" "time" @@ -34,7 +35,6 @@ type movieDB struct { ID string `db:"id"` ImdbID string `db:"imdb_id"` TmdbID int `db:"tmdb_id"` - UserID *string `db:"user_id"` Title string `db:"title"` OriginalTitle string `db:"original_title"` SortTitle string `db:"sort_title"` @@ -49,27 +49,34 @@ type movieDB struct { Updated time.Time `db:"updated_at"` } +func getMovieDB(db *sqlx.DB, movie *polochon.Movie) (*movieDB, error) { + var mDB movieDB + err := db.QueryRowx(getMovieQueryByImdbID, movie.ImdbID).StructScan(&mDB) + if err != nil { + return &mDB, err + } + return &mDB, nil +} + // GetMovie fills show details of a polochon.Movie func GetMovie(db *sqlx.DB, pMovie *polochon.Movie) error { - var mDB movieDB - var err error - if pMovie.ImdbID != "" { - // Get the data from the DB - err = db.QueryRowx(getMovieQueryByImdbID, pMovie.ImdbID).StructScan(&mDB) - } else { - err = fmt.Errorf("Can't get movie details, you have to specify an ImdbID") + if pMovie.ImdbID == "" { + return fmt.Errorf("Can't get movie details, you have to specify an ImdbID") } + + // Get the movie from the DB + movie, err := getMovieDB(db, pMovie) if err != nil { return err } // Fills the polochon.Movie from the movieDB - FillFromDB(&mDB, pMovie) + FillMovieFromDB(movie, pMovie) return nil } -// FillFromDB fills a Movie from a movieDB extracted from the DB -func FillFromDB(mDB *movieDB, pMovie *polochon.Movie) { +// FillMovieFromDB fills a Movie from a movieDB extracted from the DB +func FillMovieFromDB(mDB *movieDB, pMovie *polochon.Movie) { pMovie.ImdbID = mDB.ImdbID pMovie.Title = mDB.Title pMovie.Rating = mDB.Rating @@ -84,10 +91,39 @@ func FillFromDB(mDB *movieDB, pMovie *polochon.Movie) { pMovie.Tagline = mDB.Tagline } +// updateFromMovie will update the movieDB from a Movie +// We just make sure to never update the movieDB with empty value +func (m *movieDB) updateFromMovie(movie *polochon.Movie) { + updateIfNonEmpty(&m.ImdbID, movie.ImdbID) + updateIfNonEmpty(&m.Title, movie.Title) + updateIfNonEmpty(&m.OriginalTitle, movie.OriginalTitle) + updateIfNonEmpty(&m.SortTitle, movie.SortTitle) + updateIfNonEmpty(&m.Plot, movie.Plot) + updateIfNonEmpty(&m.Tagline, movie.Tagline) + updateIfNonZeroInt(&m.TmdbID, movie.TmdbID) + updateIfNonZeroInt(&m.Votes, movie.Votes) + updateIfNonZeroInt(&m.Year, movie.Year) + updateIfNonZeroInt(&m.Runtime, movie.Runtime) + updateIfNonZeroFloat(&m.Rating, movie.Rating) + if movie.Genres != nil { + m.Genres = movie.Genres + } +} + // UpsertMovie upsert a polochon Movie in the database func UpsertMovie(db *sqlx.DB, pMovie *polochon.Movie) error { - mDB := NewMovieDB(pMovie) - r, err := db.NamedQuery(upsertMovieQuery, mDB) + // Try to get the movie + movieDB, err := getMovieDB(db, pMovie) + // Return only if the error is != sql.ErrNoRows + if err != nil { + if err != sql.ErrNoRows { + return err + } + } + + // Update the movieDB from the movie we have + movieDB.updateFromMovie(pMovie) + r, err := db.NamedQuery(upsertMovieQuery, movieDB) if err != nil { return err } @@ -96,9 +132,9 @@ func UpsertMovie(db *sqlx.DB, pMovie *polochon.Movie) error { return nil } -// NewMovieDB returns a Movie ready to be put in DB from a +// newMovieDB returns a Movie ready to be put in DB from a // polochon Movie -func NewMovieDB(m *polochon.Movie) movieDB { +func newMovieDB(m *polochon.Movie) movieDB { genres := []string{} if m.Genres != nil { genres = m.Genres diff --git a/backend/models/utils.go b/backend/models/utils.go new file mode 100644 index 0000000..b222729 --- /dev/null +++ b/backend/models/utils.go @@ -0,0 +1,19 @@ +package models + +func updateIfNonEmpty(old *string, newValue string) { + if newValue != "" { + *old = newValue + } +} + +func updateIfNonZeroInt(old *int, newValue int) { + if newValue != 0 { + *old = newValue + } +} + +func updateIfNonZeroFloat(old *float32, newValue float32) { + if newValue != 0. { + *old = newValue + } +}