diff --git a/admin.go b/admin.go index 48355ec..47f0146 100644 --- a/admin.go +++ b/admin.go @@ -20,20 +20,14 @@ func deleteHandler(h handler) { var titles []string var isNew bool ids := strings.Split(mux.Vars(h.r)["ids"], "/") - for _, idStr := range ids { - if !bson.IsObjectIdHex(idStr) { - continue - } - - id := bson.ObjectIdHex(idStr) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) + for _, id := range ids { + book, err := h.db.GetBookId(id) if err != nil { - h.sess.Notify("Book not found!", "The book with id '"+idStr+"' is not there", "error") + h.sess.Notify("Book not found!", "The book with id '"+id+"' is not there", "error") continue } - book := books[0] DeleteBook(book, h.db) - h.db.DeleteBook(id) + h.db.DeleteBook(bson.ObjectIdHex(id)) if !book.Active { isNew = true @@ -52,20 +46,19 @@ func deleteHandler(h handler) { } func editHandler(h handler) { - idStr := mux.Vars(h.r)["id"] - if !h.sess.IsAdmin() || !bson.IsObjectIdHex(idStr) { + id := mux.Vars(h.r)["id"] + if !h.sess.IsAdmin() { notFound(h) return } - id := bson.ObjectIdHex(idStr) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) + book, err := h.db.GetBookId(id) if err != nil { notFound(h) return } var data bookData - data.Book = books[0] + data.Book = book data.S = GetStatus(h) loadTemplate(h.w, "edit", data) } @@ -183,24 +176,18 @@ func storeHandler(h handler) { var titles []string ids := strings.Split(mux.Vars(h.r)["ids"], "/") - for _, idStr := range ids { - if !bson.IsObjectIdHex(idStr) { - continue - } - - id := bson.ObjectIdHex(idStr) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) + for _, id := range ids { + book, err := h.db.GetBookId(id) if err != nil { - h.sess.Notify("Book not found!", "The book with id '"+idStr+"' is not there", "error") + h.sess.Notify("Book not found!", "The book with id '"+id+"' is not there", "error") continue } - book := books[0] if err != nil { h.sess.Notify("An error ocurred!", err.Error(), "error") log.Error("Error storing book '", book.Title, "': ", err.Error()) continue } - h.db.UpdateBook(id, bson.M{"active": true}) + h.db.UpdateBook(bson.ObjectIdHex(id), bson.M{"active": true}) titles = append(titles, book.Title) } if titles != nil { diff --git a/cover.go b/cover.go index 20b0daa..66be75b 100644 --- a/cover.go +++ b/cover.go @@ -23,17 +23,11 @@ import ( func coverHandler(h handler) { vars := mux.Vars(h.r) - if !bson.IsObjectIdHex(vars["id"]) { + book, err := h.db.GetBookId(vars["id"]) + if err != nil { notFound(h) return } - id := bson.ObjectIdHex(vars["id"]) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) - if err != nil || len(books) == 0 { - notFound(h) - return - } - book := books[0] if !book.Active { if !h.sess.IsAdmin() { diff --git a/database/books.go b/database/books.go index 358aaf3..ecd9356 100644 --- a/database/books.go +++ b/database/books.go @@ -1,6 +1,7 @@ package database import ( + "errors" "labix.org/v2/mgo" "labix.org/v2/mgo/bson" ) @@ -59,6 +60,17 @@ func getBooks(coll *mgo.Collection, query bson.M, length int, start int) (books return } +func getBookId(coll *mgo.Collection, id string) (Book, error) { + var book Book + if !bson.IsObjectIdHex(id) { + return book, errors.New("Not valid book id") + } + + err := coll.FindId(bson.ObjectIdHex(id)).One(&book) + book.Id = bson.ObjectId(book.Id).Hex() + return book, err +} + func deleteBook(coll *mgo.Collection, id bson.ObjectId) error { return coll.Remove(bson.M{"_id": id}) } diff --git a/database/database.go b/database/database.go index bff4a40..be77758 100644 --- a/database/database.go +++ b/database/database.go @@ -54,6 +54,11 @@ func (db *DB) GetBooks(query bson.M, length int, start int) (books []Book, num i return getBooks(booksColl, query, length, start) } +func (db *DB) GetBookId(id string) (Book, error) { + booksColl := db.session.DB(db.name).C(books_coll) + return getBookId(booksColl, id) +} + func (db *DB) DeleteBook(id bson.ObjectId) error { booksColl := db.session.DB(db.name).C(books_coll) return deleteBook(booksColl, id) diff --git a/reader.go b/reader.go index 0faa7c8..5402076 100644 --- a/reader.go +++ b/reader.go @@ -178,12 +178,11 @@ func openReadEpub(h handler) (*epubgo.Epub, database.Book) { if !bson.IsObjectIdHex(id) { return nil, book } - books, _, err := h.db.GetBooks(bson.M{"_id": bson.ObjectIdHex(id)}, 0, 0) - if err != nil || len(books) == 0 { + book, err := h.db.GetBookId(id) + if err != nil { return nil, book } - book = books[0] if !book.Active { if !h.sess.IsAdmin() { return nil, book @@ -205,12 +204,11 @@ func contentHandler(h handler) { return } - books, _, err := h.db.GetBooks(bson.M{"_id": bson.ObjectIdHex(id)}, 0, 0) - if err != nil || len(books) == 0 { + book, err := h.db.GetBookId(id) + if err != nil { notFound(h) return } - book := books[0] if !book.Active { if !h.sess.IsAdmin() { notFound(h) diff --git a/trantor.go b/trantor.go index dcd5216..7edf6af 100644 --- a/trantor.go +++ b/trantor.go @@ -44,40 +44,27 @@ type bookData struct { } func bookHandler(h handler) { - idStr := mux.Vars(h.r)["id"] - if !bson.IsObjectIdHex(idStr) { - notFound(h) - return - } - + id := mux.Vars(h.r)["id"] var data bookData data.S = GetStatus(h) - id := bson.ObjectIdHex(idStr) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) - if err != nil || len(books) == 0 { + book, err := h.db.GetBookId(id) + if err != nil { notFound(h) return } - data.Book = books[0] + data.Book = book data.Description = strings.Split(data.Book.Description, "\n") loadTemplate(h.w, "book", data) } func downloadHandler(h handler) { - idStr := mux.Vars(h.r)["id"] - if !bson.IsObjectIdHex(idStr) { + id := mux.Vars(h.r)["id"] + book, err := h.db.GetBookId(id) + if err != nil { notFound(h) return } - id := bson.ObjectIdHex(idStr) - books, _, err := h.db.GetBooks(bson.M{"_id": id}, 0, 0) - if err != nil || len(books) == 0 { - notFound(h) - return - } - book := books[0] - if !book.Active { if !h.sess.IsAdmin() { notFound(h)