Add pagings for all and search actions

This commit is contained in:
2025-09-27 20:44:44 +09:00
parent d0e2d7e325
commit 81be6b2b36
5 changed files with 77 additions and 13 deletions

View File

@@ -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,
})
}

View File

@@ -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,
})
}

View File

@@ -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
}

View File

@@ -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>

View File

@@ -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">