Add pagings for all and search actions
This commit is contained in:
@@ -110,8 +110,16 @@ func Edit(cfg *config.Config, w http.ResponseWriter, r *http.Request, params *Pa
|
||||
})
|
||||
}
|
||||
|
||||
const perBigPage = 500
|
||||
|
||||
func All(cfg *config.Config, w http.ResponseWriter, r *http.Request, params *Params) {
|
||||
pages, err := data.LoadAll()
|
||||
pageStr := r.URL.Query().Get("p")
|
||||
page, err := strconv.Atoi(pageStr)
|
||||
if err != nil {
|
||||
page = 1
|
||||
}
|
||||
|
||||
pages, err := data.LoadAll(page, perBigPage)
|
||||
if err != nil {
|
||||
http.Error(w, "Failed to load pages", http.StatusInternalServerError)
|
||||
return
|
||||
@@ -121,9 +129,11 @@ func All(cfg *config.Config, w http.ResponseWriter, r *http.Request, params *Par
|
||||
tmpl.Execute(w, struct {
|
||||
SiteName string
|
||||
Pages []string
|
||||
NextPage int
|
||||
}{
|
||||
SiteName: cfg.Site.Name,
|
||||
Pages: pages,
|
||||
NextPage: page + 1,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package action
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/akikareha/himewiki/internal/config"
|
||||
"github.com/akikareha/himewiki/internal/data"
|
||||
@@ -9,28 +10,42 @@ import (
|
||||
)
|
||||
|
||||
func Search(cfg *config.Config, w http.ResponseWriter, r *http.Request, params *Params) {
|
||||
pageStr := r.URL.Query().Get("p")
|
||||
page, err := strconv.Atoi(pageStr)
|
||||
if err != nil {
|
||||
page = 1
|
||||
}
|
||||
|
||||
word := r.URL.Query().Get("w")
|
||||
searchType := r.URL.Query().Get("t")
|
||||
var results []string
|
||||
if word != "" {
|
||||
searchType := r.URL.Query().Get("t")
|
||||
if searchType == "name" {
|
||||
results, _ = data.SearchNames(word)
|
||||
results, _ = data.SearchNames(word, page, perBigPage)
|
||||
} else if searchType == "content" {
|
||||
results, _ = data.SearchContents(word)
|
||||
results, _ = data.SearchContents(word, page, perBigPage)
|
||||
} else {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if searchType == "" {
|
||||
searchType = "name"
|
||||
}
|
||||
|
||||
tmpl := util.NewTemplate("search.html")
|
||||
tmpl.Execute(w, struct {
|
||||
SiteName string
|
||||
Word string
|
||||
Type string
|
||||
Word string
|
||||
Results []string
|
||||
NextPage int
|
||||
}{
|
||||
SiteName: cfg.Site.Name,
|
||||
Type: searchType,
|
||||
Word: word,
|
||||
Results: results,
|
||||
NextPage: page + 1,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -213,9 +213,18 @@ func Save(name, content string, baseRevID int) error {
|
||||
return tx.Commit(ctx)
|
||||
}
|
||||
|
||||
func LoadAll() ([]string, error) {
|
||||
func LoadAll(page int, perPage int) ([]string, error) {
|
||||
if page < 1 {
|
||||
return nil, errors.New("invalid page")
|
||||
}
|
||||
if perPage < 1 {
|
||||
return nil, errors.New("invalid perPage")
|
||||
}
|
||||
offset := (page - 1) * perPage
|
||||
|
||||
rows, err := db.Query(context.Background(),
|
||||
"SELECT name FROM pages ORDER BY name")
|
||||
"SELECT name FROM pages ORDER BY name LIMIT $1 OFFSET $2",
|
||||
perPage, offset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -366,10 +375,20 @@ func LoadRevision(name string, revID int) (string, error) {
|
||||
return content, err
|
||||
}
|
||||
|
||||
func SearchNames(word string) ([]string, error) {
|
||||
func SearchNames(word string, page int, perPage int) ([]string, error) {
|
||||
if page < 1 {
|
||||
return nil, errors.New("invalid page")
|
||||
}
|
||||
if perPage < 1 {
|
||||
return nil, errors.New("invalid perPage")
|
||||
}
|
||||
offset := (page - 1) * perPage
|
||||
|
||||
rows, err := db.Query(context.Background(),
|
||||
"SELECT name FROM pages WHERE name ILIKE '%' || $1 || '%' ORDER BY name",
|
||||
word)
|
||||
`SELECT name FROM pages WHERE name ILIKE '%' || $1 || '%'
|
||||
ORDER BY name
|
||||
LIMIT $2 OFFSET $3
|
||||
`, word, perPage, offset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -386,10 +405,20 @@ func SearchNames(word string) ([]string, error) {
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func SearchContents(word string) ([]string, error) {
|
||||
func SearchContents(word string, page int, perPage int) ([]string, error) {
|
||||
if page < 1 {
|
||||
return nil, errors.New("invalid page")
|
||||
}
|
||||
if perPage < 1 {
|
||||
return nil, errors.New("invalid perPage")
|
||||
}
|
||||
offset := (page - 1) * perPage
|
||||
|
||||
rows, err := db.Query(context.Background(),
|
||||
"SELECT name FROM pages WHERE content ILIKE '%' || $1 || '%' ORDER BY name",
|
||||
word)
|
||||
`SELECT name FROM pages WHERE content ILIKE '%' || $1 || '%'
|
||||
ORDER BY name
|
||||
LIMIT $2 OFFSET $3
|
||||
`, word, perPage, offset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -25,6 +25,11 @@
|
||||
{{end}}
|
||||
</ul>
|
||||
|
||||
<div class="menu">
|
||||
<br />
|
||||
<a href="/?a=all&p={{.NextPage}}">Next</a>
|
||||
</div>
|
||||
|
||||
<div class="menu">
|
||||
<br />
|
||||
<a href="/"><img src="/logo.png?a=static" alt="{{.SiteName}}" /></a>
|
||||
|
||||
@@ -46,6 +46,11 @@ Content Search
|
||||
<li>No results found.</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
|
||||
<div class="menu">
|
||||
<br />
|
||||
<a href="/?a=search&t={{.Type}}&w={{.Word | urlquery}}&p={{.NextPage}}">Next</a>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="menu">
|
||||
|
||||
Reference in New Issue
Block a user