Compare commits

..

2 Commits

Author SHA1 Message Date
8676ca4df9 Improve the way we launch the server
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2020-03-01 16:29:56 +01:00
09eb97b235 Remove unused stuff and check more errors
All checks were successful
continuous-integration/drone/push Build is passing
All the things fixed where reported by golangci-lint.
2020-03-01 16:20:06 +01:00
11 changed files with 58 additions and 34 deletions

View File

@ -43,7 +43,7 @@ func GetUsersHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error
// Fill the users with the polochons // Fill the users with the polochons
for _, u := range users { for _, u := range users {
if u.PolochonID.Valid == false { if !u.PolochonID.Valid {
continue continue
} }
u.Polochon = polochonMap[u.PolochonID.String] u.Polochon = polochonMap[u.PolochonID.String]

View File

@ -44,19 +44,19 @@ func (c *Channel) writer() {
for { for {
select { select {
case <-pingTicker.C: case <-pingTicker.C:
c.conn.SetWriteDeadline(time.Now().Add(writeWait)) _ = c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {
c.log.Warnf("error writing message: %s", err) c.log.Warnf("error writing message: %s", err)
return return
} }
case e := <-c.serverEventStream: case e := <-c.serverEventStream:
c.conn.SetWriteDeadline(time.Now().Add(writeWait)) _ = c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteJSON(e); err != nil { if err := c.conn.WriteJSON(e); err != nil {
c.log.Warnf("error writing JSON message: %s", err) c.log.Warnf("error writing JSON message: %s", err)
return return
} }
case err := <-c.serverErrorStream: case err := <-c.serverErrorStream:
c.conn.SetWriteDeadline(time.Now().Add(writeWait)) _ = c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteJSON(err); err != nil { if err := c.conn.WriteJSON(err); err != nil {
c.log.Warnf("error writing JSON error: %s", err) c.log.Warnf("error writing JSON error: %s", err)
return return
@ -71,7 +71,7 @@ func (c *Channel) writer() {
// go routine reading messages from the websocket connection // go routine reading messages from the websocket connection
func (c *Channel) reader() { func (c *Channel) reader() {
// Read loop // Read loop
c.conn.SetReadDeadline(time.Now().Add(pongWait)) _ = c.conn.SetReadDeadline(time.Now().Add(pongWait))
for { for {
msg := ClientMessage{} msg := ClientMessage{}

View File

@ -51,7 +51,7 @@ func WsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
// The pong handler only postpone the read deadline // The pong handler only postpone the read deadline
ws.SetPongHandler(func(string) error { ws.SetPongHandler(func(string) error {
ws.SetReadDeadline(time.Now().Add(pongWait)) _ = ws.SetReadDeadline(time.Now().Add(pongWait))
return nil return nil
}) })

View File

@ -101,7 +101,10 @@ func (p *PolochonEventers) Unsubscribe(chanl *Channel) {
return return
} }
tn.Unsubscribe(chanl) if err := tn.Unsubscribe(chanl); err != nil {
p.log.Errorf("failed to unsubscribe eventer: %s", err.Error())
return
}
if len(tn.Subscribers()) == 0 { if len(tn.Subscribers()) == 0 {
p.log.Debugf("empty subscribers for this polochon, delete it") p.log.Debugf("empty subscribers for this polochon, delete it")

View File

@ -21,6 +21,12 @@ import (
) )
func main() { func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "error while running the app: %s\n", err.Error())
}
}
func run() error {
var cfgPath string var cfgPath string
cfgPath = os.Getenv("CONFIG_FILE") cfgPath = os.Getenv("CONFIG_FILE")
if cfgPath == "" { if cfgPath == "" {
@ -35,13 +41,13 @@ func main() {
log := logrus.NewEntry(logger) log := logrus.NewEntry(logger)
cf, err := config.Load(cfgPath, log) cf, err := config.Load(cfgPath, log)
if err != nil { if err != nil {
log.Panic(err) return err
} }
// Connect to the database // Connect to the database
db, err := sqlx.Connect("postgres", cf.PGDSN) db, err := sqlx.Connect("postgres", cf.PGDSN)
if err != nil { if err != nil {
log.Panic(err) return err
} }
backend := &models.Backend{Database: db} backend := &models.Backend{Database: db}
@ -76,16 +82,22 @@ func main() {
if cf.PeriodicRefresh.Enabled { if cf.PeriodicRefresh.Enabled {
// Refresh the library every 6h // Refresh the library every 6h
env.Log.Debugf("Running refresh cron every %s", cf.PeriodicRefresh.Interval) env.Log.Debugf("Running refresh cron every %s", cf.PeriodicRefresh.Interval)
c.AddFunc(fmt.Sprintf("@every %s", cf.PeriodicRefresh.Interval), func() { if err := c.AddFunc(fmt.Sprintf("@every %s", cf.PeriodicRefresh.Interval), func() {
env.Log.Infof("Running refresh cron!") env.Log.Infof("Running refresh cron!")
extmedias.Refresh(env) extmedias.Refresh(env)
}) }); err != nil {
return err
}
env.Log.Debugf("Running Imdb refresh cron every 24h") env.Log.Debugf("Running Imdb refresh cron every 24h")
c.AddFunc(fmt.Sprintf("@every 24h"), func() { if err := c.AddFunc(fmt.Sprintf("@every 24h"), func() {
env.Log.Infof("Running IMDB refresh cron!") env.Log.Infof("Running IMDB refresh cron!")
ratings.Refresh(env) if err := ratings.Refresh(env); err != nil {
}) env.Log.Errorf("failed to refresh ratings: %s", err.Error())
}
}); err != nil {
return err
}
} }
// Start the cron // Start the cron
@ -106,5 +118,9 @@ func main() {
// Compress responses // Compress responses
n.Use(gzip.Gzip(gzip.DefaultCompression)) n.Use(gzip.Gzip(gzip.DefaultCompression))
n.UseHandler(env.Router) n.UseHandler(env.Router)
n.Run(":" + cf.Port)
addr := ":" + cf.Port
env.Log.Infof("listening on %s", addr)
return http.ListenAndServe(addr, n)
} }

View File

@ -7,8 +7,6 @@ import (
) )
const ( const (
getRatingQueryByImdbID = ` SELECT * FROM imdb_ratings WHERE imdb_id=$1;`
upsertRatingQuery = `INSERT INTO imdb_ratings (imdb_id, rating, votes) VALUES (:imdb_id, :rating, :votes) upsertRatingQuery = `INSERT INTO imdb_ratings (imdb_id, rating, votes) VALUES (:imdb_id, :rating, :votes)
ON CONFLICT (imdb_id) ON CONFLICT (imdb_id)
DO UPDATE DO UPDATE

View File

@ -15,7 +15,6 @@ const (
polochons (name, url, token, admin_id) polochons (name, url, token, admin_id)
VALUES ($1, $2, $3, $4) VALUES ($1, $2, $3, $4)
RETURNING id;` RETURNING id;`
getPolochonQuery = `SELECT * FROM polochons WHERE name=$1;`
getPolochonByIDQuery = `SELECT * FROM polochons WHERE id=$1;` getPolochonByIDQuery = `SELECT * FROM polochons WHERE id=$1;`
getPolochonsByUserIDQuery = `SELECT * FROM polochons WHERE admin_id=$1 ORDER BY created_at DESC;` getPolochonsByUserIDQuery = `SELECT * FROM polochons WHERE admin_id=$1 ORDER BY created_at DESC;`
updatePolochonQuery = `UPDATE polochons SET updatePolochonQuery = `UPDATE polochons SET
@ -94,7 +93,9 @@ func (p *Polochon) Update(ex *sqlx.DB) error {
return err return err
} }
for rows.Next() { for rows.Next() {
rows.StructScan(p) if err := rows.StructScan(p); err != nil {
return err
}
} }
return nil return nil
} }

View File

@ -136,7 +136,9 @@ func (u *User) Update(ex *sqlx.DB) error {
return err return err
} }
for rows.Next() { for rows.Next() {
rows.StructScan(u) if err := rows.StructScan(u); err != nil {
return err
}
} }
return nil return nil
} }

View File

@ -272,9 +272,10 @@ func GetMovieWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Reques
// Add the movie to the wishlist // Add the movie to the wishlist
for _, imdbID := range moviesWishlist.List() { for _, imdbID := range moviesWishlist.List() {
wishlist.AddMovie(&polochon.WishedMovie{ err := wishlist.AddMovie(&polochon.WishedMovie{ImdbID: imdbID})
ImdbID: imdbID, if err != nil {
}) return env.RenderError(w, err)
}
} }
} }
@ -310,11 +311,14 @@ func GetShowWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request
// Add the show to the wishlist // Add the show to the wishlist
for _, show := range moviesWishlist.List() { for _, show := range moviesWishlist.List() {
wishlist.AddShow(&polochon.WishedShow{ err := wishlist.AddShow(&polochon.WishedShow{
ImdbID: show.ImdbID, ImdbID: show.ImdbID,
Season: show.Season, Season: show.Season,
Episode: show.Episode, Episode: show.Episode,
}) })
if err != nil {
return env.RenderError(w, err)
}
} }
} }

View File

@ -12,7 +12,6 @@ import (
const ( const (
addTokenQuery = `INSERT INTO tokens (token, username, ip, description) VALUES ($1, $2, $3, $4);` addTokenQuery = `INSERT INTO tokens (token, username, ip, description) VALUES ($1, $2, $3, $4);`
getTokenQuery = `SELECT * FROM tokens WHERE token=$1;`
getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;` getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;`
getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;` getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;`
deleteTokenQuery = `DELETE FROM tokens WHERE username=$1 AND token=$2;` deleteTokenQuery = `DELETE FROM tokens WHERE username=$1 AND token=$2;`
@ -100,7 +99,9 @@ func (t *Token) Update(db *sqlx.DB) error {
return err return err
} }
for rows.Next() { for rows.Next() {
rows.StructScan(t) if err := rows.StructScan(t); err != nil {
return err
}
} }
return nil return nil
} }

View File

@ -14,14 +14,13 @@ import (
// Env describes an environement object passed to all handlers // Env describes an environement object passed to all handlers
type Env struct { type Env struct {
Backend DetailerTorrenter Backend DetailerTorrenter
Database *sqlx.DB Database *sqlx.DB
Log *logrus.Entry Log *logrus.Entry
Router *mux.Router Router *mux.Router
Render *render.Render Render *render.Render
Auth *auth.Authorizer Auth *auth.Authorizer
Config *config.Config Config *config.Config
loginRoute string
} }
// EnvParams represents parameters for NewEnv // EnvParams represents parameters for NewEnv