From f5363e17bcff100cf09bc954abe0ca265a0a47df Mon Sep 17 00:00:00 2001 From: Las Zenow Date: Sun, 7 Sep 2014 20:22:24 -0500 Subject: [PATCH] Add bad quality flag --- database/books.go | 23 ++++++++++++++++++-- database/books_test.go | 48 +++++++++++++++++++++++++++++++++++++++++- database/database.go | 5 +++++ robots.txt | 1 + templates/book.html | 18 ++++++++++------ trantor.go | 12 +++++++++++ 6 files changed, 97 insertions(+), 10 deletions(-) diff --git a/database/books.go b/database/books.go index e8fe16d..8229546 100644 --- a/database/books.go +++ b/database/books.go @@ -36,6 +36,7 @@ type Book struct { FileSize int Cover bool Active bool + BadQuality int `bad_quality` Keywords []string } @@ -50,6 +51,10 @@ func indexBooks(coll *mgo.Collection) { Key: []string{"active", "-_id"}, Background: true, }, + { + Key: []string{"active", "-bad_quality", "-_id"}, + Background: true, + }, } for _, k := range []string{"keywords", "lang", "title", "author", "subject"} { idx := mgo.Index{ @@ -81,7 +86,13 @@ func getNewBooks(coll *mgo.Collection, length int, start int) (books []Book, num } func _getBooks(coll *mgo.Collection, query bson.M, length int, start int) (books []Book, num int, err error) { - q := coll.Find(query).Sort("-_id") + sort := []string{} + if _, present := query["bad_quality"]; present { + sort = append(sort, "-bad_quality") + } + sort = append(sort, "-_id") + + q := coll.Find(query).Sort(sort...) num, err = q.Count() if err != nil { return @@ -121,6 +132,10 @@ func updateBook(coll *mgo.Collection, id string, data map[string]interface{}) er return coll.Update(bson.M{"id": id}, bson.M{"$set": data}) } +func flagBadQuality(coll *mgo.Collection, id string) error { + return coll.Update(bson.M{"id": id}, bson.M{"$inc": bson.M{"bad_quality": 1}}) +} + func activeBook(coll *mgo.Collection, id string) error { data := map[string]interface{}{"active": true} return coll.Update(bson.M{"id": id}, bson.M{"$set": data}) @@ -142,7 +157,11 @@ func buildQuery(q string) bson.M { for _, w := range words { tag := strings.SplitN(w, ":", 2) if len(tag) > 1 { - query[tag[0]] = bson.RegEx{tag[1], "i"} + if tag[0] == "flag" { + query[tag[1]] = bson.M{"$gt": 0} + } else { + query[tag[0]] = bson.RegEx{tag[1], "i"} //FIXME: this should be a list + } } else { toks := tokens(w) keywords = append(keywords, toks...) diff --git a/database/books_test.go b/database/books_test.go index a32e6dc..7b259cf 100644 --- a/database/books_test.go +++ b/database/books_test.go @@ -77,9 +77,55 @@ func TestUpdateBookKeywords(t *testing.T) { } } +func TestFlag(t *testing.T) { + db := Init(test_host, test_coll) + defer db.del() + + tAddBook(t, db) + id, _ := book["id"].(string) + db.ActiveBook(id) + id2 := "tfgrBvd2ps_K4iYt" + b2 := book + b2["id"] = id2 + err := db.AddBook(b2) + if err != nil { + t.Error("db.AddBook(", book, ") return an error:", err) + } + db.ActiveBook(id2) + id3 := "tfgrBvd2ps_K4iY2" + b3 := book + b3["id"] = id3 + err = db.AddBook(b3) + if err != nil { + t.Error("db.AddBook(", book, ") return an error:", err) + } + db.ActiveBook(id3) + + db.FlagBadQuality(id) + db.FlagBadQuality(id) + db.FlagBadQuality(id3) + + b, _ := db.GetBookId(id) + if b.BadQuality != 2 { + t.Error("The bad quality flag was not increased") + } + b, _ = db.GetBookId(id3) + if b.BadQuality != 1 { + t.Error("The bad quality flag was not increased") + } + + books, _, _ := db.GetBooks("flag:bad_quality", 2, 0) + if len(books) != 2 { + t.Fatal("Not the right number of results to the flag search:", len(books)) + } + if books[0].Id != id { + t.Error("Search for flag bad_quality is not sort right") + } +} + func tAddBook(t *testing.T, db *DB) { err := db.AddBook(book) if err != nil { - t.Error("db.AddBook(", book, ") return an error: ", err) + t.Error("db.AddBook(", book, ") return an error:", err) } } diff --git a/database/database.go b/database/database.go index ab80e43..172967e 100644 --- a/database/database.go +++ b/database/database.go @@ -85,6 +85,11 @@ func (db *DB) UpdateBook(id string, data map[string]interface{}) error { return updateBook(booksColl, id, data) } +func (db *DB) FlagBadQuality(id string) error { + booksColl := db.session.DB(db.name).C(books_coll) + return flagBadQuality(booksColl, id) +} + func (db *DB) ActiveBook(id string) error { booksColl := db.session.DB(db.name).C(books_coll) return activeBook(booksColl, id) diff --git a/robots.txt b/robots.txt index 748a7f2..624a39b 100644 --- a/robots.txt +++ b/robots.txt @@ -1,4 +1,5 @@ User-agent: * +Disallow: /flag/ Disallow: /delete/ Disallow: /edit/ Disallow: /save/ diff --git a/templates/book.html b/templates/book.html index 14b534b..71c6037 100644 --- a/templates/book.html +++ b/templates/book.html @@ -25,7 +25,7 @@ function delBook(){
{{if .Cover}}
- {{.Title}} + {{.Title}}
{{end}} @@ -43,20 +43,24 @@ function delBook(){
+ {{if $isAdmin}} +

-

{{end}} -
diff --git a/trantor.go b/trantor.go index e8a4111..ff8af9f 100644 --- a/trantor.go +++ b/trantor.go @@ -88,6 +88,17 @@ func downloadHandler(h handler) { io.Copy(h.w, f) } +func flagHandler(h handler) { + id := mux.Vars(h.r)["id"] + err := h.db.FlagBadQuality(id) + if err != nil { + log.Warn("An error ocurred while flaging ", id, ": ", err) + } + h.sess.Notify("Flagged!", "Book marked as bad quality, thank you", "success") + h.sess.Save(h.w, h.r) + http.Redirect(h.w, h.r, h.r.Referer(), http.StatusFound) +} + type indexData struct { S Status Books []database.Book @@ -176,6 +187,7 @@ func initRouter(db *database.DB, sg *StatsGatherer) { r.HandleFunc("/download/{id:"+id_pattern+"}/{epub:.*}", sg.Gather(downloadHandler)) r.HandleFunc("/cover/{id:"+id_pattern+"}/{size}/{img:.*}", sg.Gather(coverHandler)) r.HandleFunc("/stats/", sg.Gather(statsHandler)) + r.HandleFunc("/flag/bad_quality/{id:"+id_pattern+"}", sg.Gather(flagHandler)) r.HandleFunc("/login/", sg.Gather(loginHandler)).Methods("GET") r.HandleFunc("/login/", sg.Gather(loginPostHandler)).Methods("POST")