diff --git a/backend/admins/users.go b/backend/admins/users.go index 5fef8b7..220b442 100644 --- a/backend/admins/users.go +++ b/backend/admins/users.go @@ -5,8 +5,8 @@ import ( "fmt" "net/http" + "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/config" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" @@ -21,7 +21,7 @@ func GetUsersHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error log.Debug("Getting users") - users, err := users.GetAll(env.Database) + users, err := backend.GetAllUsers(env.Database) if err != nil { return env.RenderError(w, err) } @@ -39,7 +39,7 @@ func GenerateUserToken(env *web.Env, w http.ResponseWriter, r *http.Request) err vars := mux.Vars(r) username := vars["username"] - user, err := users.Get(env.Database, username) + user, err := backend.GetUser(env.Database, username) if err != nil { return err } @@ -79,7 +79,7 @@ func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err return env.RenderError(w, fmt.Errorf("Empty user id")) } - user, err := users.GetByID(env.Database, data.ID) + user, err := backend.GetUserByID(env.Database, data.ID) if err != nil { return err } diff --git a/backend/auth/auth.go b/backend/auth/auth.go index b1e3691..a2dc07d 100644 --- a/backend/auth/auth.go +++ b/backend/auth/auth.go @@ -6,9 +6,10 @@ import ( "strings" "time" + "git.quimbo.fr/odwrtw/canape/backend/backend" + "git.quimbo.fr/odwrtw/canape/backend/tokens" jwt "github.com/dgrijalva/jwt-go" "github.com/jmoiron/sqlx" - "git.quimbo.fr/odwrtw/canape/backend/tokens" "golang.org/x/crypto/bcrypt" ) @@ -24,20 +25,6 @@ var ( ErrUnauthenticatedUser = fmt.Errorf("Unauthenticated user") ) -// UserBackend interface for user backend -type UserBackend interface { - GetUser(username string) (User, error) -} - -// User interface for user -type User interface { - GetName() string - GetHash() string - HasRole(string) bool - IsAdmin() bool - IsActivated() bool -} - // Authorizer handle sesssion type Authorizer struct { db *sqlx.DB @@ -46,10 +33,9 @@ type Authorizer struct { // Params for Authorizer creation type Params struct { - Backend UserBackend - Pepper string - Cost int - Secret string + Pepper string + Cost int + Secret string } // New Authorizer pepper is like a salt but not stored in database, @@ -71,7 +57,7 @@ func (a *Authorizer) GenHash(password string) (string, error) { } // GenerateJWTToken generates a JWT token for a user -func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, error) { +func (a *Authorizer) GenerateJWTToken(r *http.Request, u *backend.User) (*tokens.Token, error) { // Create a jwt token jwtToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ // Not before @@ -79,7 +65,7 @@ func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, e // Issued at "iat": time.Now().Unix(), // Private claims - "username": u.GetName(), + "username": u.Name, "isAdmin": u.IsAdmin(), "isActivated": u.IsActivated(), }) @@ -92,20 +78,20 @@ func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, e return &tokens.Token{ Token: ss, - Username: u.GetName(), + Username: u.Name, IP: getIPFromRequest(r), }, nil } // Login cheks password and creates a jwt token func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.Token, error) { - u, err := a.Backend.GetUser(username) + u, err := backend.GetUser(a.db, username) if err != nil { return nil, err } // Compare the password - err = bcrypt.CompareHashAndPassword([]byte(u.GetHash()), []byte(password+a.Pepper)) + err = bcrypt.CompareHashAndPassword([]byte(u.Hash), []byte(password+a.Pepper)) if err != nil { return nil, ErrInvalidPassword } @@ -123,7 +109,7 @@ func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens. } // CurrentUser returns the logged in username from session and verifies the token -func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (User, error) { +func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (*backend.User, error) { var tokenStr string h := req.Header.Get("Authorization") if h != "" { @@ -165,13 +151,13 @@ func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (Use } // Get the user - u, err := a.Backend.GetUser(tokenClaims.Username) + u, err := backend.GetUser(a.db, tokenClaims.Username) if err != nil { return nil, err } // Check the token in database - token, err := tokens.GetUserToken(a.db, u.GetName(), tokenStr) + token, err := tokens.GetUserToken(a.db, u.Name, tokenStr) if err != nil { return nil, ErrInvalidToken } diff --git a/backend/auth/middleware.go b/backend/auth/middleware.go index a3e8469..05e7254 100644 --- a/backend/auth/middleware.go +++ b/backend/auth/middleware.go @@ -5,6 +5,7 @@ import ( "net" "net/http" + "git.quimbo.fr/odwrtw/canape/backend/backend" "github.com/sirupsen/logrus" ) @@ -29,7 +30,7 @@ func (m *Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http user, err := m.authorizer.CurrentUser(w, r) switch err { case nil: - m.log.Debugf("setting user %s in the context", user.GetName()) + m.log.Debugf("setting user %s in the context", user.Name) ctxKey := authContextKey("auth.user") ctx := context.WithValue(r.Context(), ctxKey, user) r = r.WithContext(ctx) @@ -89,7 +90,7 @@ func (m *MiddlewareRole) ServeHTTP(w http.ResponseWriter, r *http.Request, next } // GetCurrentUser gets the current user from the request context -func GetCurrentUser(r *http.Request, log *logrus.Entry) User { +func GetCurrentUser(r *http.Request, log *logrus.Entry) *backend.User { log.Debug("getting user from context") ctxKey := authContextKey("auth.user") @@ -97,7 +98,7 @@ func GetCurrentUser(r *http.Request, log *logrus.Entry) User { if u == nil { return nil } - user, ok := u.(User) + user, ok := u.(*backend.User) if !ok { panic("invalid user type") } diff --git a/backend/backend/backend.go b/backend/backend/backend.go index 02441e5..f45871f 100644 --- a/backend/backend/backend.go +++ b/backend/backend/backend.go @@ -1,9 +1,6 @@ package backend import ( - "git.quimbo.fr/odwrtw/canape/backend/auth" - "git.quimbo.fr/odwrtw/canape/backend/users" - "github.com/jmoiron/sqlx" polochon "github.com/odwrtw/polochon/lib" ) @@ -29,9 +26,3 @@ func (b *Backend) Init([]byte) error { func (b *Backend) Status() (polochon.ModuleStatus, error) { return polochon.StatusOK, nil } - -// GetUser gets the username from the UserBackend -// Implements the UserBackend interface -func (b *Backend) GetUser(username string) (auth.User, error) { - return users.Get(b.Database, username) -} diff --git a/backend/users/users.go b/backend/backend/users.go similarity index 91% rename from backend/users/users.go rename to backend/backend/users.go index c077c33..be0682b 100644 --- a/backend/users/users.go +++ b/backend/backend/users.go @@ -1,4 +1,4 @@ -package users +package backend import ( "database/sql" @@ -6,12 +6,11 @@ import ( "errors" "fmt" + "git.quimbo.fr/odwrtw/canape/backend/config" + "git.quimbo.fr/odwrtw/canape/backend/sqly" "github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx/types" "github.com/odwrtw/papi" - - "git.quimbo.fr/odwrtw/canape/backend/config" - "git.quimbo.fr/odwrtw/canape/backend/sqly" ) const ( @@ -125,8 +124,8 @@ func (u *User) NewPapiClient() (*papi.Client, error) { return client, nil } -// Get returns user with specified name -func Get(q sqlx.Queryer, name string) (*User, error) { +// GetUser returns user with specified name +func GetUser(q sqlx.Queryer, name string) (*User, error) { u := &User{} err := q.QueryRowx(getUserQuery, name).StructScan(u) if err != nil { @@ -138,8 +137,8 @@ func Get(q sqlx.Queryer, name string) (*User, error) { return u, nil } -// GetByID returns user using its id -func GetByID(q sqlx.Queryer, id string) (*User, error) { +// GetUserByID returns user using its id +func GetUserByID(q sqlx.Queryer, id string) (*User, error) { u := &User{} err := q.QueryRowx(getUserByIDQuery, id).StructScan(u) if err != nil { @@ -151,8 +150,8 @@ func GetByID(q sqlx.Queryer, id string) (*User, error) { return u, nil } -// GetAll returns all the users -func GetAll(db *sqlx.DB) ([]*User, error) { +// GetAllUsers returns all the users +func GetAllUsers(db *sqlx.DB) ([]*User, error) { users := []*User{} err := db.Select(&users, getAllUsersQuery) if err != nil { @@ -203,16 +202,6 @@ func (u *User) Delete(ex *sqlx.DB) error { return nil } -// GetHash implements auth.User interface -func (u *User) GetHash() string { - return u.Hash -} - -// GetName implements auth.User interface -func (u *User) GetName() string { - return u.Name -} - // HasRole checks if a user as a role func (u *User) HasRole(role string) bool { if role == AdminRole && !u.Admin { diff --git a/backend/events/handlers.go b/backend/events/handlers.go index 7ef55fb..a982ed6 100644 --- a/backend/events/handlers.go +++ b/backend/events/handlers.go @@ -1,12 +1,10 @@ package events import ( - "errors" "net/http" "time" "git.quimbo.fr/odwrtw/canape/backend/auth" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/websocket" ) @@ -23,11 +21,7 @@ const ( // WsHandler handles the websockets messages func WsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) upgrader := websocket.Upgrader{ ReadBufferSize: 1024, diff --git a/backend/events/torrents.go b/backend/events/torrents.go index c037cb1..77e70c1 100644 --- a/backend/events/torrents.go +++ b/backend/events/torrents.go @@ -4,7 +4,7 @@ import ( "reflect" "time" - "git.quimbo.fr/odwrtw/canape/backend/users" + "git.quimbo.fr/odwrtw/canape/backend/backend" "github.com/odwrtw/papi" "github.com/sirupsen/logrus" ) @@ -12,7 +12,7 @@ import ( // TorrentNotifier is a struct implementing the Notifier interface type TorrentNotifier struct { *Notifier - user *users.User + user *backend.User client *papi.Client torrents []papi.Torrent log *logrus.Entry diff --git a/backend/external_medias/handlers.go b/backend/external_medias/handlers.go index b15727b..a1fd3f8 100644 --- a/backend/external_medias/handlers.go +++ b/backend/external_medias/handlers.go @@ -1,14 +1,12 @@ package extmedias import ( - "errors" "net/http" "git.quimbo.fr/odwrtw/canape/backend/auth" "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/movies" "git.quimbo.fr/odwrtw/canape/backend/shows" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" polochon "github.com/odwrtw/polochon/lib" "github.com/sirupsen/logrus" @@ -48,7 +46,7 @@ func RefreshShowsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e } // GetMovies get some movies -func GetMovies(env *web.Env, user *users.User, source string, category string) ([]*movies.Movie, error) { +func GetMovies(env *web.Env, user *backend.User, source string, category string) ([]*movies.Movie, error) { log := env.Log.WithFields(logrus.Fields{ "source": source, "category": category, @@ -107,7 +105,7 @@ func GetMovies(env *web.Env, user *users.User, source string, category string) ( } // GetShows get some shows -func GetShows(env *web.Env, user *users.User, source string, category string, force bool) ([]*shows.Show, error) { +func GetShows(env *web.Env, user *backend.User, source string, category string, force bool) ([]*shows.Show, error) { log := env.Log.WithFields(logrus.Fields{ "source": source, "category": category, @@ -178,11 +176,7 @@ func ExploreMovies(env *web.Env, w http.ResponseWriter, r *http.Request) error { category = "popular" } - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the medias without trying to refresh them movies, err := GetMovies(env, user, source, category) @@ -212,11 +206,7 @@ func ExploreShows(env *web.Env, w http.ResponseWriter, r *http.Request) error { category = "rating" } - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the medias without trying to refresh them shows, err := GetShows(env, user, source, category, false) diff --git a/backend/main.go b/backend/main.go index 33ab3a7..529c462 100644 --- a/backend/main.go +++ b/backend/main.go @@ -47,10 +47,9 @@ func main() { // Generate auth params authParams := auth.Params{ - Backend: backend, - Pepper: cf.Authorizer.Pepper, - Cost: cf.Authorizer.Cost, - Secret: cf.Authorizer.Secret, + Pepper: cf.Authorizer.Pepper, + Cost: cf.Authorizer.Cost, + Secret: cf.Authorizer.Secret, } authorizer := auth.New(db, authParams) diff --git a/backend/movies/handlers.go b/backend/movies/handlers.go index 465e8f4..1dbf08f 100644 --- a/backend/movies/handlers.go +++ b/backend/movies/handlers.go @@ -1,7 +1,6 @@ package movies import ( - "errors" "fmt" "log" "net/http" @@ -10,7 +9,6 @@ import ( "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/config" "git.quimbo.fr/odwrtw/canape/backend/subtitles" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" "github.com/odwrtw/papi" @@ -21,11 +19,7 @@ import ( // PolochonMoviesHandler will returns movies from Polochon func PolochonMoviesHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { // Get the user from the request - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the polochon movies of the user movies, err := getPolochonMovies(user, env) @@ -69,11 +63,7 @@ func RefreshMovieHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e id := vars["id"] // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -114,11 +104,7 @@ func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) search := vars["search"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user")) - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -200,11 +186,7 @@ func PolochonDeleteHandler(env *web.Env, w http.ResponseWriter, r *http.Request) log.Debugf("deleting movie") // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -221,11 +203,7 @@ func AddToWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) id := vars["id"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) if err := backend.AddMovieToWishlist(env.Database, user.ID, id); err != nil { return env.RenderError(w, err) @@ -239,11 +217,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er vars := mux.Vars(r) id := vars["id"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) if err := backend.DeleteMovieFromWishlist(env.Database, user.ID, id); err != nil { return env.RenderError(w, err) @@ -254,11 +228,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er // GetWishlistHandler returns the wishlisted movies of a user func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -320,11 +290,7 @@ func RefreshMovieSubtitlesHandler(env *web.Env, w http.ResponseWriter, r *http.R id := vars["id"] // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -358,11 +324,7 @@ func DownloadVVTSubtitle(env *web.Env, w http.ResponseWriter, r *http.Request) e lang := vars["lang"] // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() diff --git a/backend/movies/movies.go b/backend/movies/movies.go index 5639c85..8ff09b9 100644 --- a/backend/movies/movies.go +++ b/backend/movies/movies.go @@ -10,7 +10,6 @@ import ( "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/subtitles" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/odwrtw/papi" polochon "github.com/odwrtw/polochon/lib" @@ -251,7 +250,7 @@ func (m *Movie) PosterURL() string { } // getPolochonMovies returns an array of the user's polochon movies -func getPolochonMovies(user *users.User, env *web.Env) ([]*Movie, error) { +func getPolochonMovies(user *backend.User, env *web.Env) ([]*Movie, error) { movies := []*Movie{} // Create a papi client diff --git a/backend/polochons/handlers.go b/backend/polochons/handlers.go index 9a93b79..449acdc 100644 --- a/backend/polochons/handlers.go +++ b/backend/polochons/handlers.go @@ -6,7 +6,7 @@ import ( "net/http" "git.quimbo.fr/odwrtw/canape/backend/auth" - "git.quimbo.fr/odwrtw/canape/backend/users" + "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" "github.com/sirupsen/logrus" @@ -49,11 +49,7 @@ func GetPolochonsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e "function": "polochons.GetPolochonsHandler", }) - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) log.Debug("Getting polochons") @@ -63,7 +59,7 @@ func GetPolochonsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e } for _, p := range polochons { - users, err := users.GetPolochonUsers(env.Database, p.ID) + users, err := backend.GetPolochonUsers(env.Database, p.ID) if err != nil { return env.RenderError(w, err) } @@ -79,11 +75,7 @@ func NewPolochonHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er "function": "polochons.NewPolochonHandler", }) - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) var data struct { Name string `json:"name"` @@ -127,11 +119,7 @@ func EditPolochonHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e }) log.Debugf("editing polochon ...") - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the polochon vars := mux.Vars(r) @@ -199,11 +187,7 @@ func PolochonActivateUser(env *web.Env, w http.ResponseWriter, r *http.Request, }) log.Debugf("editing polochon users ...") - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the polochon vars := mux.Vars(r) @@ -220,7 +204,7 @@ func PolochonActivateUser(env *web.Env, w http.ResponseWriter, r *http.Request, // Get the user userID := vars["user_id"] - u, err := users.GetByID(env.Database, userID) + u, err := backend.GetUserByID(env.Database, userID) if err != nil { return env.RenderError(w, err) } diff --git a/backend/routes.go b/backend/routes.go index ad086cc..70f7d19 100644 --- a/backend/routes.go +++ b/backend/routes.go @@ -2,6 +2,7 @@ package main import ( admin "git.quimbo.fr/odwrtw/canape/backend/admins" + "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/events" extmedias "git.quimbo.fr/odwrtw/canape/backend/external_medias" "git.quimbo.fr/odwrtw/canape/backend/movies" @@ -17,72 +18,72 @@ func setupRoutes(env *web.Env) { // User's route env.Handle("/users/login", users.LoginPOSTHandler).Methods("POST") env.Handle("/users/signup", users.SignupPOSTHandler).Methods("POST") - env.Handle("/users/details", users.DetailsHandler).WithRole(users.UserRole).Methods("GET") - env.Handle("/users/edit", users.EditHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/users/tokens", users.GetTokensHandler).WithRole(users.UserRole).Methods("GET") - env.Handle("/users/tokens/{token}", users.EditTokenHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/users/tokens/{token}", users.DeleteTokenHandler).WithRole(users.UserRole).Methods("DELETE") - env.Handle("/users/modules/status", users.GetModulesStatus).WithRole(users.UserRole).Methods("GET") - env.Handle("/users/polochons", polochons.GetPolochonsHandler).WithRole(users.UserRole).Methods("GET") + env.Handle("/users/details", users.DetailsHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/users/edit", users.EditHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/users/tokens", users.GetTokensHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/users/tokens/{token}", users.EditTokenHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/users/tokens/{token}", users.DeleteTokenHandler).WithRole(backend.UserRole).Methods("DELETE") + env.Handle("/users/modules/status", users.GetModulesStatus).WithRole(backend.UserRole).Methods("GET") + env.Handle("/users/polochons", polochons.GetPolochonsHandler).WithRole(backend.UserRole).Methods("GET") // Polochon's route env.Handle("/polochons", polochons.GetPublicPolochonsHandler).Methods("GET") - env.Handle("/polochons", polochons.NewPolochonHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/polochons/{id}", polochons.EditPolochonHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonActivateUserHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonDeactivateUserHandler).WithRole(users.UserRole).Methods("DELETE") + env.Handle("/polochons", polochons.NewPolochonHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/polochons/{id}", polochons.EditPolochonHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonActivateUserHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonDeactivateUserHandler).WithRole(backend.UserRole).Methods("DELETE") // 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/{search}", movies.SearchMovie).WithRole(users.UserRole).Methods("GET") - env.Handle("/movies/{id:tt[0-9]+}", movies.PolochonDeleteHandler).WithRole(users.UserRole).Methods("DELETE") - env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.RefreshMovieHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/movies/{id:tt[0-9]+}/subtitles/{lang}", movies.DownloadVVTSubtitle).WithRole(users.UserRole).Methods("GET") - env.Handle("/movies/{id:tt[0-9]+}/subtitles/refresh", movies.RefreshMovieSubtitlesHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/movies/refresh", extmedias.RefreshMoviesHandler).WithRole(users.AdminRole).Methods("POST") + env.Handle("/movies/polochon", movies.PolochonMoviesHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/movies/explore", extmedias.ExploreMovies).WithRole(backend.UserRole).Methods("GET") + env.Handle("/movies/explore/options", extmedias.MovieExplorerOptions).WithRole(backend.UserRole).Methods("GET") + env.Handle("/movies/search/{search}", movies.SearchMovie).WithRole(backend.UserRole).Methods("GET") + env.Handle("/movies/{id:tt[0-9]+}", movies.PolochonDeleteHandler).WithRole(backend.UserRole).Methods("DELETE") + env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.RefreshMovieHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/movies/{id:tt[0-9]+}/subtitles/{lang}", movies.DownloadVVTSubtitle).WithRole(backend.UserRole).Methods("GET") + env.Handle("/movies/{id:tt[0-9]+}/subtitles/refresh", movies.RefreshMovieSubtitlesHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/movies/refresh", extmedias.RefreshMoviesHandler).WithRole(backend.AdminRole).Methods("POST") // 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/{search}", shows.SearchShow).WithRole(users.UserRole).Methods("GET") - 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") - env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}", shows.RefreshEpisodeHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/refresh", shows.RefreshEpisodeSubtitlesHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/{lang}", shows.DownloadVVTSubtitle).WithRole(users.UserRole).Methods("GET") - env.Handle("/shows/refresh", extmedias.RefreshShowsHandler).WithRole(users.AdminRole).Methods("POST") + env.Handle("/shows/polochon", shows.PolochonShowsHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/explore", extmedias.ExploreShows).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/explore/options", extmedias.ShowExplorerOptions).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/search/{search}", shows.SearchShow).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshShowHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}", shows.RefreshEpisodeHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/refresh", shows.RefreshEpisodeSubtitlesHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/{lang}", shows.DownloadVVTSubtitle).WithRole(backend.UserRole).Methods("GET") + env.Handle("/shows/refresh", extmedias.RefreshShowsHandler).WithRole(backend.AdminRole).Methods("POST") - env.Handle("/ratings/refresh", ratings.RefreshHandler).WithRole(users.AdminRole).Methods("POST") + env.Handle("/ratings/refresh", ratings.RefreshHandler).WithRole(backend.AdminRole).Methods("POST") // Wishlist routes for shows - env.Handle("/wishlist/shows", shows.GetWishlistHandler).WithRole(users.UserRole).Methods("GET") - env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.AddToWishlist).WithRole(users.UserRole).Methods("POST") - env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.DeleteFromWishlist).WithRole(users.UserRole).Methods("DELETE") + env.Handle("/wishlist/shows", shows.GetWishlistHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.AddToWishlist).WithRole(backend.UserRole).Methods("POST") + env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.DeleteFromWishlist).WithRole(backend.UserRole).Methods("DELETE") // Wishlist routes for movies - env.Handle("/wishlist/movies", movies.GetWishlistHandler).WithRole(users.UserRole).Methods("GET") - env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.AddToWishlist).WithRole(users.UserRole).Methods("POST") - env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.DeleteFromWishlist).WithRole(users.UserRole).Methods("DELETE") + env.Handle("/wishlist/movies", movies.GetWishlistHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.AddToWishlist).WithRole(backend.UserRole).Methods("POST") + env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.DeleteFromWishlist).WithRole(backend.UserRole).Methods("DELETE") // Torrents routes - env.Handle("/torrents", torrents.DownloadHandler).WithRole(users.UserRole).Methods("POST") - env.Handle("/torrents", torrents.ListHandler).WithRole(users.UserRole).Methods("GET") - env.Handle("/torrents/{id}", torrents.RemoveHandler).WithRole(users.UserRole).Methods("DELETE") - env.Handle("/torrents/search/{type}/{search}", torrents.SearchHandler).WithRole(users.UserRole).Methods("GET") + env.Handle("/torrents", torrents.DownloadHandler).WithRole(backend.UserRole).Methods("POST") + env.Handle("/torrents", torrents.ListHandler).WithRole(backend.UserRole).Methods("GET") + env.Handle("/torrents/{id}", torrents.RemoveHandler).WithRole(backend.UserRole).Methods("DELETE") + env.Handle("/torrents/search/{type}/{search}", torrents.SearchHandler).WithRole(backend.UserRole).Methods("GET") // Route to refresh all movies and shows - env.Handle("/refresh", extmedias.RefreshHandler).WithRole(users.AdminRole).Methods("POST") + env.Handle("/refresh", extmedias.RefreshHandler).WithRole(backend.AdminRole).Methods("POST") // Route to handle websocket events - env.Handle("/events", events.WsHandler).WithRole(users.UserRole).Methods("GET") + env.Handle("/events", events.WsHandler).WithRole(backend.UserRole).Methods("GET") // Admin routes - env.Handle("/admins/users", admin.GetUsersHandler).WithRole(users.AdminRole).Methods("GET") - env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(users.AdminRole).Methods("POST") - env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(users.AdminRole).Methods("GET") - env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(users.AdminRole).Methods("POST") - env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(users.AdminRole).Methods("GET") + env.Handle("/admins/users", admin.GetUsersHandler).WithRole(backend.AdminRole).Methods("GET") + env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(backend.AdminRole).Methods("POST") + env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(backend.AdminRole).Methods("GET") + env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(backend.AdminRole).Methods("POST") + env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(backend.AdminRole).Methods("GET") } diff --git a/backend/shows/handlers.go b/backend/shows/handlers.go index 093486e..16474bf 100644 --- a/backend/shows/handlers.go +++ b/backend/shows/handlers.go @@ -12,7 +12,6 @@ import ( "git.quimbo.fr/odwrtw/canape/backend/auth" "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/subtitles" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" "github.com/odwrtw/papi" @@ -27,11 +26,7 @@ func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err vars := mux.Vars(r) id := vars["id"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -77,11 +72,7 @@ func RefreshShowHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er vars := mux.Vars(r) id := vars["id"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -126,11 +117,7 @@ func SearchShow(env *web.Env, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) search := vars["search"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) var shows []*polochon.Show searchers := env.Config.Show.Searchers @@ -200,11 +187,7 @@ func AddToWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error { } } - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) if err := backend.AddShowToWishlist(env.Database, user.ID, id, data.Season, data.Episode); err != nil { env.Log.Warnf("Error while adding to db : %s", err) @@ -219,11 +202,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er vars := mux.Vars(r) id := vars["id"] - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) if err := backend.DeleteShowFromWishlist(env.Database, user.ID, id); err != nil { env.Log.Warnf("Error while deleting to db : %s", err) @@ -235,11 +214,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er // GetWishlistHandler returns the tracked shows of a user func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -279,11 +254,7 @@ func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er // PolochonShowsHandler will returns shows from Polochon func PolochonShowsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the polochon's shows shows, err := getPolochonShows(env, user) @@ -317,11 +288,7 @@ func RefreshEpisodeHandler(env *web.Env, w http.ResponseWriter, r *http.Request) season, _ := strconv.Atoi(vars["season"]) episode, _ := strconv.Atoi(vars["episode"]) - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -367,11 +334,7 @@ func RefreshEpisodeSubtitlesHandler(env *web.Env, w http.ResponseWriter, r *http episode, _ := strconv.Atoi(vars["episode"]) // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() @@ -412,11 +375,7 @@ func DownloadVVTSubtitle(env *web.Env, w http.ResponseWriter, r *http.Request) e episode, _ := strconv.Atoi(vars["episode"]) // Get the user - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, env.Log) // Create a new papi client client, err := user.NewPapiClient() diff --git a/backend/shows/shows.go b/backend/shows/shows.go index 5de72ec..c90962a 100644 --- a/backend/shows/shows.go +++ b/backend/shows/shows.go @@ -8,7 +8,6 @@ import ( "strings" "git.quimbo.fr/odwrtw/canape/backend/backend" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/odwrtw/papi" polochon "github.com/odwrtw/polochon/lib" @@ -198,7 +197,7 @@ func (s *Show) imgFile(imgType string) string { } // getPolochonShows returns all the Shows from the polochon of a user -func getPolochonShows(env *web.Env, user *users.User) ([]*Show, error) { +func getPolochonShows(env *web.Env, user *backend.User) ([]*Show, error) { shows := []*Show{} client, err := user.NewPapiClient() diff --git a/backend/torrents/handlers.go b/backend/torrents/handlers.go index d2bc262..3427c33 100644 --- a/backend/torrents/handlers.go +++ b/backend/torrents/handlers.go @@ -7,7 +7,6 @@ import ( "sort" "git.quimbo.fr/odwrtw/canape/backend/auth" - "git.quimbo.fr/odwrtw/canape/backend/users" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" polochon "github.com/odwrtw/polochon/lib" @@ -28,11 +27,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error return env.RenderError(w, errors.New("no given url")) } - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -49,11 +44,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error // ListHandler lists torrents of a polochon func ListHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient() if err != nil { @@ -70,11 +61,7 @@ func ListHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { // RemoveHandler removes a torrents via polochon func RemoveHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, env.Log) - user, ok := v.(*users.User) - if !ok { - return env.RenderError(w, errors.New("invalid user type")) - } + user := auth.GetCurrentUser(r, env.Log) // Get the torrent ID from the URL vars := mux.Vars(r) diff --git a/backend/users/handlers.go b/backend/users/handlers.go index 9c77489..a878c05 100644 --- a/backend/users/handlers.go +++ b/backend/users/handlers.go @@ -7,6 +7,7 @@ import ( "net/http" "git.quimbo.fr/odwrtw/canape/backend/auth" + "git.quimbo.fr/odwrtw/canape/backend/backend" "git.quimbo.fr/odwrtw/canape/backend/config" "git.quimbo.fr/odwrtw/canape/backend/tokens" "git.quimbo.fr/odwrtw/canape/backend/web" @@ -37,7 +38,7 @@ func SignupPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error return e.RenderError(w, fmt.Errorf("Passwords missmatch")) } - user := User{Name: data.Username} + user := backend.User{Name: data.Username} var err error user.Hash, err = e.Auth.GenHash(data.Password) @@ -71,7 +72,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error token, err := e.Auth.Login(r, data.Username, data.Password) if err != nil { - if err == auth.ErrInvalidPassword || err == ErrUnknownUser { + if err == auth.ErrInvalidPassword || err == backend.ErrUnknownUser { return e.RenderError(w, fmt.Errorf("Error invalid user or password")) } return err @@ -91,11 +92,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error // DetailsHandler show user details func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, e.Log) var polochonConfig config.UserPolochon if user.PolochonID.Valid && user.PolochonID.String != "" { @@ -115,11 +112,7 @@ func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { // EditHandler allow editing user info and configuration func EditHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, e.Log) var data struct { PolochonID string `json:"polochon_id"` @@ -169,11 +162,7 @@ func EditHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { // GetTokensHandler lists the tokens of a user func GetTokensHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, e.Log) tokens, err := tokens.GetUserTokens(e.Database, user.Name) if err != nil { @@ -188,11 +177,7 @@ func DeleteTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) erro vars := mux.Vars(r) token := vars["token"] - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, e.Log) if err := tokens.DeleteToken(e.Database, user.Name, token); err != nil { return err @@ -206,11 +191,7 @@ func EditTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error vars := mux.Vars(r) token := vars["token"] - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return fmt.Errorf("invalid user type") - } + user := auth.GetCurrentUser(r, e.Log) t, err := tokens.GetUserToken(e.Database, user.Name, token) if err != nil { @@ -235,11 +216,7 @@ func EditTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error // GetModulesStatus returns the status of the modules func GetModulesStatus(e *web.Env, w http.ResponseWriter, r *http.Request) error { // Get the user from the request - v := auth.GetCurrentUser(r, e.Log) - user, ok := v.(*User) - if !ok { - return e.RenderError(w, fmt.Errorf("invalid user type")) - } + user := auth.GetCurrentUser(r, e.Log) // Create a papi client client, err := user.NewPapiClient()