diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..1844511 --- /dev/null +++ b/config/config.go @@ -0,0 +1,23 @@ +package config + +import ( + "fmt" + "local/args" +) + +var ( + Port string +) + +func init() { + New() +} + +func New() { + as := args.NewArgSet() + as.Append(args.INT, "p", "port to listen on", 52222) + if err := as.Parse(); err != nil { + panic(err) + } + Port = fmt.Sprintf(":%d", as.GetInt("p")) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..aa49357 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import "local/cheqbooq/server" + +func main() { + if s, err := server.New(); err != nil { + panic(err) + } else if err := s.Routes(); err != nil { + panic(err) + } else if err := s.Listen(); err != nil { + panic(err) + } +} diff --git a/server/account/read.go b/server/account/read.go new file mode 100644 index 0000000..9f6efb6 --- /dev/null +++ b/server/account/read.go @@ -0,0 +1,7 @@ +package account + +import "net/http" + +func Read(w http.ResponseWriter, r *http.Request) { + http.Error(w, "not impl", http.StatusNotImplemented) +} diff --git a/server/account/readrequest.go b/server/account/readrequest.go new file mode 100644 index 0000000..bf30961 --- /dev/null +++ b/server/account/readrequest.go @@ -0,0 +1,5 @@ +package account + +type ReadRequest struct { + Accounts []string `json:"accounts"` +} diff --git a/server/account/readresponse.go b/server/account/readresponse.go new file mode 100644 index 0000000..3309c5e --- /dev/null +++ b/server/account/readresponse.go @@ -0,0 +1,8 @@ +package account + +import "encoding/json" + +type ReadResponse map[string]struct { + Name string `json:"name"` + Meta json.RawMessage `json:"meta"` +} diff --git a/server/account/write.go b/server/account/write.go new file mode 100644 index 0000000..7e05f4c --- /dev/null +++ b/server/account/write.go @@ -0,0 +1,7 @@ +package account + +import "net/http" + +func Write(w http.ResponseWriter, r *http.Request) { + http.Error(w, "not impl", http.StatusNotImplemented) +} diff --git a/server/account/writerequest.go b/server/account/writerequest.go new file mode 100644 index 0000000..e2e67e7 --- /dev/null +++ b/server/account/writerequest.go @@ -0,0 +1,5 @@ +package account + +import "local/cheqbooq/server/transaction" + +type WriteRequest transaction.WriteRequest diff --git a/server/account/writeresponse.go b/server/account/writeresponse.go new file mode 100644 index 0000000..6d20911 --- /dev/null +++ b/server/account/writeresponse.go @@ -0,0 +1,5 @@ +package account + +import "local/cheqbooq/server/transaction" + +type WriteResponse transaction.WriteResponse diff --git a/server/balance/read.go b/server/balance/read.go new file mode 100644 index 0000000..acfc5f5 --- /dev/null +++ b/server/balance/read.go @@ -0,0 +1,7 @@ +package balance + +import "net/http" + +func Read(w http.ResponseWriter, r *http.Request) { + http.Error(w, "not impl", http.StatusNotImplemented) +} diff --git a/server/balance/readrequest.go b/server/balance/readrequest.go new file mode 100644 index 0000000..7290ab1 --- /dev/null +++ b/server/balance/readrequest.go @@ -0,0 +1,7 @@ +package balance + +type ReadRequest struct { + Accounts []string `json:"accounts"` + Start int64 `json:"start"` + Stop int64 `json:"stop"` +} diff --git a/server/balance/readresponse.go b/server/balance/readresponse.go new file mode 100644 index 0000000..93b4323 --- /dev/null +++ b/server/balance/readresponse.go @@ -0,0 +1,3 @@ +package balance + +type ReadResponse map[string]map[int64]float32 diff --git a/server/balance/writerequest.go b/server/balance/writerequest.go new file mode 100644 index 0000000..fafc330 --- /dev/null +++ b/server/balance/writerequest.go @@ -0,0 +1 @@ +package balance diff --git a/server/balance/writeresponse.go b/server/balance/writeresponse.go new file mode 100644 index 0000000..fafc330 --- /dev/null +++ b/server/balance/writeresponse.go @@ -0,0 +1 @@ +package balance diff --git a/server/listen.go b/server/listen.go new file mode 100644 index 0000000..cb196ef --- /dev/null +++ b/server/listen.go @@ -0,0 +1,10 @@ +package server + +import ( + "local/cheqbooq/config" + "net/http" +) + +func (s *Server) Listen() error { + return http.ListenAndServe(config.Port, s) +} diff --git a/server/routes.go b/server/routes.go new file mode 100644 index 0000000..aaf3642 --- /dev/null +++ b/server/routes.go @@ -0,0 +1,53 @@ +package server + +import ( + "local/cheqbooq/server/account" + "local/cheqbooq/server/balance" + "local/cheqbooq/server/transaction" + "net/http" +) + +func (s *Server) Routes() error { + routes := map[string]http.HandlerFunc{ + "v1/balance": s.balance1, + "v1/transaction": s.transaction1, + "v1/account": s.account1, + } + for path, handler := range routes { + if err := s.Add(path, handler); err != nil { + return err + } + } + return nil +} + +func (s *Server) balance1(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodPost: + balance.Read(w, r) + default: + http.NotFound(w, r) + } +} + +func (s *Server) transaction1(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodPost: + transaction.Read(w, r) + case http.MethodPatch: + transaction.Write(w, r) + default: + http.NotFound(w, r) + } +} + +func (s *Server) account1(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodPost: + account.Read(w, r) + case http.MethodPatch: + account.Write(w, r) + default: + http.NotFound(w, r) + } +} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..abf22d9 --- /dev/null +++ b/server/server.go @@ -0,0 +1,13 @@ +package server + +import "local/router" + +type Server struct { + *router.Router +} + +func New() (*Server, error) { + return &Server{ + Router: router.New(), + }, nil +} diff --git a/server/transaction/read.go b/server/transaction/read.go new file mode 100644 index 0000000..aff2fa5 --- /dev/null +++ b/server/transaction/read.go @@ -0,0 +1,7 @@ +package transaction + +import "net/http" + +func Read(w http.ResponseWriter, r *http.Request) { + http.Error(w, "not impl", http.StatusNotImplemented) +} diff --git a/server/transaction/readrequest.go b/server/transaction/readrequest.go new file mode 100644 index 0000000..d54f2c3 --- /dev/null +++ b/server/transaction/readrequest.go @@ -0,0 +1,5 @@ +package transaction + +import "local/cheqbooq/server/balance" + +type ReadRequest balance.ReadRequest diff --git a/server/transaction/readresponse.go b/server/transaction/readresponse.go new file mode 100644 index 0000000..2cee5fd --- /dev/null +++ b/server/transaction/readresponse.go @@ -0,0 +1,3 @@ +package transaction + +type ReadResponse map[string]map[string]Transaction diff --git a/server/transaction/transaction.go b/server/transaction/transaction.go new file mode 100644 index 0000000..0b0e52c --- /dev/null +++ b/server/transaction/transaction.go @@ -0,0 +1,10 @@ +package transaction + +import "encoding/json" + +type Transaction struct { + Account string `json:"account"` + Amount float32 `json:"amount"` + Timestamp int64 `json:"timestamp"` + Meta json.RawMessage `json:"meta"` +} diff --git a/server/transaction/write.go b/server/transaction/write.go new file mode 100644 index 0000000..997d283 --- /dev/null +++ b/server/transaction/write.go @@ -0,0 +1,7 @@ +package transaction + +import "net/http" + +func Write(w http.ResponseWriter, r *http.Request) { + http.Error(w, "not impl", http.StatusNotImplemented) +} diff --git a/server/transaction/writerequest.go b/server/transaction/writerequest.go new file mode 100644 index 0000000..ad5f5d0 --- /dev/null +++ b/server/transaction/writerequest.go @@ -0,0 +1,7 @@ +package transaction + +type WriteRequest map[string][]struct { + Op string `json:"op"` + Path string `json:"path"` + Value interface{} `json:"value"` +} diff --git a/server/transaction/writeresponse.go b/server/transaction/writeresponse.go new file mode 100644 index 0000000..7d2e641 --- /dev/null +++ b/server/transaction/writeresponse.go @@ -0,0 +1,6 @@ +package transaction + +type WriteResponse map[string][]struct { + OK bool `json:"ok"` + Message string `json:"message,omitempty"` +}