From 81be6b2b36ef263f4e2fee2b98b34555fd645c8b Mon Sep 17 00:00:00 2001 From: Aki Kareha Date: Sat, 27 Sep 2025 20:44:44 +0900 Subject: [PATCH] Add pagings for all and search actions --- internal/action/edit.go | 12 +++++++- internal/action/search.go | 23 ++++++++++++--- internal/data/data.go | 45 ++++++++++++++++++++++++----- internal/util/templates/all.html | 5 ++++ internal/util/templates/search.html | 5 ++++ 5 files changed, 77 insertions(+), 13 deletions(-) diff --git a/internal/action/edit.go b/internal/action/edit.go index 3d972e2..1b530ad 100644 --- a/internal/action/edit.go +++ b/internal/action/edit.go @@ -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, }) } diff --git a/internal/action/search.go b/internal/action/search.go index 5c2da05..b0f28b4 100644 --- a/internal/action/search.go +++ b/internal/action/search.go @@ -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, }) } diff --git a/internal/data/data.go b/internal/data/data.go index 784c556..179ceba 100644 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -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 } diff --git a/internal/util/templates/all.html b/internal/util/templates/all.html index ba3e152..c614aa5 100644 --- a/internal/util/templates/all.html +++ b/internal/util/templates/all.html @@ -25,6 +25,11 @@ {{end}} + +