103 lines
2.4 KiB
Go
Executable File
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})
|
|
}
|