This repository has been archived on 2025-03-01. You can view files and clone it, but cannot push or open issues or pull requests.
trantor/lib/database/stats.go
2017-05-30 22:10:21 +00:00

92 lines
1.7 KiB
Go

package database
import (
"time"
log "github.com/cihub/seelog"
)
type Visit struct {
ID int
Downloads int `sql:",notnull"`
Views int `sql:",notnull"`
BookID string
Book *Book
}
func (db *pgDB) IncViews(ID string) error {
visit := &Visit{
Downloads: 0,
Views: 1,
BookID: ID,
}
_, err := db.sql.Model(visit).
OnConflict("(book_id) DO UPDATE").
Set("views = Visit.views + 1").
Insert()
return err
}
func (db *pgDB) IncDownloads(ID string) error {
visit := &Visit{
Downloads: 1,
Views: 0,
BookID: ID,
}
_, err := db.sql.Model(visit).
OnConflict("(book_id) DO UPDATE").
Set("downloads = Visit.downloads + 1").
Insert()
return err
}
/* GetVisitedBooks get the most visited books
*/
func (db *pgDB) GetVisitedBooks(num int) (books []Book, err error) {
err = db.sql.Model(&books).
Column("Visit").
Order("views DESC NULLS LAST").
Limit(num).
Select()
return
}
/* GetDownloadedBooks the most downloaded books
*/
func (db *pgDB) GetDownloadedBooks(num int) (books []Book, err error) {
err = db.sql.Model(&books).
Column("Visit").
Order("downloads DESC NULLS LAST").
Limit(num).
Select()
return
}
func (db *pgDB) GetTags() ([]string, error) {
return db.tags, nil
}
func (db *pgDB) updateTags() {
var tags []string
err := db.sql.Model(&Book{}).
ColumnExpr("unnest(tags) as tag").
Where("active = true").
Group("tag").
OrderExpr("count(*) DESC").
Limit(tagsDisplay).
Select(&tags)
if err != nil {
log.Error("Error updating tags: ", err)
} else {
db.tags = tags
}
}
func (db *pgDB) tagUpdater() {
periodicity := 57 * time.Minute
for true {
db.updateTags()
time.Sleep(periodicity)
}
}