Keep count of downladed/viewed books

This commit is contained in:
Las Zenow 2017-05-30 22:10:21 +00:00
parent 68ffe6cf5b
commit 71d975c2f7
7 changed files with 109 additions and 91 deletions

View file

@ -5,7 +5,6 @@ import (
"net/http"
"strings"
"time"
"github.com/gorilla/mux"
"gitlab.com/trantor/trantor/lib/database"
@ -67,82 +66,34 @@ func (sg StatsGatherer) Gather(function func(handler)) func(http.ResponseWriter,
}
function(h)
sg.channel <- statsRequest{time.Now(), mux.Vars(r), h.sess, r}
sg.channel <- statsRequest{r}
}
}
type statsRequest struct {
date time.Time
vars map[string]string
sess *Session
r *http.Request
r *http.Request
}
func (sg StatsGatherer) worker() {
for req := range sg.channel {
stats := make(map[string]interface{})
appendFiles(req.r, stats)
appendMuxVars(req.vars, stats)
appendUrl(req.r, stats)
appendSession(req.sess, stats)
stats["version"] = stats_version
stats["method"] = req.r.Method
stats["date"] = req.date
sg.db.AddStats(stats)
}
}
func appendFiles(r *http.Request, stats map[string]interface{}) {
if r.Method == "POST" && r.MultipartForm != nil {
files := r.MultipartForm.File
for key := range files {
list := make([]string, len(files[key]))
for i, f := range files[key] {
list[i] = f.Filename
var err error
pattern := strings.Split(req.r.URL.Path, "/")
id := mux.Vars(req.r)["id"]
if len(pattern) > 1 && pattern[1] != "" && id != "" {
switch pattern[1] {
case "download":
id := mux.Vars(req.r)["id"]
err = sg.db.IncDownloads(id)
case "book":
id := mux.Vars(req.r)["id"]
err = sg.db.IncViews(id)
case "read":
id := mux.Vars(req.r)["id"]
err = sg.db.IncViews(id)
}
stats[key] = list
}
if err != nil {
log.Warn("Problem incrementing visits: ", err)
}
}
}
func appendMuxVars(vars map[string]string, stats map[string]interface{}) {
for key, value := range vars {
switch {
case key == "id":
stats["id"] = value
case key == "ids":
var objectIds []string
ids := strings.Split(value, "/")
for _, id := range ids {
objectIds = append(objectIds, id)
}
if len(objectIds) > 0 {
stats["ids"] = objectIds
stats["id"] = objectIds[0]
}
default:
stats[key] = value
}
}
}
func appendUrl(r *http.Request, stats map[string]interface{}) {
for key, value := range r.URL.Query() {
stats[key] = value
}
stats["host"] = r.Host
stats["path"] = r.URL.Path
pattern := strings.Split(r.URL.Path, "/")
if len(pattern) > 1 && pattern[1] != "" {
stats["section"] = pattern[1]
} else {
stats["section"] = "/"
}
}
func appendSession(sess *Session, stats map[string]interface{}) {
stats["session"] = sess.Id()
if sess.User != "" {
stats["user"] = sess.User
}
}