130 lines
2.8 KiB
Go
130 lines
2.8 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 (imdb_id, title, rating, votes, plot, tmdb_id, year, original_title, runtime, sort_title, tagline)
|
|
VALUES (:imdbid, :title, :rating, :votes, :plot, :tmdbid, :year, :originaltitle, :runtime, :sorttitle, :tagline)
|
|
RETURNING id;`
|
|
|
|
getMovieQueryByImdbID = `
|
|
SELECT
|
|
id, imdb_id AS imdbid, title, rating, votes, plot,
|
|
tmdb_id AS tmdbid, year,
|
|
original_title AS originaltitle, runtime,
|
|
sort_title AS sorttitle, tagline,
|
|
created_at, updated_at
|
|
FROM movies WHERE imdb_id=$1;`
|
|
getMovieQueryByID = `
|
|
SELECT
|
|
id, imdb_id AS imdbid, title, rating, votes, plot,
|
|
tmdb_id AS tmdbid, year,
|
|
original_title AS originaltitle, runtime,
|
|
sort_title AS sorttitle, tagline,
|
|
created_at, updated_at
|
|
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
|
|
}
|
|
|
|
func New(imdbID string) *Movie {
|
|
return &Movie{
|
|
Movie: polochon.Movie{
|
|
ImdbID: imdbID,
|
|
},
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|