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) } }