canape/movies/movies.go
2016-02-21 19:56:01 +01:00

108 lines
2.4 KiB
Go

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
}