Add paging for revisions action
This commit is contained in:
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<div><code>
|
||||
{{.Diff | fmtdiff}}
|
||||
</code></div>
|
||||
<hr />
|
||||
{{else}}
|
||||
<p>No pages yet.</p>
|
||||
{{end}}
|
||||
|
||||
@@ -35,6 +35,11 @@ No revisions found.
|
||||
{{end}}
|
||||
</ul>
|
||||
|
||||
<div class="menu">
|
||||
<br />
|
||||
<a href="/{{.Name | pathescape}}?a=revs&p={{.NextPage}}">Next</a>
|
||||
</div>
|
||||
|
||||
<div class="menu">
|
||||
<br />
|
||||
<a href="/"><img src="/logo.png?a=static" alt="{{.SiteName}}" /></a>
|
||||
|
||||
Reference in New Issue
Block a user