Add all columns for shows and episodes

This commit is contained in:
Nicolas Duhamel 2016-02-21 18:47:41 +01:00
parent 276c9caa29
commit ab02aa3479
3 changed files with 95 additions and 22 deletions

View File

@ -12,19 +12,32 @@ import (
) )
const ( 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;` getShowQueryByImdbID = `SELECT * FROM shows WHERE imdbid=$1;`
getShowQueryByID = `SELECT * FROM shows WHERE id=$1;` getShowQueryByID = `SELECT * FROM shows WHERE id=$1;`
deleteShowQuery = `DELETE 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);` addEpisodeQuery = `
getEpisodesQuery = `SELECT title, season, episode FROM episodes WHERE shows_id=$1;` 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 = ` getShowWithUserQueryByImdbID = `
SELECT SELECT
shows.id, shows.id,
shows.title,
shows.imdbid, shows.imdbid,
shows.title,
shows.rating,
shows.plot,
shows.tvdbid,
shows.year,
shows.firstaired,
COALESCE(shows_tracked.season,0) AS trackedseason, COALESCE(shows_tracked.season,0) AS trackedseason,
COALESCE(shows_tracked.episode,0) AS trackedepisode 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 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 = ` getShowWithUserQueryByID = `
SELECT SELECT
shows.id, shows.id,
shows.title,
shows.imdbid, shows.imdbid,
shows.title,
shows.rating,
shows.plot,
shows.tvdbid,
shows.year,
shows.firstaired,
COALESCE(shows_tracked.season,0) AS trackedseason, COALESCE(shows_tracked.season,0) AS trackedseason,
COALESCE(shows_tracked.episode,0) AS trackedepisode 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 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.Episodes = append(s.Episodes, &Episode{ShowEpisode: *pe})
} }
s.Add(db) err = s.Add(db)
if err != nil {
return err
}
return nil return nil
} }
@ -144,7 +165,10 @@ func (s *Show) GetDetailsAsUser(db *sqlx.DB, user *users.User, log *logrus.Entry
if err != nil { if err != nil {
return err return err
} }
s.Add(db) err = s.Add(db)
if err != nil {
return err
}
s.Episodes = []*Episode{} s.Episodes = []*Episode{}
for _, pe := range s.Show.Episodes { for _, pe := range s.Show.Episodes {
s.Episodes = append(s.Episodes, &Episode{ShowEpisode: *pe}) 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 // When add a show to database use polochon episode details
// so s.Show.Episodes // so s.Show.Episodes
for _, pEp := range 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 { if err != nil {
return err return err
} }
@ -184,14 +209,6 @@ func (s *Show) Add(db *sqlx.DB) error {
return nil 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 // Delete show from database
func (s *Show) Delete(db *sqlx.DB) error { func (s *Show) Delete(db *sqlx.DB) error {
r, err := db.Exec(deleteShowQuery, s.ID) 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 { func (s *Show) GetEpisodes(db *sqlx.DB) error {
// When retrive episode's info from database populate the s.Episodes member // When retrive episode's info from database populate the s.Episodes member
// and not s.Show.Episodes // and not s.Show.Episodes
s.Episodes = []*Episode{}
err := db.Select(&s.Episodes, getEpisodesQuery, s.ID) err := db.Select(&s.Episodes, getEpisodesQuery, s.ID)
if err != nil { if err != nil {
return err return err
@ -221,4 +239,19 @@ func (s *Show) GetEpisodes(db *sqlx.DB) error {
type Episode struct { type Episode struct {
sqly.BaseModel sqly.BaseModel
polochon.ShowEpisode 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
} }

View File

@ -48,13 +48,38 @@ func TestIntegrate(t *testing.T) {
} }
log := logrus.NewEntry(logrus.New()) 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 { if len(show.Episodes) != 50 {
t.Fatalf("Unexpected number of episodes: %d", len(show.Episodes)) 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 { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -82,13 +107,17 @@ func TestTrackedShow(t *testing.T) {
}, },
} }
show.Add(db) err := show.Add(db)
u := &users.User{Name: "plop"}
err := u.Add(db)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
u := &users.User{Name: "plop"}
err = u.Add(db)
if err != nil {
t.Fatal(err)
}
err = show.GetAsUser(db, u) err = show.GetAsUser(db, u)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@ -33,6 +33,11 @@ CREATE TABLE shows (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(), id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
imdbid text NOT NULL UNIQUE, imdbid text NOT NULL UNIQUE,
title text NOT NULL, 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 LIKE base INCLUDING DEFAULTS
); );
CREATE INDEX ON shows (imdbid); CREATE INDEX ON shows (imdbid);
@ -44,6 +49,12 @@ CREATE TABLE episodes (
title text NOT NULL, title text NOT NULL,
season integer NOT NULL, season integer NOT NULL,
episode 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 LIKE base INCLUDING DEFAULTS
); );
CREATE INDEX ON episodes (shows_id, season); CREATE INDEX ON episodes (shows_id, season);