ui balance filters and groups to houseyMcHouseface
parent
6d174b031b
commit
ee6ce95c0a
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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>`
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue