diff --git a/web.go b/web.go index 35e58a5e3a46182143d4a2144de5e40712950f42..1a2c2121380b6f71de098a6ccf02f60b57a34753 100644 --- a/web.go +++ b/web.go @@ -70,23 +70,43 @@ func (p *pagination) End() int { return end + 1 } -func (s *uiServer) handleSearch(w http.ResponseWriter, req *http.Request) { +var pageSize = 15 + +func executeSearch(s *uiServer, req *http.Request) (*SearchResult, error) { query := req.FormValue("q") page, _ := strconv.Atoi(req.FormValue("p")) - pageSize := 15 + pageSize := pageSize result, err := s.db.Search(query, page*pageSize, pageSize) + return result, err +} + +func (s *uiServer) handleApiSearch(w http.ResponseWriter, req *http.Request){ + result, _ := executeSearch(s, req) + + books := []*flatBook{} + for id := range result.Results { + book := flatten(result.Results[id]) + books = append(books, book) + } + json, _ := json.Marshal(books) + fmt.Fprint(w, string(json)) +} + +func (s *uiServer) handleSearch(w http.ResponseWriter, req *http.Request) { + result, err := executeSearch(s, req) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } + page, _ := strconv.Atoi(req.FormValue("p")) ctx := struct { Query string Results []*Book Pagination *pagination }{ - Query: query, + Query: req.FormValue("q"), Results: result.Results, Pagination: &pagination{ PageSize: pageSize, @@ -384,6 +404,7 @@ func NewHttpServer(db *Database, storage, cache *RWFileStorage, addr string) *ht r.HandleFunc("/opensearch.xml", handleOpenSearchXml) r.HandleFunc("/suggest", uisrv.handleSuggest) r.HandleFunc("/search", uisrv.handleSearch) + r.HandleFunc("/search_api", uisrv.handleApiSearch) r.HandleFunc("/", uisrv.handleHome) return &http.Server{