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 (
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
}

View File

@ -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)

View File

@ -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);