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 "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) 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}) }