From 97396103110ab50822e0fe1479ee4ad6afdc5b6d Mon Sep 17 00:00:00 2001 From: akuma06 Date: Fri, 5 May 2017 16:39:15 +0200 Subject: [PATCH] Separated Routes and handler from Main Everything is in the router folder in different file --- main.go | 282 +----------------- router/apiHandler.go | 59 ++++ router/faqHandler.go | 17 ++ router/homeHandler.go | 47 +++ router/router.go | 31 ++ router/rssHandler.go | 47 +++ router/searchHandler.go | 49 +++ .../templateFunctions.go | 13 +- .../templateVariables.go | 2 +- router/viewTorrentHandler.go | 25 ++ util/search/search.go | 76 +++++ 11 files changed, 361 insertions(+), 287 deletions(-) create mode 100644 router/apiHandler.go create mode 100644 router/faqHandler.go create mode 100644 router/homeHandler.go create mode 100644 router/router.go create mode 100644 router/rssHandler.go create mode 100644 router/searchHandler.go rename templateFunctions.go => router/templateFunctions.go (83%) rename templateVariables.go => router/templateVariables.go (99%) create mode 100644 router/viewTorrentHandler.go create mode 100644 util/search/search.go diff --git a/main.go b/main.go index 6c6db191..9d237fc0 100644 --- a/main.go +++ b/main.go @@ -2,299 +2,23 @@ package main import ( "bufio" - "encoding/json" "fmt" "flag" - "github.com/gorilla/feeds" - "github.com/gorilla/mux" - "github.com/ewhal/nyaa/model" - "github.com/ewhal/nyaa/service/torrent" "github.com/ewhal/nyaa/util/log" + "github.com/ewhal/nyaa/router" "github.com/ewhal/nyaa/config" - "html" - "html/template" + "net/http" "os" - "strconv" - "strings" "time" ) -var router *mux.Router -type SearchParam struct { - Category string - Order string - Query string - Max int - Status string - Sort string -} - -func apiHandler(w http.ResponseWriter, r *http.Request) { - - vars := mux.Vars(r) - page := vars["page"] - pagenum, _ := strconv.Atoi(html.EscapeString(page)) - - b := model.CategoryJson{Torrents: []model.TorrentsJson{}} - maxPerPage := 50 - nbTorrents := 0 - - torrents, nbTorrents := torrentService.GetAllTorrents(maxPerPage, maxPerPage*(pagenum-1)) - for i, _ := range torrents { - res := torrents[i].ToJson() - b.Torrents = append(b.Torrents, res) - } - - b.QueryRecordCount = maxPerPage - b.TotalRecordCount = nbTorrents - w.Header().Set("Content-Type", "application/json") - err := json.NewEncoder(w).Encode(b) - - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -func apiViewHandler(w http.ResponseWriter, r *http.Request) { - - vars := mux.Vars(r) - id := vars["id"] - b := model.CategoryJson{Torrents: []model.TorrentsJson{}} - - torrent, err := torrentService.GetTorrentById(id) - res := torrent.ToJson() - b.Torrents = append(b.Torrents, res) - - b.QueryRecordCount = 1 - b.TotalRecordCount = 1 - w.Header().Set("Content-Type", "application/json") - err = json.NewEncoder(w).Encode(b) - - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -func searchHandler(w http.ResponseWriter, r *http.Request) { - var templates = template.Must(template.New("home").Funcs(funcMap).ParseFiles("templates/index.html", "templates/home.html")) - templates.ParseGlob("templates/_*.html") // common - vars := mux.Vars(r) - page := vars["page"] - - // db params url - pagenum, _ := strconv.Atoi(html.EscapeString(page)) - if pagenum == 0 { - pagenum = 1 - } - - b := []model.TorrentsJson{} - - search_param, torrents, nbTorrents := searchByQuery( r, pagenum ) - - for i, _ := range torrents { - res := torrents[i].ToJson() - b = append(b, res) - } - - navigationTorrents := Navigation{nbTorrents, search_param.Max, pagenum, "search_page"} - searchForm := SearchForm{ - search_param.Query, - search_param.Status, - search_param.Category, - search_param.Sort, - search_param.Order, - } - htv := HomeTemplateVariables{b, torrentService.GetAllCategories(false), searchForm, navigationTorrents, r.URL, mux.CurrentRoute(r)} - - err := templates.ExecuteTemplate(w, "index.html", htv) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func searchByQuery(r *http.Request, pagenum int) (SearchParam, []model.Torrents, int) { - maxPerPage, errConv := strconv.Atoi(r.URL.Query().Get("max")) - if errConv != nil { - maxPerPage = 50 // default Value maxPerPage - } - - search_param := SearchParam{} - search_param.Max = maxPerPage - search_param.Query = r.URL.Query().Get("q") - search_param.Category = r.URL.Query().Get("c") - search_param.Status = r.URL.Query().Get("s") - search_param.Sort = r.URL.Query().Get("sort") - search_param.Order = r.URL.Query().Get("order") - - catsSplit := strings.Split(search_param.Category, "_") - // need this to prevent out of index panics - var searchCatId, searchSubCatId string - if len(catsSplit) == 2 { - - searchCatId = html.EscapeString(catsSplit[0]) - searchSubCatId = html.EscapeString(catsSplit[1]) - } - if search_param.Sort == "" { - search_param.Sort = "torrent_id" - } - if search_param.Order == "" { - search_param.Order = "desc" - } - order_by := search_param.Sort + " " + search_param.Order - - parameters := torrentService.WhereParams{} - conditions := []string{} - if searchCatId != "" { - conditions = append(conditions, "category_id = ?") - parameters.Params = append(parameters.Params, searchCatId) - } - if searchSubCatId != "" { - conditions = append(conditions, "sub_category_id = ?") - parameters.Params = append(parameters.Params, searchSubCatId) - } - if search_param.Status != "" { - conditions = append(conditions, "status_id = ?") - parameters.Params = append(parameters.Params, search_param.Status) - } - searchQuerySplit := strings.Split(search_param.Query, " ") - for i, _ := range searchQuerySplit { - conditions = append(conditions, "torrent_name LIKE ?") - parameters.Params = append(parameters.Params, "%"+searchQuerySplit[i]+"%") - } - - parameters.Conditions = strings.Join(conditions[:], " AND ") - log.Infof("SQL query is :: %s\n", parameters.Conditions) - torrents, n := torrentService.GetTorrentsOrderBy(¶meters, order_by, maxPerPage, maxPerPage*(pagenum-1)) - return search_param, torrents, n -} - -func faqHandler(w http.ResponseWriter, r *http.Request) { - var templates = template.Must(template.New("FAQ").Funcs(funcMap).ParseFiles("templates/index.html", "templates/FAQ.html")) - templates.ParseGlob("templates/_*.html") // common - err := templates.ExecuteTemplate(w, "index.html", FaqTemplateVariables{Navigation{}, NewSearchForm(), r.URL, mux.CurrentRoute(r)}) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func rssHandler(w http.ResponseWriter, r *http.Request) { - - _, torrents, _ := searchByQuery( r, 1 ) - created_as_time := time.Now() - - if len(torrents) > 0 { - created_as_time = time.Unix(torrents[0].Date, 0) - } - feed := &feeds.Feed{ - Title: "Nyaa Pantsu", - Link: &feeds.Link{Href: "https://nyaa.pantsu.cat/"}, - Created: created_as_time, - } - feed.Items = []*feeds.Item{} - feed.Items = make([]*feeds.Item, len(torrents)) - - for i, _ := range torrents { - timestamp_as_time := time.Unix(torrents[0].Date, 0) - torrent_json := torrents[i].ToJson() - feed.Items[i] = &feeds.Item{ - // need a torrent view first - //Id: URL + torrents[i].Hash, - Title: torrents[i].Name, - Link: &feeds.Link{Href: string(torrent_json.Magnet)}, - Description: "", - Created: timestamp_as_time, - Updated: timestamp_as_time, - } - } - - rss, err := feed.ToRss() - if err == nil { - w.Write([]byte(rss)) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - var templates = template.Must(template.ParseFiles("templates/index.html", "templates/view.html")) - templates.ParseGlob("templates/_*.html") // common - vars := mux.Vars(r) - id := vars["id"] - - torrent, err := torrentService.GetTorrentById(id) - b := torrent.ToJson() - - htv := ViewTemplateVariables{b, NewSearchForm(), Navigation{}, r.URL, mux.CurrentRoute(r)} - - err = templates.ExecuteTemplate(w, "index.html", htv) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func rootHandler(w http.ResponseWriter, r *http.Request) { -var templates = template.Must(template.New("home").Funcs(funcMap).ParseFiles("templates/index.html", "templates/home.html")) - templates.ParseGlob("templates/_*.html") // common - vars := mux.Vars(r) - page := vars["page"] - - // db params url - maxPerPage, errConv := strconv.Atoi(r.URL.Query().Get("max")) - if errConv != nil { - maxPerPage = 50 // default Value maxPerPage - } - - nbTorrents := 0 - pagenum, _ := strconv.Atoi(html.EscapeString(page)) - if pagenum == 0 { - pagenum = 1 - } - - b := []model.TorrentsJson{} - torrents, nbTorrents := torrentService.GetAllTorrents(maxPerPage, maxPerPage*(pagenum-1)) - - for i, _ := range torrents { - res := torrents[i].ToJson() - b = append(b, res) - } - - navigationTorrents := Navigation{nbTorrents, maxPerPage, pagenum, "search_page"} - htv := HomeTemplateVariables{b, torrentService.GetAllCategories(false), NewSearchForm(), navigationTorrents, r.URL, mux.CurrentRoute(r)} - - err := templates.ExecuteTemplate(w, "index.html", htv) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - -} func RunServer(conf *config.Config) { - router = mux.NewRouter() - cssHandler := http.FileServer(http.Dir("./css/")) - jsHandler := http.FileServer(http.Dir("./js/")) - imgHandler := http.FileServer(http.Dir("./img/")) - http.Handle("/css/", http.StripPrefix("/css/", cssHandler)) - http.Handle("/js/", http.StripPrefix("/js/", jsHandler)) - http.Handle("/img/", http.StripPrefix("/img/", imgHandler)) - - // Routes, - router.HandleFunc("/", rootHandler).Name("home") - router.HandleFunc("/page/{page:[0-9]+}", rootHandler).Name("home_page") - router.HandleFunc("/search", searchHandler).Name("search") - router.HandleFunc("/search/{page}", searchHandler).Name("search_page") - router.HandleFunc("/api/{page}", apiHandler).Methods("GET") - router.HandleFunc("/api/view/{id}", apiViewHandler).Methods("GET") - router.HandleFunc("/faq", faqHandler).Name("faq") - router.HandleFunc("/feed.xml", rssHandler) - router.HandleFunc("/view/{id}", viewHandler).Name("view_torrent") - - http.Handle("/", router) + http.Handle("/", router.Router) // Set up server, srv := &http.Server{ diff --git a/router/apiHandler.go b/router/apiHandler.go new file mode 100644 index 00000000..8f3ac90c --- /dev/null +++ b/router/apiHandler.go @@ -0,0 +1,59 @@ +package router + +import( + "github.com/gorilla/mux" + "net/http" + "html" + "strconv" + "github.com/ewhal/nyaa/model" + "github.com/ewhal/nyaa/service/torrent" + "encoding/json" +) + +func ApiHandler(w http.ResponseWriter, r *http.Request) { + + vars := mux.Vars(r) + page := vars["page"] + pagenum, _ := strconv.Atoi(html.EscapeString(page)) + + b := model.CategoryJson{Torrents: []model.TorrentsJson{}} + maxPerPage := 50 + nbTorrents := 0 + + torrents, nbTorrents := torrentService.GetAllTorrents(maxPerPage, maxPerPage*(pagenum-1)) + for i, _ := range torrents { + res := torrents[i].ToJson() + b.Torrents = append(b.Torrents, res) + } + + b.QueryRecordCount = maxPerPage + b.TotalRecordCount = nbTorrents + w.Header().Set("Content-Type", "application/json") + err := json.NewEncoder(w).Encode(b) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} + +func ApiViewHandler(w http.ResponseWriter, r *http.Request) { + + vars := mux.Vars(r) + id := vars["id"] + b := model.CategoryJson{Torrents: []model.TorrentsJson{}} + + torrent, err := torrentService.GetTorrentById(id) + res := torrent.ToJson() + b.Torrents = append(b.Torrents, res) + + b.QueryRecordCount = 1 + b.TotalRecordCount = 1 + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(b) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} \ No newline at end of file diff --git a/router/faqHandler.go b/router/faqHandler.go new file mode 100644 index 00000000..d69e62e2 --- /dev/null +++ b/router/faqHandler.go @@ -0,0 +1,17 @@ +package router + + +import( + "net/http" + "html/template" + "github.com/gorilla/mux" +) + +func FaqHandler(w http.ResponseWriter, r *http.Request) { + var templates = template.Must(template.New("FAQ").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/FAQ.html")) + templates.ParseGlob("templates/_*.html") // common + err := templates.ExecuteTemplate(w, "index.html", FaqTemplateVariables{Navigation{}, NewSearchForm(), r.URL, mux.CurrentRoute(r)}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} \ No newline at end of file diff --git a/router/homeHandler.go b/router/homeHandler.go new file mode 100644 index 00000000..abc7620e --- /dev/null +++ b/router/homeHandler.go @@ -0,0 +1,47 @@ +package router + +import( + "net/http" + "html/template" + "github.com/gorilla/mux" + "html" + "strconv" + "github.com/ewhal/nyaa/model" + "github.com/ewhal/nyaa/service/torrent" +) + +func HomeHandler(w http.ResponseWriter, r *http.Request) { +var templates = template.Must(template.New("home").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/home.html")) + templates.ParseGlob("templates/_*.html") // common + vars := mux.Vars(r) + page := vars["page"] + + // db params url + maxPerPage, errConv := strconv.Atoi(r.URL.Query().Get("max")) + if errConv != nil { + maxPerPage = 50 // default Value maxPerPage + } + + nbTorrents := 0 + pagenum, _ := strconv.Atoi(html.EscapeString(page)) + if pagenum == 0 { + pagenum = 1 + } + + b := []model.TorrentsJson{} + torrents, nbTorrents := torrentService.GetAllTorrents(maxPerPage, maxPerPage*(pagenum-1)) + + for i, _ := range torrents { + res := torrents[i].ToJson() + b = append(b, res) + } + + navigationTorrents := Navigation{nbTorrents, maxPerPage, pagenum, "search_page"} + htv := HomeTemplateVariables{b, torrentService.GetAllCategories(false), NewSearchForm(), navigationTorrents, r.URL, mux.CurrentRoute(r)} + + err := templates.ExecuteTemplate(w, "index.html", htv) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + +} diff --git a/router/router.go b/router/router.go new file mode 100644 index 00000000..c6422e8e --- /dev/null +++ b/router/router.go @@ -0,0 +1,31 @@ +package router + +import ( + "github.com/gorilla/mux" + + "net/http" +) + +var Router *mux.Router + +func init() { + Router = mux.NewRouter() + + cssHandler := http.FileServer(http.Dir("./css/")) + jsHandler := http.FileServer(http.Dir("./js/")) + imgHandler := http.FileServer(http.Dir("./img/")) + http.Handle("/css/", http.StripPrefix("/css/", cssHandler)) + http.Handle("/js/", http.StripPrefix("/js/", jsHandler)) + http.Handle("/img/", http.StripPrefix("/img/", imgHandler)) + + // Routes, + Router.HandleFunc("/", HomeHandler).Name("home") + Router.HandleFunc("/page/{page:[0-9]+}", HomeHandler).Name("home_page") + Router.HandleFunc("/search", SearchHandler).Name("search") + Router.HandleFunc("/search/{page}", SearchHandler).Name("search_page") + Router.HandleFunc("/api/{page}", ApiHandler).Methods("GET") + Router.HandleFunc("/api/view/{id}", ApiViewHandler).Methods("GET") + Router.HandleFunc("/faq", FaqHandler).Name("faq") + Router.HandleFunc("/feed.xml", RssHandler) + Router.HandleFunc("/view/{id}", ViewHandler).Name("view_torrent") +} \ No newline at end of file diff --git a/router/rssHandler.go b/router/rssHandler.go new file mode 100644 index 00000000..c09b8110 --- /dev/null +++ b/router/rssHandler.go @@ -0,0 +1,47 @@ +package router + +import( + "time" + "net/http" + "github.com/gorilla/feeds" + "github.com/ewhal/nyaa/util/search" + +) + +func RssHandler(w http.ResponseWriter, r *http.Request) { + + _, torrents, _ := search.SearchByQuery( r, 1 ) + created_as_time := time.Now() + + if len(torrents) > 0 { + created_as_time = time.Unix(torrents[0].Date, 0) + } + feed := &feeds.Feed{ + Title: "Nyaa Pantsu", + Link: &feeds.Link{Href: "https://nyaa.pantsu.cat/"}, + Created: created_as_time, + } + feed.Items = []*feeds.Item{} + feed.Items = make([]*feeds.Item, len(torrents)) + + for i, _ := range torrents { + timestamp_as_time := time.Unix(torrents[0].Date, 0) + torrent_json := torrents[i].ToJson() + feed.Items[i] = &feeds.Item{ + // need a torrent view first + //Id: URL + torrents[i].Hash, + Title: torrents[i].Name, + Link: &feeds.Link{Href: string(torrent_json.Magnet)}, + Description: "", + Created: timestamp_as_time, + Updated: timestamp_as_time, + } + } + + rss, err := feed.ToRss() + if err == nil { + w.Write([]byte(rss)) + } else { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} \ No newline at end of file diff --git a/router/searchHandler.go b/router/searchHandler.go new file mode 100644 index 00000000..78186076 --- /dev/null +++ b/router/searchHandler.go @@ -0,0 +1,49 @@ +package router + +import( + "github.com/ewhal/nyaa/util/search" + "net/http" + "html/template" + "github.com/gorilla/mux" + "html" + "strconv" + "github.com/ewhal/nyaa/model" + "github.com/ewhal/nyaa/service/torrent" +) + +func SearchHandler(w http.ResponseWriter, r *http.Request) { + var templates = template.Must(template.New("home").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/home.html")) + templates.ParseGlob("templates/_*.html") // common + vars := mux.Vars(r) + page := vars["page"] + + // db params url + pagenum, _ := strconv.Atoi(html.EscapeString(page)) + if pagenum == 0 { + pagenum = 1 + } + + b := []model.TorrentsJson{} + + search_param, torrents, nbTorrents := search.SearchByQuery( r, pagenum ) + + for i, _ := range torrents { + res := torrents[i].ToJson() + b = append(b, res) + } + + navigationTorrents := Navigation{nbTorrents, search_param.Max, pagenum, "search_page"} + searchForm := SearchForm{ + search_param.Query, + search_param.Status, + search_param.Category, + search_param.Sort, + search_param.Order, + } + htv := HomeTemplateVariables{b, torrentService.GetAllCategories(false), searchForm, navigationTorrents, r.URL, mux.CurrentRoute(r)} + + err := templates.ExecuteTemplate(w, "index.html", htv) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} \ No newline at end of file diff --git a/templateFunctions.go b/router/templateFunctions.go similarity index 83% rename from templateFunctions.go rename to router/templateFunctions.go index b3d2a563..1b8618a7 100644 --- a/templateFunctions.go +++ b/router/templateFunctions.go @@ -1,4 +1,4 @@ -package main +package router import ( "html/template" @@ -8,10 +8,10 @@ import ( "strconv" ) -var funcMap = template.FuncMap{ +var FuncMap = template.FuncMap{ "min": math.Min, "genRoute": func(name string, params ...string) string { - url, err := router.Get(name).URL(params...) + url, err := Router.Get(name).URL(params...) if err == nil { return url.String() } @@ -19,11 +19,10 @@ var funcMap = template.FuncMap{ }, "genNav": func(nav Navigation, currentUrl *url.URL, pagesSelectable int) template.HTML { maxPages := math.Ceil(float64(nav.TotalItem) / float64(nav.MaxItemPerPage)) - route := router.Get(nav.Route) var ret = "" if nav.CurrentPage-1 > 0 { - url, _ := route.URL("page", "1") + url, _ := Router.Get(nav.Route).URL("page", "1") ret = ret + "
  • «
  • " } startValue := 1 @@ -37,7 +36,7 @@ var funcMap = template.FuncMap{ log.Println(nav.TotalItem) for i := startValue; i <= endValue; i++ { pageNum := strconv.Itoa(i) - url, _ := route.URL("page", pageNum) + url, _ := Router.Get(nav.Route).URL("page", pageNum) ret = ret + "" + strconv.Itoa(i) + "" } if nav.CurrentPage < int(maxPages) { - url, _ := route.URL("page", strconv.Itoa(nav.CurrentPage+1)) + url, _ := Router.Get(nav.Route).URL("page", strconv.Itoa(nav.CurrentPage+1)) ret = ret + "
  • »
  • " } return template.HTML(ret) diff --git a/templateVariables.go b/router/templateVariables.go similarity index 99% rename from templateVariables.go rename to router/templateVariables.go index 637009be..327bfa20 100644 --- a/templateVariables.go +++ b/router/templateVariables.go @@ -1,4 +1,4 @@ -package main +package router import ( "github.com/gorilla/mux" diff --git a/router/viewTorrentHandler.go b/router/viewTorrentHandler.go new file mode 100644 index 00000000..0d30094f --- /dev/null +++ b/router/viewTorrentHandler.go @@ -0,0 +1,25 @@ +package router + +import( + "net/http" + "html/template" + "github.com/gorilla/mux" + "github.com/ewhal/nyaa/service/torrent" +) + +func ViewHandler(w http.ResponseWriter, r *http.Request) { + var templates = template.Must(template.New("view").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/view.html")) + templates.ParseGlob("templates/_*.html") // common + vars := mux.Vars(r) + id := vars["id"] + + torrent, err := torrentService.GetTorrentById(id) + b := torrent.ToJson() + + htv := ViewTemplateVariables{b, NewSearchForm(), Navigation{}, r.URL, mux.CurrentRoute(r)} + + err = templates.ExecuteTemplate(w, "index.html", htv) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} \ No newline at end of file diff --git a/util/search/search.go b/util/search/search.go new file mode 100644 index 00000000..069fe00c --- /dev/null +++ b/util/search/search.go @@ -0,0 +1,76 @@ +package search + +import( + "github.com/ewhal/nyaa/model" + "github.com/ewhal/nyaa/service/torrent" + "github.com/ewhal/nyaa/util/log" + "net/http" + "html" + "strconv" + "strings" +) + +type SearchParam struct { + Category string + Order string + Query string + Max int + Status string + Sort string +} + +func SearchByQuery(r *http.Request, pagenum int) (SearchParam, []model.Torrents, int) { + maxPerPage, errConv := strconv.Atoi(r.URL.Query().Get("max")) + if errConv != nil { + maxPerPage = 50 // default Value maxPerPage + } + + search_param := SearchParam{} + search_param.Max = maxPerPage + search_param.Query = r.URL.Query().Get("q") + search_param.Category = r.URL.Query().Get("c") + search_param.Status = r.URL.Query().Get("s") + search_param.Sort = r.URL.Query().Get("sort") + search_param.Order = r.URL.Query().Get("order") + + catsSplit := strings.Split(search_param.Category, "_") + // need this to prevent out of index panics + var searchCatId, searchSubCatId string + if len(catsSplit) == 2 { + + searchCatId = html.EscapeString(catsSplit[0]) + searchSubCatId = html.EscapeString(catsSplit[1]) + } + if search_param.Sort == "" { + search_param.Sort = "torrent_id" + } + if search_param.Order == "" { + search_param.Order = "desc" + } + order_by := search_param.Sort + " " + search_param.Order + + parameters := torrentService.WhereParams{} + conditions := []string{} + if searchCatId != "" { + conditions = append(conditions, "category_id = ?") + parameters.Params = append(parameters.Params, searchCatId) + } + if searchSubCatId != "" { + conditions = append(conditions, "sub_category_id = ?") + parameters.Params = append(parameters.Params, searchSubCatId) + } + if search_param.Status != "" { + conditions = append(conditions, "status_id = ?") + parameters.Params = append(parameters.Params, search_param.Status) + } + searchQuerySplit := strings.Split(search_param.Query, " ") + for i, _ := range searchQuerySplit { + conditions = append(conditions, "torrent_name LIKE ?") + parameters.Params = append(parameters.Params, "%"+searchQuerySplit[i]+"%") + } + + parameters.Conditions = strings.Join(conditions[:], " AND ") + log.Infof("SQL query is :: %s\n", parameters.Conditions) + torrents, n := torrentService.GetTorrentsOrderBy(¶meters, order_by, maxPerPage, maxPerPage*(pagenum-1)) + return search_param, torrents, n +}