92 lines
1.7 KiB
Go
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)
|
|
}
|
|
}
|