ui balance filters and groups to houseyMcHouseface

main
bel 2024-07-20 09:48:46 -06:00
parent 6d174b031b
commit ee6ce95c0a
3 changed files with 44 additions and 35 deletions

View File

@ -1,32 +1,16 @@
package http package http
import ( import (
"embed"
"flag" "flag"
"fmt" "fmt"
"io/fs"
"log" "log"
"net/http" "net/http"
"os"
_ "embed" _ "embed"
"gogs.inhome.blapointe.com/ana-ledger/src/ledger" "gogs.inhome.blapointe.com/ana-ledger/src/ledger"
) )
//go:embed public/*
var _staticFileDir embed.FS
var publicHandler = func() http.Handler {
if os.Getenv("DEBUG") != "" {
return http.FileServer(http.Dir("./http/public"))
}
sub, err := fs.Sub(_staticFileDir, "public")
if err != nil {
panic(err)
}
return http.FileServer(http.FS(sub))
}()
func Main() { func Main() {
likeName := flag.String("like-name", ".", "regexp to match") likeName := flag.String("like-name", ".", "regexp to match")
likeBefore := flag.String("like-before", "9", "date str to compare") likeBefore := flag.String("like-before", "9", "date str to compare")

View File

@ -35,12 +35,14 @@
function load() { function load() {
http("GET", "/api/transactions" /*?f="+f*/, (body, status) => { http("GET", "/api/transactions" /*?f="+f*/, (body, status) => {
var d = JSON.parse(body) var d = JSON.parse(body)
console.log("loading", d)
loadBalances(d.balances) loadBalances(d.balances)
loadDeltas(d.deltas) loadDeltas(d.deltas)
loadLastNLines(d.lastNLines) loadLastNLines(d.lastNLines)
}) })
} }
function loadBalances(balances) { function loadBalances(balances) {
console.log("loading balances", balances)
var result = `<table>` var result = `<table>`
for (var k in balances) { for (var k in balances) {
result += `<tr style="display: flex; flex-direction: row; width: 100%; justify-content: space-between;"><td>${k}</td><td>${Math.floor(balances[k]["$"])}</td></tr>` result += `<tr style="display: flex; flex-direction: row; width: 100%; justify-content: space-between;"><td>${k}</td><td>${Math.floor(balances[k]["$"])}</td></tr>`

View File

@ -1,10 +1,12 @@
package http package http
import ( import (
"embed"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/fs"
"net/http" "net/http"
"path" "os"
"slices" "slices"
"strconv" "strconv"
"strings" "strings"
@ -15,6 +17,9 @@ import (
"gogs.inhome.blapointe.com/ana-ledger/src/view" "gogs.inhome.blapointe.com/ana-ledger/src/view"
) )
//go:embed public/*
var _staticFileDir embed.FS
type Router struct { type Router struct {
files ledger.Files files ledger.Files
like struct { like struct {
@ -42,38 +47,48 @@ func NewRouter(files ledger.Files, likeName, likeBefore, likeAfter string, group
} }
func (router Router) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (router Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
bpis, err := router.bpis() switch strings.Split(r.URL.Path, "/")[1] {
if err != nil { case "api":
panic(err) router.API(w, r)
default:
router.FS(w, r)
} }
}
if !strings.HasPrefix(r.URL.Path, "/api") { func (router Router) FS(w http.ResponseWriter, r *http.Request) {
publicHandler.ServeHTTP(w, r) if os.Getenv("DEBUG") != "" {
return http.FileServer(http.Dir("./http/public")).ServeHTTP(w, r)
} } else {
sub, err := fs.Sub(_staticFileDir, "public")
reqF := router.files
if queryF := r.URL.Query().Get("f"); queryF != "" {
queryF = path.Join("http", queryF)
reqF, err = ledger.NewFiles(queryF)
if err != nil { if err != nil {
panic(err) panic(err)
} }
http.FileServer(http.FS(sub)).ServeHTTP(w, r)
} }
}
func (router Router) API(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path { switch r.URL.Path {
case "/api/transactions": case "/api/transactions":
lastNLines, err := reqF.TempGetLastNLines(20) bpis, err := router.bpis()
if err != nil { if err != nil {
panic(err) panic(err)
} }
deltas, err := reqF.Deltas()
lastNLines, err := router.files.TempGetLastNLines(20)
if err != nil {
panic(err)
}
deltas, err := router.files.Deltas()
if err != nil { if err != nil {
panic(err) panic(err)
} }
json.NewEncoder(w).Encode(map[string]any{ json.NewEncoder(w).Encode(map[string]any{
"deltas": deltas.Like(ledger.LikeAfter(time.Now().Add(-1 * time.Hour * 24 * 365 / 2).Format("2006-01"))), "deltas": deltas.Like(ledger.LikeAfter(time.Now().Add(-1 * time.Hour * 24 * 365 / 2).Format("2006-01"))),
"balances": deltas.Balances().Like("^AssetAccount:").WithBPIs(bpis), "balances": deltas.Balances().
Like("^(Bel:Asset|Zach:Asset|HouseyMcHouseface:Debts:Credit)").
Group(`^[^:]*`).
WithBPIs(bpis),
"lastNLines": lastNLines, "lastNLines": lastNLines,
}) })
return return
@ -86,14 +101,14 @@ func (router Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := json.NewDecoder(r.Body).Decode(&lines); err != nil { if err := json.NewDecoder(r.Body).Decode(&lines); err != nil {
panic(err) panic(err)
} }
if err := reqF.TempSetLastNLines(20, lines); err != nil { if err := router.files.TempSetLastNLines(20, lines); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadRequest)
} }
w.WriteHeader(http.StatusResetContent) w.WriteHeader(http.StatusResetContent)
return return
} }
deltas, err := reqF.Deltas() deltas, err := router.files.Deltas()
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -178,6 +193,10 @@ func (router Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err != nil { if err != nil {
panic(err) panic(err)
} }
bpis, err := router.bpis()
if err != nil {
panic(err)
}
bpis, err = ana.BPIsWithFixedGrowthPrediction(bpis, window, currency, rate) bpis, err = ana.BPIsWithFixedGrowthPrediction(bpis, window, currency, rate)
if err != nil { if err != nil {
panic(err) panic(err)
@ -186,6 +205,10 @@ func (router Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
if r.URL.Query().Get("bpi") == "true" { if r.URL.Query().Get("bpi") == "true" {
bpis, err := router.bpis()
if err != nil {
panic(err)
}
register = register.WithBPIs(bpis) register = register.WithBPIs(bpis)
predicted = predicted.WithBPIs(bpis) predicted = predicted.WithBPIs(bpis)
} }