From f042987d10616cadd2510c9c91bc10c58272f8cf Mon Sep 17 00:00:00 2001 From: Lucas BEE Date: Wed, 22 Mar 2017 10:03:26 +0000 Subject: [PATCH] Add routes to show explorer's options --- src/internal/backend/explorer.go | 25 +++++++++++++++++- .../external_medias/external_medias.go | 26 +++++++++++++++++++ src/internal/external_medias/handlers.go | 22 ++++++++++++++++ src/routes.go | 2 ++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/internal/backend/explorer.go b/src/internal/backend/explorer.go index d59d9e7..c229649 100644 --- a/src/internal/backend/explorer.go +++ b/src/internal/backend/explorer.go @@ -15,7 +15,12 @@ const ( DO UPDATE SET type=:type, source=:source, category=:category, ids=:ids RETURNING id;` - getExternalMediaQuery = `SELECT * FROM external_medias WHERE type=$1 AND source=$2 AND category=$3 LIMIT 1;` + getExternalMediaQuery = `SELECT * FROM external_medias WHERE type=$1 AND source=$2 AND category=$3 LIMIT 1;` + getExternalMediaOptions = ` + SELECT + source, category + FROM external_medias + WHERE type=$1;` ) // Media represents an external media @@ -46,3 +51,21 @@ func (m *Media) Upsert(db *sqlx.DB) error { defer r.Close() return nil } + +func GetMediaOptions(db *sqlx.DB, mtype string) (map[string][]string, error) { + type mediaAvailable struct { + Source string `db:"source"` + Category string `db:"category"` + } + m := []*mediaAvailable{} + if err := db.Select(&m, getExternalMediaOptions, mtype); err != nil { + return nil, err + } + + availableMedia := map[string][]string{} + for _, p := range m { + availableMedia[p.Source] = append(availableMedia[p.Source], p.Category) + } + + return availableMedia, nil +} diff --git a/src/internal/external_medias/external_medias.go b/src/internal/external_medias/external_medias.go index 6d8bb5f..7bfa1a3 100644 --- a/src/internal/external_medias/external_medias.go +++ b/src/internal/external_medias/external_medias.go @@ -185,3 +185,29 @@ func Refresh(env *web.Env) { RefreshMovies(env) env.Log.Debugf("done refreshing movies") } + +// GetShowOptions will get show explorer options available +func GetShowOptions(env *web.Env) (map[string][]string, error) { + log := env.Log.WithFields(logrus.Fields{ + "function": "extmedias.GetShowOptions", + }) + log.Debugf("getting explorer show options") + e, err := backend.GetMediaOptions(env.Database, "show") + if err != nil { + return nil, err + } + return e, nil +} + +// GetMovieOptions will get movie explorer options available +func GetMovieOptions(env *web.Env) (map[string][]string, error) { + log := env.Log.WithFields(logrus.Fields{ + "function": "extmedias.GetMovieOptions", + }) + log.Debugf("getting explorer movie options") + e, err := backend.GetMediaOptions(env.Database, "movie") + if err != nil { + return nil, err + } + return e, nil +} diff --git a/src/internal/external_medias/handlers.go b/src/internal/external_medias/handlers.go index 76b5511..116b1d2 100644 --- a/src/internal/external_medias/handlers.go +++ b/src/internal/external_medias/handlers.go @@ -227,3 +227,25 @@ func ExploreShows(env *web.Env, w http.ResponseWriter, r *http.Request) error { return env.RenderJSON(w, shows) } + +// MovieExplorerOptions will return all the explore movie options available +func MovieExplorerOptions(env *web.Env, w http.ResponseWriter, r *http.Request) error { + // Get the list of movie explorer options available + movieOptions, err := GetMovieOptions(env) + if err != nil { + return env.RenderError(w, err) + } + + return env.RenderJSON(w, movieOptions) +} + +// ShowExplorerOptions will return all the explore show options available +func ShowExplorerOptions(env *web.Env, w http.ResponseWriter, r *http.Request) error { + // Get the list of show explorer options available + showOptions, err := GetShowOptions(env) + if err != nil { + return env.RenderError(w, err) + } + + return env.RenderJSON(w, showOptions) +} diff --git a/src/routes.go b/src/routes.go index ef5fc48..8df1a12 100644 --- a/src/routes.go +++ b/src/routes.go @@ -19,6 +19,7 @@ func setupRoutes(env *web.Env) { // Movies routes env.Handle("/movies/polochon", movies.PolochonMoviesHandler).WithRole(users.UserRole).Methods("GET") env.Handle("/movies/explore", extmedias.ExploreMovies).WithRole(users.UserRole).Methods("GET") + env.Handle("/movies/explore/options", extmedias.MovieExplorerOptions).WithRole(users.UserRole).Methods("GET") env.Handle("/movies/search", movies.SearchMovie).WithRole(users.UserRole).Methods("POST") env.Handle("/movies/{id:tt[0-9]+}", movies.PolochonDeleteHandler).WithRole(users.AdminRole).Methods("DELETE") env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.RefreshMovieHandler).WithRole(users.UserRole).Methods("POST") @@ -27,6 +28,7 @@ func setupRoutes(env *web.Env) { // Shows routes env.Handle("/shows/polochon", shows.PolochonShowsHandler).WithRole(users.UserRole).Methods("GET") env.Handle("/shows/explore", extmedias.ExploreShows).WithRole(users.UserRole).Methods("GET") + env.Handle("/shows/explore/options", extmedias.ShowExplorerOptions).WithRole(users.UserRole).Methods("GET") env.Handle("/shows/search", shows.SearchShow).WithRole(users.UserRole).Methods("POST") env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(users.UserRole).Methods("GET") env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshShowHandler).WithRole(users.UserRole).Methods("POST")