diff --git a/server.go b/server.go index 0bd2c9b..acacb95 100755 --- a/server.go +++ b/server.go @@ -22,6 +22,8 @@ func (server Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { 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": @@ -50,6 +52,30 @@ func (server Server) getTransactions(w http.ResponseWriter, r *http.Request) { 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"` diff --git a/server_test.go b/server_test.go new file mode 100644 index 0000000..fdfa3f7 --- /dev/null +++ b/server_test.go @@ -0,0 +1,48 @@ +package main + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestServerPostTransactions(t *testing.T) { + path := testLedgerFile(t) + ledger, err := NewLedger(path) + if err != nil { + t.Fatal(err) + } + server := Server{ledger: ledger} + + r := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(`{ + "Date": "2099-02-03", + "Description": "test", + "Payer": "payer", + "Payee": "payee", + "Amount": 1.02 + }`)) + w := httptest.NewRecorder() + server.postTransactions(w, r) + + if w.Code != http.StatusOK { + t.Fatal(w.Code) + } + if s := strings.TrimSpace(string(w.Body.Bytes())); s != `{"ok":true}` { + t.Fatal(s) + } + + transactions, err := ledger.Transactions() + if err != nil { + t.Fatal(err) + } + if transactions[len(transactions)-1] != (Transaction{ + Date: "2099-02-03", + Description: "test", + Payer: "payer", + Payee: "payee", + Amount: 1.02, + }) { + t.Fatal(transactions[len(transactions)-1]) + } +}