cmd/baseserver, */rest: allow baseserver to choose which handlers to use

Make handlers easily configurable to use in cmd/baseserver/main.go.
This way client users can trivially change what functionality they'd
like.
It involves moving ServeCmd out of client/rest to */main.go
and lets client/rest become a bazaar for available mux.Router
registrars.

Updates #200
This commit is contained in:
Emmanuel Odeke
2017-08-03 11:41:51 -06:00
parent 5d45c22690
commit ee5d22010a
4 changed files with 127 additions and 74 deletions
-47
View File
@@ -1,47 +0,0 @@
package rest
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
"github.com/spf13/cobra"
"github.com/spf13/viper"
coinrest "github.com/tendermint/basecoin/modules/coin/rest"
)
var ServeCmd = &cobra.Command{
Use: "serve",
Short: "Serve the light REST client for tendermint",
Long: "Access basecoin via REST",
RunE: serve,
}
const envPortFlag = "port"
func init() {
_ = ServeCmd.PersistentFlags().Int(envPortFlag, 8998, "the port to run the server on")
}
const defaultAlgo = "ed25519"
func serve(cmd *cobra.Command, args []string) error {
port := viper.GetInt(envPortFlag)
keysManager := DefaultKeysManager()
router := mux.NewRouter()
ctx := Context{
Keys: New(keysManager, defaultAlgo),
}
if err := ctx.RegisterHandlers(router); err != nil {
return err
}
if err := coinrest.RegisterHandlers(router); err != nil {
return err
}
addr := fmt.Sprintf(":%d", port)
log.Printf("Serving on %q", addr)
return http.ListenAndServe(addr, router)
}
+39 -20
View File
@@ -21,6 +21,10 @@ func DefaultKeysManager() keys.Manager {
return keysutils.GetKeyManager()
}
func NewDefaultKeysManager(algo string) *Keys {
return New(DefaultKeysManager(), algo)
}
func New(manager keys.Manager, algo string) *Keys {
return &Keys{
algo: algo,
@@ -121,26 +125,6 @@ func (k *Keys) DeleteKey(w http.ResponseWriter, r *http.Request) {
common.WriteSuccess(w, resp)
}
func (k *Keys) Register(r *mux.Router) {
r.HandleFunc("/keys", k.GenerateKey).Methods("POST")
r.HandleFunc("/keys", k.ListKeys).Methods("GET")
r.HandleFunc("/keys/{name}", k.GetKey).Methods("GET")
r.HandleFunc("/keys/{name}", k.UpdateKey).Methods("POST", "PUT")
r.HandleFunc("/keys/{name}", k.DeleteKey).Methods("DELETE")
}
type Context struct {
Keys *Keys
}
func (ctx *Context) RegisterHandlers(r *mux.Router) error {
ctx.Keys.Register(r)
r.HandleFunc("/sign", doSign).Methods("POST")
r.HandleFunc("/tx", doPostTx).Methods("POST")
return nil
}
func doPostTx(w http.ResponseWriter, r *http.Request) {
tx := new(basecoin.Tx)
if err := common.ParseRequestAndValidateJSON(r, tx); err != nil {
@@ -170,3 +154,38 @@ func doSign(w http.ResponseWriter, r *http.Request) {
}
common.WriteSuccess(w, tx)
}
// mux.Router registrars
// RegisterPostTx is a mux.Router handler that exposes POST
// method access to post a transaction to the blockchain.
func RegisterPostTx(r *mux.Router) error {
r.HandleFunc("/tx", doPostTx).Methods("POST")
return nil
}
// RegisterAllCRUD is a convenience method to register all
// CRUD for keys to allow access by methods and routes:
// POST: /keys
// GET: /keys
// GET: /keys/{name}
// POST, PUT: /keys/{name}
// DELETE: /keys/{name}
func (k *Keys) RegisterAllCRUD(r *mux.Router) error {
r.HandleFunc("/keys", k.GenerateKey).Methods("POST")
r.HandleFunc("/keys", k.ListKeys).Methods("GET")
r.HandleFunc("/keys/{name}", k.GetKey).Methods("GET")
r.HandleFunc("/keys/{name}", k.UpdateKey).Methods("POST", "PUT")
r.HandleFunc("/keys/{name}", k.DeleteKey).Methods("DELETE")
return nil
}
// RegisterSignTx is a mux.Router handler that
// exposes POST method access to sign a transaction.
func RegisterSignTx(r *mux.Router) error {
r.HandleFunc("/sign", doSign).Methods("POST")
return nil
}
// End of mux.Router registrars