ledger-ui/server.go

103 lines
2.4 KiB
Go
Executable File

package main
import (
_ "embed"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
//go:embed public/index.html
var index string
type Server struct {
ledger Ledger
debug bool
}
func (server Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method + r.URL.Path)
switch r.Method + r.URL.Path {
case "GET/api/transactions":
server.getTransactions(w, r)
case "POST/api/transactions":
server.postTransactions(w, r)
case "PUT/api/transactions":
server.putTransactions(w, r)
case "GET/api/balances":
server.getBalances(w, r)
default:
if server.debug {
b, _ := ioutil.ReadFile("./public/index.html")
w.Write(b)
} else {
fmt.Fprint(w, index)
}
}
}
func (server Server) err(w http.ResponseWriter, r *http.Request, err error) {
log.Println(r.Method, r.URL.Path, err)
http.Error(w, fmt.Sprint(err.Error()), http.StatusInternalServerError)
}
func (server Server) getTransactions(w http.ResponseWriter, r *http.Request) {
transactions, err := server.ledger.Transactions()
if err != nil {
server.err(w, r, err)
return
}
json.NewEncoder(w).Encode(map[string]interface{}{"Transactions": transactions})
}
func (server Server) postTransactions(w http.ResponseWriter, r *http.Request) {
var request struct {
Transaction
}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
server.err(w, r, err)
return
}
if err := server.ledger.NewTransaction(); err != nil {
server.err(w, r, err)
return
}
transactions, err := server.ledger.Transactions()
if err != nil {
server.err(w, r, err)
return
}
if err := server.ledger.SetTransaction(len(transactions)-1, request.Transaction); err != nil {
server.err(w, r, err)
return
}
json.NewEncoder(w).Encode(map[string]interface{}{"ok": true})
}
func (server Server) putTransactions(w http.ResponseWriter, r *http.Request) {
var request struct {
IDX int `json:"idx"`
Transaction
}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
server.err(w, r, err)
return
}
if err := server.ledger.SetTransaction(request.IDX, request.Transaction); err != nil {
server.err(w, r, err)
return
}
json.NewEncoder(w).Encode(map[string]interface{}{"ok": true})
}
func (server Server) getBalances(w http.ResponseWriter, r *http.Request) {
balances, err := server.ledger.Balances()
if err != nil {
server.err(w, r, err)
return
}
json.NewEncoder(w).Encode(map[string]interface{}{"Balances": balances})
}