Add query function

This commit is contained in:
Wancat
2022-11-05 00:13:21 +08:00
parent 4ae49b5db6
commit ae86204c84
7 changed files with 56 additions and 32 deletions

View File

@@ -1,7 +1,7 @@
package main package main
var SCRIPTS = map[string][]string{ var SCRIPTS = map[string]string{
"balance assets": {"b", "assets", "-X", "$"}, "balance assets": "b assets -X $",
"register": {"r", "--tail", "10"}, "register": "r --tail 10",
"balance this month": {"b", "-b", "this month"}, "balance this month": "b -b \"this month\"",
} }

View File

@@ -33,7 +33,7 @@ func router() *gin.Engine {
authZone.GET("/dashboard", func(c *gin.Context) { authZone.GET("/dashboard", func(c *gin.Context) {
HTML(c, 200, "dashboard.html", struct { HTML(c, 200, "dashboard.html", struct {
Templates []*template.Template Templates []*template.Template
Scripts map[string][]string Scripts map[string]string
}{ }{
ledgerTpl.Templates(), ledgerTpl.Templates(),
SCRIPTS, SCRIPTS,
@@ -69,16 +69,6 @@ func router() *gin.Engine {
}{tx}) }{tx})
}) })
authZone.GET("/exec", func(c *gin.Context) {
user := getUser(c)
name, _ := c.GetQuery("name")
if err := user.executeScript(c.Writer, name); err != nil {
c.AbortWithError(500, err)
log.Println(err)
return
}
})
authZone.GET("/edit", func(c *gin.Context) { authZone.GET("/edit", func(c *gin.Context) {
user := getUser(c) user := getUser(c)
f, err := user.ReadFile(DEFAULT_JOURNAL) f, err := user.ReadFile(DEFAULT_JOURNAL)
@@ -110,5 +100,24 @@ func router() *gin.Engine {
c.FileAttachment(user.FilePath(DEFAULT_JOURNAL), DEFAULT_JOURNAL) c.FileAttachment(user.FilePath(DEFAULT_JOURNAL), DEFAULT_JOURNAL)
}) })
authZone.GET("/query", func(c *gin.Context) {
response := struct {
Query string
Result string
Scripts map[string]string
}{Scripts: SCRIPTS}
user := getUser(c)
var ok bool
var err error
response.Query, ok = c.GetQuery("query")
if ok && response.Query != "" {
response.Result, err = user.query(response.Query)
if err != nil {
panic(err)
}
}
HTML(c, 200, "query.html", response)
})
return r return r
} }

View File

@@ -11,10 +11,5 @@
<label>Tx Name: <input name="name" type="text"></label></br> <label>Tx Name: <input name="name" type="text"></label></br>
<input type="submit"> <input type="submit">
</form> </form>
<h2>Scripts</h2> {{ template "scripts" .Scripts }}
<ul>
{{ range $k, $v := .Scripts }}
<li><a href="/exec?name={{ $k }}">{{ $k }}</a></li>
{{ end }}
</ul>
{{ end }} {{ end }}

View File

@@ -9,9 +9,10 @@
<ul> <ul>
{{ with .User }} {{ with .User }}
{{ .Email }} {{ .Email }}
<li><a href="dashboard">儀表板</a></li>
<li><a href="edit">編輯</a></li> <li><a href="edit">編輯</a></li>
<li><a href="download">下載</a></li> <li><a href="download">下載</a></li>
<li><a href="exec">查詢</a></li> <li><a href="query">查詢</a></li>
{{ end }} {{ end }}
</nav> </nav>
{{ block "main" .Data }} {{ block "main" .Data }}

View File

@@ -0,0 +1,8 @@
{{ define "scripts" }}
<h3>常用指令</h3>
<ul>
{{ range $k, $v := . }}
<li><a href="/query?query={{ urlquery $v }}">{{ $k }}</a></li>
{{ end }}
</ul>
{{ end }}

12
templates/query.html Normal file
View File

@@ -0,0 +1,12 @@
{{ define "title" }}查詢{{ end }}
{{ define "main" }}
<h1>查詢</h1>
{{ with .Result }}
<pre><code>{{ . }}</code></pre>
{{ end }}
<form action="/query" method="GET">
<input type="text" name="query" value="{{ .Query }}" autofocus>
<input type="submit" value="查詢">
</form>
{{ template "scripts" .Scripts }}
{{ end }}

19
tx.go
View File

@@ -2,7 +2,6 @@ package main
import ( import (
"bytes" "bytes"
"fmt"
"io" "io"
"os/exec" "os/exec"
"strings" "strings"
@@ -48,14 +47,14 @@ func (u *User) overwriteFile(tx string) (err error) {
return err return err
} }
func (u *User) executeScript(w io.Writer, name string) (err error) { func (u *User) query(query string) (result string, err error) {
script, ok := SCRIPTS[name] var buf bytes.Buffer
if !ok {
return fmt.Errorf("%s script not found", name) cmd := exec.Command("ledger", "--file", DEFAULT_JOURNAL)
}
cmd := exec.Command("ledger", append([]string{"--file", DEFAULT_JOURNAL}, script...)...)
cmd.Dir = u.Dir() cmd.Dir = u.Dir()
cmd.Stdout = w cmd.Stdin = strings.NewReader(query)
cmd.Stderr = w cmd.Stdout = &buf
return cmd.Run() cmd.Stderr = &buf
err = cmd.Run()
return buf.String(), err
} }