2016-05-02 21:36:49 -04:00
|
|
|
package trantor
|
2012-07-30 23:23:38 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2012-08-15 15:12:59 +02:00
|
|
|
"strconv"
|
2012-07-30 23:23:38 +02:00
|
|
|
"strings"
|
2014-08-30 01:25:16 -05:00
|
|
|
|
2016-05-02 21:36:49 -04:00
|
|
|
"gitlab.com/trantor/trantor/lib/database"
|
2012-07-30 23:23:38 +02:00
|
|
|
)
|
|
|
|
|
2016-05-03 01:03:23 -04:00
|
|
|
const (
|
|
|
|
searchItemsPage = 20
|
|
|
|
)
|
|
|
|
|
2012-07-30 23:23:38 +02:00
|
|
|
type searchData struct {
|
2013-08-31 01:45:15 +02:00
|
|
|
S Status
|
|
|
|
Found int
|
2014-06-29 19:41:29 -05:00
|
|
|
Books []database.Book
|
2013-08-31 01:45:15 +02:00
|
|
|
ItemsPage int
|
|
|
|
Page int
|
|
|
|
Next string
|
|
|
|
Prev string
|
2012-07-30 23:23:38 +02:00
|
|
|
}
|
|
|
|
|
2013-09-23 16:27:31 +02:00
|
|
|
func searchHandler(h handler) {
|
|
|
|
err := h.r.ParseForm()
|
2012-09-12 00:19:19 +02:00
|
|
|
if err != nil {
|
2013-09-23 16:27:31 +02:00
|
|
|
http.Error(h.w, err.Error(), http.StatusInternalServerError)
|
2012-09-12 00:19:19 +02:00
|
|
|
return
|
|
|
|
}
|
2013-09-23 16:27:31 +02:00
|
|
|
req := strings.Join(h.r.Form["q"], " ")
|
2012-09-12 00:19:19 +02:00
|
|
|
page := 0
|
2013-09-23 16:27:31 +02:00
|
|
|
if len(h.r.Form["p"]) != 0 {
|
|
|
|
page, err = strconv.Atoi(h.r.Form["p"][0])
|
2012-08-15 13:58:16 +02:00
|
|
|
if err != nil {
|
2012-09-12 00:19:19 +02:00
|
|
|
page = 0
|
2012-07-30 23:59:55 +02:00
|
|
|
}
|
2012-09-12 00:19:19 +02:00
|
|
|
}
|
2013-09-23 16:27:31 +02:00
|
|
|
items_page := itemsPage(h.r)
|
2014-07-02 20:58:00 -05:00
|
|
|
res, num, _ := h.db.GetBooks(req, items_page, page*items_page)
|
2012-07-30 23:59:55 +02:00
|
|
|
|
2012-09-12 00:19:19 +02:00
|
|
|
var data searchData
|
2013-09-23 16:27:31 +02:00
|
|
|
data.S = GetStatus(h)
|
2016-01-28 18:13:26 -05:00
|
|
|
data.S.Title = req + " -- Search -- " + data.S.Title
|
2012-09-12 00:19:19 +02:00
|
|
|
data.S.Search = req
|
|
|
|
data.Books = res
|
2013-08-31 01:45:15 +02:00
|
|
|
data.ItemsPage = items_page
|
2012-09-12 00:19:19 +02:00
|
|
|
data.Found = num
|
|
|
|
data.Page = page + 1
|
2013-08-31 01:45:15 +02:00
|
|
|
if num > (page+1)*items_page {
|
|
|
|
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1) + "&num=" + strconv.Itoa(items_page)
|
2012-09-12 00:19:19 +02:00
|
|
|
}
|
|
|
|
if page > 0 {
|
2013-08-31 01:45:15 +02:00
|
|
|
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1) + "&num=" + strconv.Itoa(items_page)
|
2012-07-30 23:59:55 +02:00
|
|
|
}
|
2013-08-31 00:38:32 +02:00
|
|
|
|
2017-06-06 14:18:47 +00:00
|
|
|
h.load("search", data)
|
2012-07-30 23:23:38 +02:00
|
|
|
}
|
2013-08-31 01:45:15 +02:00
|
|
|
|
|
|
|
func itemsPage(r *http.Request) int {
|
|
|
|
if len(r.Form["num"]) > 0 {
|
|
|
|
items_page, err := strconv.Atoi(r.Form["num"][0])
|
|
|
|
if err == nil {
|
|
|
|
return items_page
|
|
|
|
}
|
|
|
|
}
|
2016-05-03 01:03:23 -04:00
|
|
|
return searchItemsPage
|
2013-08-31 01:45:15 +02:00
|
|
|
}
|