Compare commits

..

2 Commits

Author SHA1 Message Date
cb6618e9f1 Add the user's last seen date in the admin panel
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2020-04-16 17:56:22 +02:00
7f91b145eb Cleanup the PublicDir / ImgURLPrefix stuff 2020-04-16 16:47:21 +02:00
9 changed files with 45 additions and 47 deletions

View File

@ -130,7 +130,7 @@ func RefreshShows(env *web.Env) {
// Iterate over the map of shows to refresh them
for id := range showMap {
show := shows.New(id, env.Config.PublicDir, env.Config.ImgURLPrefix)
show := shows.New(id)
// Refresh the shows
err := show.Refresh(env, env.Config.Show.Detailers)
if err != nil {
@ -196,7 +196,7 @@ func RefreshMovies(env *web.Env) {
// Iterate over the map of movies to refresh them
for id := range movieMap {
movie := movies.New(env, id, nil, nil, false)
movie := movies.New(id, nil, nil, false)
// Refresh the movie
err := movie.Refresh(env, env.Config.Movie.Detailers)
if err != nil {

View File

@ -80,7 +80,7 @@ func GetMovies(env *web.Env, user *models.User, source string, category string)
// Fill all the movies infos from the list of IDs
for _, id := range media.IDs {
pMovie, _ := pMovies.Has(id)
movie := movies.New(env, id, client, pMovie, moviesWishlist.IsMovieInWishlist(id))
movie := movies.New(id, client, pMovie, moviesWishlist.IsMovieInWishlist(id))
// First check in the DB
before := []polochon.Detailer{env.Backend.Detailer}
// Then with the default detailers
@ -141,7 +141,7 @@ func GetShows(env *web.Env, user *models.User, source string, category string, f
for _, id := range media.IDs {
pShow, _ := pShows.Has(id)
wShow, _ := wShows.IsShowInWishlist(id)
show := shows.NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
show := shows.NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow)
// First check in the DB
before := []polochon.Detailer{env.Backend.Detailer}

View File

@ -4,6 +4,7 @@ import (
"database/sql"
"errors"
"fmt"
"time"
"github.com/jmoiron/sqlx"
"github.com/jmoiron/sqlx/types"
@ -25,7 +26,16 @@ const (
RETURNING *;`
deleteUserQuery = `DELETE FROM users WHERE id=:id;`
getAllUsersQuery = `SELECT * FROM users order by created_at;`
getAllUsersQuery = `
SELECT u.*, tok.last_seen
FROM users u
LEFT OUTER JOIN (
SELECT username, MAX(last_used) AS last_seen
FROM tokens GROUP BY username
) AS tok
ON u.name = tok.username
ORDER by u.created_at;
`
getPolochonUsersQuery = `SELECT * FROM users WHERE polochon_id = $1;`
)
@ -51,6 +61,7 @@ type User struct {
PolochonID sql.NullString `json:"polochon_id" db:"polochon_id"`
PolochonActivated bool `json:"polochon_activated" db:"polochon_activated"`
Polochon *Polochon `json:"polochon"`
LastSeen *time.Time `json:"last_seen" db:"last_seen"`
}
// NewPapiClient creates a new papi client for the given user

View File

@ -76,7 +76,7 @@ func RefreshMovieHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
}
// Create a new movie
m := New(env, id, client, pMovie, isWishlisted)
m := New(id, client, pMovie, isWishlisted)
// Refresh the movie's infos
if err := m.Refresh(env, env.Config.Movie.Detailers); err != nil {
@ -141,7 +141,6 @@ func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error {
for _, m := range movies {
pMovie, _ := pMovies.Has(m.ImdbID)
movie := New(
env,
m.ImdbID,
client,
pMovie,
@ -251,7 +250,6 @@ func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
for _, imdbID := range moviesWishlist.List() {
pMovie, _ := pMovies.Has(imdbID)
movie := New(
env,
imdbID,
client,
pMovie,

View File

@ -19,11 +19,9 @@ import (
// Movie represents a movie
type Movie struct {
*polochon.Movie
client *papi.Client
pMovie *papi.Movie
publicDir string
imgURLPrefix string
Wishlisted bool `json:"wishlisted"`
client *papi.Client
pMovie *papi.Movie
Wishlisted bool `json:"wishlisted"`
}
// MarshalJSON implements the Marshal interface
@ -74,13 +72,11 @@ func (m *Movie) MarshalJSON() ([]byte, error) {
}
// New returns a new Movie with all the needed infos
func New(env *web.Env, imdbID string, client *papi.Client, pMovie *papi.Movie, isWishlisted bool) *Movie {
func New(imdbID string, client *papi.Client, pMovie *papi.Movie, isWishlisted bool) *Movie {
return &Movie{
client: client,
pMovie: pMovie,
publicDir: env.Config.PublicDir,
imgURLPrefix: env.Config.ImgURLPrefix,
Wishlisted: isWishlisted,
client: client,
pMovie: pMovie,
Wishlisted: isWishlisted,
Movie: &polochon.Movie{
ImdbID: imdbID,
},
@ -241,7 +237,7 @@ func (m *Movie) imgURL() string {
// imgFile returns the image location on disk
func (m *Movie) imgFile() string {
return filepath.Join(m.publicDir, "img", m.imgURL())
return filepath.Join(models.PublicDir, "img", m.imgURL())
}
// getPolochonMovies returns an array of the user's polochon movies
@ -269,7 +265,6 @@ func getPolochonMovies(user *models.User, env *web.Env) ([]*Movie, error) {
// Create Movies objects from the movies retrieved
for _, pmovie := range pmovies.List() {
movie := New(
env,
pmovie.ImdbID,
client,
pmovie,

View File

@ -43,7 +43,7 @@ func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err
log.Println("Got error getting wishlisted show ", err)
}
s := NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
s := NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow)
// First try from the db
first := []polochon.Detailer{env.Backend.Detailer}
// Then try from the polochon detailers
@ -89,7 +89,7 @@ func RefreshShowHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
log.Println("Got error getting wishlisted show ", err)
}
s := NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
s := NewWithClient(&polochon.Show{ImdbID: id}, client, pShow, wShow)
// Refresh the polochon detailers
detailers := env.Config.Show.Detailers
err = s.Refresh(env, detailers)
@ -163,7 +163,7 @@ func SearchShow(env *web.Env, w http.ResponseWriter, r *http.Request) error {
for _, s := range shows {
pShow, _ := pShows.Has(s.ImdbID)
wShow, _ := wShows.IsShowInWishlist(s.ImdbID)
show := NewWithClient(s, client, pShow, wShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
show := NewWithClient(s, client, pShow, wShow)
// First try from the db
first := []polochon.Detailer{env.Backend.Detailer}
@ -243,7 +243,7 @@ func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
for _, wishedShow := range wShows.List() {
pShow, _ := pShows.Has(wishedShow.ImdbID)
poloShow := &polochon.Show{ImdbID: wishedShow.ImdbID}
show := NewWithClient(poloShow, client, pShow, wishedShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
show := NewWithClient(poloShow, client, pShow, wishedShow)
// First check in the DB
before := []polochon.Detailer{env.Backend.Detailer}
@ -309,11 +309,9 @@ func RefreshEpisodeHandler(env *web.Env, w http.ResponseWriter, r *http.Request)
}
s := &Show{
Show: &polochon.Show{ImdbID: id},
client: client,
pShow: pShow,
publicDir: env.Config.PublicDir,
imgURLPrefix: env.Config.ImgURLPrefix,
Show: &polochon.Show{ImdbID: id},
client: client,
pShow: pShow,
}
e := NewEpisode(s, season, episode)

View File

@ -22,8 +22,6 @@ type Show struct {
*polochon.Show
TrackedSeason *int `json:"tracked_season"`
TrackedEpisode *int `json:"tracked_episode"`
publicDir string
imgURLPrefix string
}
// MarshalJSON implements the Marshal interface
@ -55,24 +53,20 @@ func (s *Show) MarshalJSON() ([]byte, error) {
}
// New returns a new Show with a polochon ShowConfig
func New(imdbID string, publicDir, imgURLPrefix string) *Show {
func New(imdbID string) *Show {
return &Show{
Show: &polochon.Show{
ImdbID: imdbID,
},
publicDir: publicDir,
imgURLPrefix: imgURLPrefix,
}
}
// NewWithClient returns a new Show with a polochon ShowConfig
func NewWithClient(show *polochon.Show, client *papi.Client, pShow *papi.Show, wShow *models.WishedShow, publicDir, imgURLPrefix string) *Show {
func NewWithClient(show *polochon.Show, client *papi.Client, pShow *papi.Show, wShow *models.WishedShow) *Show {
s := &Show{
Show: show,
client: client,
pShow: pShow,
publicDir: publicDir,
imgURLPrefix: imgURLPrefix,
Show: show,
client: client,
pShow: pShow,
}
if wShow != nil {
s.TrackedSeason = &wShow.Season
@ -155,7 +149,7 @@ func (s *Show) GetImageURL(imgType string) string {
if _, err := os.Stat(s.imgFile(imgType)); os.IsNotExist(err) {
return ""
}
return s.imgURLPrefix + s.imgURL(imgType)
return models.ImgURLPrefix + s.imgURL(imgType)
}
// downloadImages will download the show images
@ -217,12 +211,12 @@ func (s *Show) imgURL(imgType string) string {
// imgDirectory returns the directory containing all the show images
func (s *Show) imgDirectory() string {
return filepath.Join(s.publicDir, "img", fmt.Sprintf("shows/%s", s.ImdbID))
return filepath.Join(models.PublicDir, "img", fmt.Sprintf("shows/%s", s.ImdbID))
}
// imgFile returns the image location on disk
func (s *Show) imgFile(imgType string) string {
return filepath.Join(s.publicDir, "img", s.imgURL(imgType))
return filepath.Join(models.PublicDir, "img", s.imgURL(imgType))
}
// getPolochonShows returns all the Shows from the polochon of a user
@ -248,7 +242,7 @@ func getPolochonShows(env *web.Env, user *models.User) ([]*Show, error) {
// Create Shows objects from the shows retrieved
for _, pShow := range pshows.List() {
wShow, _ := wShows.IsShowInWishlist(pShow.ImdbID)
show := NewWithClient(&polochon.Show{ImdbID: pShow.ImdbID}, client, pShow, wShow, env.Config.PublicDir, env.Config.ImgURLPrefix)
show := NewWithClient(&polochon.Show{ImdbID: pShow.ImdbID}, client, pShow, wShow)
shows = append(shows, show)
}
return shows, nil

View File

@ -1,4 +1,5 @@
import React from "react";
import moment from "moment";
import PropTypes from "prop-types";
import { useSelector } from "react-redux";
@ -7,10 +8,10 @@ import { UserEdit } from "./userEdit";
export const User = ({ id }) => {
const user = useSelector((state) => state.admin.users.get(id));
const polochon = user.polochon;
const lastSeen = moment(user.last_seen, "YYYY-MM-DDTHH:mm:ss.SZ");
return (
<tr>
<td>{user.id}</td>
<td>{user.name}</td>
<td>
<span
@ -32,6 +33,7 @@ export const User = ({ id }) => {
}
></span>
</td>
<td>{lastSeen.isValid() ? lastSeen.fromNow() : "-"}</td>
<td>
<UserEdit id={id} />
</td>

View File

@ -24,13 +24,13 @@ export const UserList = () => {
<table className="table table-striped">
<thead className="table-secondary">
<tr>
<th>#</th>
<th>Name</th>
<th>Activated</th>
<th>Admin</th>
<th>Polochon URL</th>
<th>Polochon token</th>
<th>Polochon activated</th>
<th>Last seen</th>
<th>Actions</th>
</tr>
</thead>