2017-05-05 16:39:15 +02:00
package search
2017-05-06 12:41:48 +02:00
import (
2017-05-05 16:39:15 +02:00
"github.com/ewhal/nyaa/model"
"github.com/ewhal/nyaa/service/torrent"
"github.com/ewhal/nyaa/util/log"
"html"
2017-05-06 12:41:48 +02:00
"net/http"
2017-05-05 16:39:15 +02:00
"strconv"
"strings"
)
type SearchParam struct {
2017-05-06 12:41:48 +02:00
Category string
Order string
Query string
Max int
Status string
Sort string
2017-05-05 16:39:15 +02:00
}
2017-05-07 23:01:06 +02:00
// super hacky fix:
var search_op string
func Init ( backend string ) {
if backend == "postgres" {
search_op = "ILIKE"
} else {
search_op = "LIKE"
}
}
2017-05-05 16:39:15 +02:00
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
}
2017-05-06 12:41:48 +02:00
if maxPerPage > 300 {
maxPerPage = 300
}
2017-05-07 23:41:44 +02:00
search_param := SearchParam { }
2017-05-05 16:39:15 +02:00
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 != "" {
2017-05-05 22:30:56 +02:00
if search_param . Status == "2" {
conditions = append ( conditions , "status_id != ?" )
} else {
conditions = append ( conditions , "status_id = ?" )
}
2017-05-05 16:39:15 +02:00
parameters . Params = append ( parameters . Params , search_param . Status )
}
searchQuerySplit := strings . Split ( search_param . Query , " " )
2017-05-07 23:41:44 +02:00
for i , _ := range searchQuerySplit {
conditions = append ( conditions , "torrent_name " + search_op + " ?" )
2017-05-05 16:39:15 +02:00
parameters . Params = append ( parameters . Params , "%" + searchQuerySplit [ i ] + "%" )
}
parameters . Conditions = strings . Join ( conditions [ : ] , " AND " )
log . Infof ( "SQL query is :: %s\n" , parameters . Conditions )
2017-05-07 23:41:44 +02:00
torrents , n := torrentService . GetTorrentsOrderBy ( & parameters , order_by , maxPerPage , maxPerPage * ( pagenum - 1 ) )
return search_param , torrents , n
2017-05-05 16:39:15 +02:00
}