package movies import ( "fmt" "github.com/Sirupsen/logrus" "github.com/jmoiron/sqlx" "github.com/odwrtw/polochon/lib" "gitlab.quimbo.fr/odwrtw/canape-sql/sqly" ) const ( addMovieQuery = ` INSERT INTO movies (imdbid, title, rating, votes, plot, tmdbid, year, originaltitle, runtime, sorttitle, tagline) VALUES (:imdbid, :title, :rating, :votes, :plot, :tmdbid, :year, :originaltitle, :runtime, :sorttitle, :tagline) RETURNING id;` getMovieQueryByImdbID = `SELECT * FROM movies WHERE imdbid=$1;` getMovieQueryByID = `SELECT * FROM movies WHERE id=$1;` deleteMovieQuery = `DELETE FROM movies WHERE id=$1;` ) var ( // ErrNotFound error returned when show not found in database ErrNotFound = fmt.Errorf("Not found") ) // Movie represents a movie type Movie struct { sqly.BaseModel polochon.Movie } // Get returns show details in database from id or imdbid or an error func (m *Movie) Get(db *sqlx.DB) error { var err error if m.ID != "" { err = db.QueryRowx(getMovieQueryByID, m.ID).StructScan(m) } else if m.ImdbID != "" { err = db.QueryRowx(getMovieQueryByImdbID, m.ImdbID).StructScan(m) } else { err = fmt.Errorf("Can't get movie details, you have to specify an ID or ImdbID") } if err != nil { if err.Error() == "sql: no rows in result set" { return ErrNotFound } return err } return nil } // GetDetails retrieves details for the movie, first try to // get info from db, if not exists, use polochon.Detailer // and save informations in the database for future use func (m *Movie) GetDetails(db *sqlx.DB, log *logrus.Entry) error { var err error err = m.Get(db) if err == nil { // found ok return nil } if err != ErrNotFound { // Unexpected error return err } // so we got ErrNotFound so GetDetails from a detailer err = m.Movie.GetDetails(log) if err != nil { return err } err = m.Add(db) if err != nil { return err } return nil } // Add a movie in the database func (m *Movie) Add(db *sqlx.DB) error { var id string r, err := db.NamedQuery(addMovieQuery, m) if err != nil { return err } for r.Next() { r.Scan(&id) } m.ID = id return nil } // Delete movie from database func (m *Movie) Delete(db *sqlx.DB) error { r, err := db.Exec(deleteMovieQuery, m.ID) if err != nil { return err } count, _ := r.RowsAffected() if count != 1 { return fmt.Errorf("Unexpected number of row deleted: %d", count) } return nil }