You've already forked golang-base-project
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package routes
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/uberswe/golang-base-project/models"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
)
|
|
|
|
// SearchData holds additional data needed to render the search HTML page
|
|
type SearchData struct {
|
|
PageData
|
|
Results []models.Website
|
|
Prev bool
|
|
Next bool
|
|
PrevURL string
|
|
NextURL string
|
|
}
|
|
|
|
// Search renders the search HTML page and any search results
|
|
func (controller Controller) Search(c *gin.Context) {
|
|
page := 1
|
|
resultsPerPage := 5
|
|
pdS := controller.DefaultPageData(c)
|
|
pdS.Title = pdS.Trans("Search")
|
|
pd := SearchData{
|
|
PageData: pdS,
|
|
}
|
|
search := ""
|
|
if c.Request.Method == "POST" && c.Request.RequestURI == "/search" {
|
|
search = c.PostForm("search")
|
|
c.Redirect(http.StatusTemporaryRedirect, fmt.Sprintf("/search/1/%s", url.QueryEscape(search)))
|
|
return
|
|
} else {
|
|
search = c.Param("query")
|
|
if i, err := strconv.Atoi(c.Param("page")); err == nil {
|
|
page = i
|
|
}
|
|
}
|
|
|
|
var results []models.Website
|
|
|
|
log.Println(search)
|
|
searchFilter := fmt.Sprintf("%s%s%s", "%", search, "%")
|
|
search2 := fmt.Sprintf("%s%s", "%", search)
|
|
search4 := fmt.Sprintf("%s%s", search, "%")
|
|
|
|
res := controller.db.
|
|
Raw(fmt.Sprintf("SELECT * FROM websites WHERE title LIKE ? OR description LIKE ? ORDER BY CASE WHEN title LIKE ? OR description LIKE ? THEN 1 WHEN title LIKE ? OR description LIKE ? THEN 2 WHEN title LIKE ? OR description LIKE ? THEN 4 ELSE 3 END LIMIT %d OFFSET %d", resultsPerPage, resultsPerPage*(page-1)), searchFilter, searchFilter, search, search, search2, search2, search4, search4).
|
|
Find(&results)
|
|
|
|
if res.Error != nil || len(results) == 0 {
|
|
pd.Messages = append(pd.Messages, Message{
|
|
Type: "error",
|
|
Content: pdS.Trans("No results found"),
|
|
})
|
|
log.Println(res.Error)
|
|
c.HTML(http.StatusOK, "search.html", pd)
|
|
return
|
|
}
|
|
|
|
pd.Results = results
|
|
if len(pd.Results) >= resultsPerPage {
|
|
pd.Next = true
|
|
pd.NextURL = fmt.Sprintf("/search/%d/%s", page+1, url.QueryEscape(search))
|
|
}
|
|
if page > 1 {
|
|
pd.Prev = true
|
|
pd.PrevURL = fmt.Sprintf("/search/%d/%s", page-1, url.QueryEscape(search))
|
|
}
|
|
|
|
c.HTML(http.StatusOK, "search.html", pd)
|
|
}
|