242 lines
6.4 KiB
Go
242 lines
6.4 KiB
Go
|
package database
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
|
||
|
mgo "gopkg.in/mgo.v2"
|
||
|
"gopkg.in/mgo.v2/bson"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
visited_coll = "visited"
|
||
|
downloaded_coll = "downloaded"
|
||
|
tags_coll = "tags"
|
||
|
)
|
||
|
|
||
|
type mgoDB struct {
|
||
|
session *mgo.Session
|
||
|
name string
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) initIndexes() {
|
||
|
dbCopy := db.session.Copy()
|
||
|
booksColl := dbCopy.DB(db.name).C(books_coll)
|
||
|
go indexBooks(booksColl)
|
||
|
statsColl := dbCopy.DB(db.name).C(stats_coll)
|
||
|
go indexStats(statsColl)
|
||
|
newsColl := dbCopy.DB(db.name).C(news_coll)
|
||
|
go indexNews(newsColl)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) Close() {
|
||
|
db.session.Close()
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) Copy() DB {
|
||
|
dbCopy := new(mgoDB)
|
||
|
dbCopy.session = db.session.Copy()
|
||
|
dbCopy.name = db.name
|
||
|
return dbCopy
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) AddBook(book map[string]interface{}) error {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return addBook(booksColl, book)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetBooks(query string, length int, start int) (books []Book, num int, err error) {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return getBooks(booksColl, query, length, start)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetBooksIter() Iter {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return getBooksIter(booksColl)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetNewBooks(query string, length int, start int) (books []Book, num int, err error) {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return getNewBooks(booksColl, query, length, start)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetBookId(id string) (Book, error) {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return getBookId(booksColl, id)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) DeleteBook(id string) error {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return deleteBook(booksColl, id)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateBook(id string, data map[string]interface{}) error {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return updateBook(booksColl, id, data)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) FlagBadQuality(id string, user string) error {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return flagBadQuality(booksColl, id, user)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) ActiveBook(id string) error {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return activeBook(booksColl, id)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) IsBookActive(id string) bool {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
return isBookActive(booksColl, id)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) User(name string) *User {
|
||
|
userColl := db.session.DB(db.name).C(user_coll)
|
||
|
return getUser(userColl, name)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) AddUser(name string, pass string) error {
|
||
|
userColl := db.session.DB(db.name).C(user_coll)
|
||
|
return addUser(userColl, name, pass)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) AddNews(text string) error {
|
||
|
newsColl := db.session.DB(db.name).C(news_coll)
|
||
|
return addNews(newsColl, text)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetNews(num int, days int) (news []News, err error) {
|
||
|
newsColl := db.session.DB(db.name).C(news_coll)
|
||
|
return getNews(newsColl, num, days)
|
||
|
}
|
||
|
|
||
|
// TODO: split code in files
|
||
|
func (db *mgoDB) AddStats(stats interface{}) error {
|
||
|
statsColl := db.session.DB(db.name).C(stats_coll)
|
||
|
return statsColl.Insert(stats)
|
||
|
}
|
||
|
|
||
|
/* Get the most visited books
|
||
|
*/
|
||
|
func (db *mgoDB) GetVisitedBooks() (books []Book, err error) {
|
||
|
visitedColl := db.session.DB(db.name).C(visited_coll)
|
||
|
bookId, err := GetBooksVisited(visitedColl)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
books = make([]Book, len(bookId))
|
||
|
for i, id := range bookId {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
booksColl.Find(bson.M{"_id": id}).One(&books[i])
|
||
|
books[i].Id = bson.ObjectId(books[i].Id).Hex()
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateMostVisited() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(visited_coll)
|
||
|
return u.UpdateMostBooks("book")
|
||
|
}
|
||
|
|
||
|
/* Get the most downloaded books
|
||
|
*/
|
||
|
func (db *mgoDB) GetDownloadedBooks() (books []Book, err error) {
|
||
|
downloadedColl := db.session.DB(db.name).C(downloaded_coll)
|
||
|
bookId, err := GetBooksVisited(downloadedColl)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
books = make([]Book, len(bookId))
|
||
|
for i, id := range bookId {
|
||
|
booksColl := db.session.DB(db.name).C(books_coll)
|
||
|
booksColl.Find(bson.M{"_id": id}).One(&books[i])
|
||
|
books[i].Id = bson.ObjectId(books[i].Id).Hex()
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateDownloadedBooks() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(downloaded_coll)
|
||
|
return u.UpdateMostBooks("download")
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetTags() ([]string, error) {
|
||
|
tagsColl := db.session.DB(db.name).C(tags_coll)
|
||
|
return GetTags(tagsColl)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateTags() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(books_coll)
|
||
|
u.dst = db.session.DB(db.name).C(tags_coll)
|
||
|
return u.UpdateTags()
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) GetVisits(visitType VisitType) ([]Visits, error) {
|
||
|
var coll *mgo.Collection
|
||
|
switch visitType {
|
||
|
case Hourly_visits:
|
||
|
coll = db.session.DB(db.name).C(hourly_visits_coll)
|
||
|
case Daily_visits:
|
||
|
coll = db.session.DB(db.name).C(daily_visits_coll)
|
||
|
case Monthly_visits:
|
||
|
coll = db.session.DB(db.name).C(monthly_visits_coll)
|
||
|
case Hourly_downloads:
|
||
|
coll = db.session.DB(db.name).C(hourly_downloads_coll)
|
||
|
case Daily_downloads:
|
||
|
coll = db.session.DB(db.name).C(daily_downloads_coll)
|
||
|
case Monthly_downloads:
|
||
|
coll = db.session.DB(db.name).C(monthly_downloads_coll)
|
||
|
default:
|
||
|
return nil, errors.New("Not valid VisitType")
|
||
|
}
|
||
|
return GetVisits(coll)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateHourVisits() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(hourly_visits_coll)
|
||
|
return u.UpdateHourVisits(false)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateDayVisits() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(daily_visits_coll)
|
||
|
return u.UpdateDayVisits(false)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateMonthVisits() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(monthly_visits_coll)
|
||
|
return u.UpdateMonthVisits(false)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateHourDownloads() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(hourly_downloads_coll)
|
||
|
return u.UpdateHourVisits(true)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateDayDownloads() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(daily_downloads_coll)
|
||
|
return u.UpdateDayVisits(true)
|
||
|
}
|
||
|
|
||
|
func (db *mgoDB) UpdateMonthDownloads() error {
|
||
|
var u dbUpdate
|
||
|
u.src = db.session.DB(db.name).C(stats_coll)
|
||
|
u.dst = db.session.DB(db.name).C(monthly_downloads_coll)
|
||
|
return u.UpdateMonthVisits(true)
|
||
|
}
|