Use clousures for the http handlers
This commit is contained in:
parent
f1eab1bebc
commit
3db6231762
3 changed files with 54 additions and 48 deletions
64
search.go
64
search.go
|
@ -31,38 +31,40 @@ type searchData struct {
|
|||
Prev string
|
||||
}
|
||||
|
||||
func searchHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) {
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
req := strings.Join(r.Form["q"], " ")
|
||||
var res []Book
|
||||
coll.Find(buildQuery(req)).All(&res)
|
||||
|
||||
page := 0
|
||||
if len(r.Form["p"]) != 0 {
|
||||
page, err = strconv.Atoi(r.Form["p"][0])
|
||||
if err != nil || len(res) < ITEMS_PAGE*page {
|
||||
page = 0
|
||||
func searchHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
}
|
||||
req := strings.Join(r.Form["q"], " ")
|
||||
var res []Book
|
||||
coll.Find(buildQuery(req)).All(&res)
|
||||
|
||||
var data searchData
|
||||
data.Search = req
|
||||
data.Found = len(res)
|
||||
if len(res) > ITEMS_PAGE*(page+1) {
|
||||
data.Books = res[ITEMS_PAGE*page:ITEMS_PAGE*(page+1)]
|
||||
} else {
|
||||
data.Books = res[ITEMS_PAGE*page:]
|
||||
page := 0
|
||||
if len(r.Form["p"]) != 0 {
|
||||
page, err = strconv.Atoi(r.Form["p"][0])
|
||||
if err != nil || len(res) < ITEMS_PAGE*page {
|
||||
page = 0
|
||||
}
|
||||
}
|
||||
|
||||
var data searchData
|
||||
data.Search = req
|
||||
data.Found = len(res)
|
||||
if len(res) > ITEMS_PAGE*(page+1) {
|
||||
data.Books = res[ITEMS_PAGE*page:ITEMS_PAGE*(page+1)]
|
||||
} else {
|
||||
data.Books = res[ITEMS_PAGE*page:]
|
||||
}
|
||||
data.Page = page+1
|
||||
if len(res) > (page+1)*ITEMS_PAGE {
|
||||
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1)
|
||||
}
|
||||
if page > 0 {
|
||||
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1)
|
||||
}
|
||||
loadTemplate(w, "search", data)
|
||||
}
|
||||
data.Page = page+1
|
||||
if len(res) > (page+1)*ITEMS_PAGE {
|
||||
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1)
|
||||
}
|
||||
if page > 0 {
|
||||
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1)
|
||||
}
|
||||
loadTemplate(w, "search", data)
|
||||
}
|
||||
|
|
16
trantor.go
16
trantor.go
|
@ -16,10 +16,12 @@ func aboutHandler(w http.ResponseWriter, r *http.Request) {
|
|||
loadTemplate(w, "about", nil)
|
||||
}
|
||||
|
||||
func bookHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) {
|
||||
var book Book
|
||||
coll.Find(bson.M{"title": r.URL.Path[len("/book/"):]}).One(&book)
|
||||
loadTemplate(w, "book", book)
|
||||
func bookHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
var book Book
|
||||
coll.Find(bson.M{"title": r.URL.Path[len("/book/"):]}).One(&book)
|
||||
loadTemplate(w, "book", book)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -37,9 +39,9 @@ func main() {
|
|||
coll := session.DB(DB_NAME).C(BOOKS_COLL)
|
||||
num, _ := coll.Count()
|
||||
|
||||
http.HandleFunc("/book/", func(w http.ResponseWriter, r *http.Request) { bookHandler(coll, w, r) })
|
||||
http.HandleFunc("/search/", func(w http.ResponseWriter, r *http.Request) { searchHandler(coll, w, r) })
|
||||
http.HandleFunc("/upload/", func(w http.ResponseWriter, r *http.Request) { uploadHandler(coll, w, r) })
|
||||
http.HandleFunc("/book/", bookHandler(coll))
|
||||
http.HandleFunc("/search/", searchHandler(coll))
|
||||
http.HandleFunc("/upload/", uploadHandler(coll))
|
||||
http.HandleFunc("/about/", aboutHandler)
|
||||
fileHandler("/img/")
|
||||
fileHandler("/cover/")
|
||||
|
|
22
upload.go
22
upload.go
|
@ -42,16 +42,18 @@ func storeFile(r *http.Request) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func uploadHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) {
|
||||
status := ""
|
||||
if r.Method == "POST" {
|
||||
err := storeFile(r)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
func uploadHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
status := ""
|
||||
if r.Method == "POST" {
|
||||
err := storeFile(r)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
status = "Upload successful."
|
||||
}
|
||||
status = "Upload successful."
|
||||
}
|
||||
|
||||
loadTemplate(w, "upload", status)
|
||||
loadTemplate(w, "upload", status)
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue