diff --git a/shows/shows.go b/shows/shows.go index eb29ac9..73d87fe 100644 --- a/shows/shows.go +++ b/shows/shows.go @@ -12,19 +12,32 @@ import ( ) const ( - addShowQuery = `INSERT INTO shows (imdbid, title) VALUES (:imdbid, :title) RETURNING id;` + addShowQuery = ` + INSERT INTO shows (imdbid, title, rating, plot, tvdbid, year, firstaired) + VALUES (:imdbid, :title, :rating, :plot, :tvdbid, :year, :firstaired) RETURNING id;` + getShowQueryByImdbID = `SELECT * FROM shows WHERE imdbid=$1;` getShowQueryByID = `SELECT * FROM shows WHERE id=$1;` deleteShowQuery = `DELETE FROM shows WHERE id=$1;` - addEpisodeQuery = `INSERT INTO episodes (shows_id, title, season, episode) VALUES ($1,$2,$3,$4);` - getEpisodesQuery = `SELECT title, season, episode FROM episodes WHERE shows_id=$1;` + addEpisodeQuery = ` + INSERT INTO episodes (shows_id, title, season, episode, tvdbid, aired, plot, runtime, rating, imdbid) + VALUES (:showid, :title, :season, :episode, :tvdbid, :aired, :plot, :runtime, :rating, :episodeimdbid) RETURNING id;` + + getEpisodesQuery = ` + SELECT title, season, episode, tvdbid, aired, plot, runtime, rating, imdbid AS episodeimdbid, shows_id AS showid + FROM episodes WHERE shows_id=$1;` getShowWithUserQueryByImdbID = ` SELECT shows.id, - shows.title, shows.imdbid, + shows.title, + shows.rating, + shows.plot, + shows.tvdbid, + shows.year, + shows.firstaired, COALESCE(shows_tracked.season,0) AS trackedseason, COALESCE(shows_tracked.episode,0) AS trackedepisode FROM shows LEFT JOIN shows_tracked ON shows.id=shows_tracked.shows_id AND shows_tracked.users_id=$2 @@ -33,8 +46,13 @@ const ( getShowWithUserQueryByID = ` SELECT shows.id, - shows.title, shows.imdbid, + shows.title, + shows.rating, + shows.plot, + shows.tvdbid, + shows.year, + shows.firstaired, COALESCE(shows_tracked.season,0) AS trackedseason, COALESCE(shows_tracked.episode,0) AS trackedepisode FROM shows LEFT JOIN shows_tracked ON shows.id=shows_tracked.shows_id AND shows_tracked.users_id=$2 @@ -124,7 +142,10 @@ func (s *Show) GetDetails(db *sqlx.DB, log *logrus.Entry) error { s.Episodes = append(s.Episodes, &Episode{ShowEpisode: *pe}) } - s.Add(db) + err = s.Add(db) + if err != nil { + return err + } return nil } @@ -144,7 +165,10 @@ func (s *Show) GetDetailsAsUser(db *sqlx.DB, user *users.User, log *logrus.Entry if err != nil { return err } - s.Add(db) + err = s.Add(db) + if err != nil { + return err + } s.Episodes = []*Episode{} for _, pe := range s.Show.Episodes { s.Episodes = append(s.Episodes, &Episode{ShowEpisode: *pe}) @@ -176,7 +200,8 @@ func (s *Show) Add(db *sqlx.DB) error { // When add a show to database use polochon episode details // so s.Show.Episodes for _, pEp := range s.Show.Episodes { - err = s.addEpisode(db, pEp) + e := &Episode{ShowEpisode: *pEp, ShowID: s.ID} + err = e.Add(db) if err != nil { return err } @@ -184,14 +209,6 @@ func (s *Show) Add(db *sqlx.DB) error { return nil } -func (s *Show) addEpisode(db *sqlx.DB, pEpisode *polochon.ShowEpisode) error { - _, err := db.Exec(addEpisodeQuery, s.ID, pEpisode.Title, pEpisode.Season, pEpisode.Episode) - if err != nil { - return err - } - return nil -} - // Delete show from database func (s *Show) Delete(db *sqlx.DB) error { r, err := db.Exec(deleteShowQuery, s.ID) @@ -209,6 +226,7 @@ func (s *Show) Delete(db *sqlx.DB) error { func (s *Show) GetEpisodes(db *sqlx.DB) error { // When retrive episode's info from database populate the s.Episodes member // and not s.Show.Episodes + s.Episodes = []*Episode{} err := db.Select(&s.Episodes, getEpisodesQuery, s.ID) if err != nil { return err @@ -221,4 +239,19 @@ func (s *Show) GetEpisodes(db *sqlx.DB) error { type Episode struct { sqly.BaseModel polochon.ShowEpisode + ShowID string +} + +// Add episode to the database +func (e *Episode) Add(db *sqlx.DB) error { + var id string + r, err := db.NamedQuery(addEpisodeQuery, e) + if err != nil { + return err + } + for r.Next() { + r.Scan(&id) + } + e.ID = id + return nil } diff --git a/shows/shows_test.go b/shows/shows_test.go index ae1a55c..ef09acb 100644 --- a/shows/shows_test.go +++ b/shows/shows_test.go @@ -48,13 +48,38 @@ func TestIntegrate(t *testing.T) { } log := logrus.NewEntry(logrus.New()) - show.GetDetails(db, log) + err := show.GetDetails(db, log) + if err != nil { + t.Fatal(err) + } if len(show.Episodes) != 50 { t.Fatalf("Unexpected number of episodes: %d", len(show.Episodes)) } - err := show.Delete(db) + // Get from db + show2 := Show{ + Show: polochon.Show{ + ShowConfig: polochonConfig, + ImdbID: "tt12345", + }, + } + + err = show2.Get(db) + if err != nil { + t.Fatal(err) + } + + err = show2.GetEpisodes(db) + if err != nil { + t.Fatal(err) + } + + if len(show2.Episodes) != 50 { + t.Fatalf("Unexpected number of episodes: %d", len(show2.Episodes)) + } + + err = show.Delete(db) if err != nil { t.Fatal(err) } @@ -82,13 +107,17 @@ func TestTrackedShow(t *testing.T) { }, } - show.Add(db) - - u := &users.User{Name: "plop"} - err := u.Add(db) + err := show.Add(db) if err != nil { t.Fatal(err) } + + u := &users.User{Name: "plop"} + err = u.Add(db) + if err != nil { + t.Fatal(err) + } + err = show.GetAsUser(db, u) if err != nil { t.Fatal(err) diff --git a/sql/0001_initial.up.sql b/sql/0001_initial.up.sql index 6703605..bcd9461 100644 --- a/sql/0001_initial.up.sql +++ b/sql/0001_initial.up.sql @@ -33,6 +33,11 @@ CREATE TABLE shows ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), imdbid text NOT NULL UNIQUE, title text NOT NULL, + rating real NOT NULL, + plot text NOT NULL, + tvdbid text NOT NULL, + year smallint NOT NULL, + firstaired timestamp, LIKE base INCLUDING DEFAULTS ); CREATE INDEX ON shows (imdbid); @@ -44,6 +49,12 @@ CREATE TABLE episodes ( title text NOT NULL, season integer NOT NULL, episode integer NOT NULL, + tvdbid text NOT NULL, + aired text NOT NULL, + plot text NOT NULL, + runtime smallint NOT NULL, + rating real NOT NULL, + imdbid text NOT NULL, LIKE base INCLUDING DEFAULTS ); CREATE INDEX ON episodes (shows_id, season);