From d0e2d7e3253f0d4dc0489582918becf92e2f3ec8 Mon Sep 17 00:00:00 2001 From: Aki Kareha Date: Sat, 27 Sep 2025 19:54:45 +0900 Subject: [PATCH] Add paging for revisions action --- internal/action/revisions.go | 11 ++++++++++- internal/data/data.go | 19 ++++++++++++++++--- internal/util/templates/recent.html | 1 + internal/util/templates/revisions.html | 5 +++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/internal/action/revisions.go b/internal/action/revisions.go index 967cf6c..3cd4452 100644 --- a/internal/action/revisions.go +++ b/internal/action/revisions.go @@ -4,6 +4,7 @@ import ( "html/template" "net/http" "net/url" + "strconv" "github.com/akikareha/himewiki/internal/config" "github.com/akikareha/himewiki/internal/data" @@ -12,7 +13,13 @@ import ( ) func Revisions(cfg *config.Config, w http.ResponseWriter, r *http.Request, params *Params) { - revs, err := data.LoadRevisions(params.DbName) + pageStr := r.URL.Query().Get("p") + page, err := strconv.Atoi(pageStr) + if err != nil { + page = 1 + } + + revs, err := data.LoadRevisions(params.DbName, page, perPage) if err != nil { http.Error(w, "Failed to load revisions", http.StatusInternalServerError) return @@ -24,11 +31,13 @@ tmpl.Execute(w, struct { Name string Title string Revisions []data.Revision + NextPage int }{ SiteName: cfg.Site.Name, Name: params.Name, Title: params.DbName, Revisions: revs, + NextPage: page + 1, }) } diff --git a/internal/data/data.go b/internal/data/data.go index e9a275e..784c556 100644 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -298,12 +298,22 @@ type Revision struct { CreatedAt time.Time } -func LoadRevisions(name string) ([]Revision, error) { +func LoadRevisions(name string, page int, perPage int) ([]Revision, 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 id, name, content, created_at FROM revisions WHERE name=$1 - ORDER BY created_at DESC`, name) + ORDER BY created_at DESC + LIMIT $2 OFFSET $3 + `, name, perPage + 1, offset) if err != nil { return nil, err } @@ -321,9 +331,12 @@ func LoadRevisions(name string) ([]Revision, error) { for i := 0; i < len(revs) - 1; i++ { revs[i].Diff = diff(revs[i + 1].Content, revs[i].Content) } - if len(revs) > 0 { + if len(revs) > 0 && len(revs) < perPage + 1 { revs[len(revs) - 1].Diff = diff("", revs[len(revs) - 1].Content) } + if len(revs) > perPage { + revs = revs[:perPage] + } return revs, nil } diff --git a/internal/util/templates/recent.html b/internal/util/templates/recent.html index e44255f..47ef48e 100644 --- a/internal/util/templates/recent.html +++ b/internal/util/templates/recent.html @@ -22,6 +22,7 @@
{{.Diff | fmtdiff}}
+
{{else}}

No pages yet.

{{end}} diff --git a/internal/util/templates/revisions.html b/internal/util/templates/revisions.html index d10baa2..6523788 100644 --- a/internal/util/templates/revisions.html +++ b/internal/util/templates/revisions.html @@ -35,6 +35,11 @@ No revisions found. {{end}} + +