added REST API and simple unit test - and compose starter, still WIP for integ test

This commit is contained in:
josebarn
2017-08-15 21:14:14 -03:00
parent bd8a3f2ddd
commit 5e945440d0
58 changed files with 9040 additions and 25 deletions

84
api/app.go Normal file
View File

@@ -0,0 +1,84 @@
package api
import (
"context"
. "drone-with-go/model"
"github.com/go-chi/chi"
"github.com/go-chi/render"
"net/http"
"strconv"
)
type AppResource struct{}
// Routes creates a REST router for the todos resource
func (self AppResource) Routes() chi.Router {
r := chi.NewRouter()
r.Route("/{id}", func(r chi.Router) {
r.Use(AppCtx) // do some preprocessing of the input value
r.Get("/", self.remember)
r.Post("/", self.memorize)
})
return r
}
func (self AppResource) remember(w http.ResponseWriter, r *http.Request) {
record := r.Context().Value("record").(*Record)
render.Status(r, http.StatusOK)
render.Render(w, r, NewResponse("GET", record.Value))
}
func (self AppResource) memorize(w http.ResponseWriter, r *http.Request) {
record := r.Context().Value("record").(*Record)
render.Status(r, http.StatusOK)
render.Render(w, r, NewResponse("POST", record.Value))
}
// AppCtx middleware is used to load an object from
// the URL parameters passed through as the request. In case
// the object could not be found, we stop here and return a 404.
func AppCtx(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var record *Record
if id := chi.URLParam(r, "id"); id != "" {
i64, err := strconv.ParseUint(id, 10, 32)
if err != nil {
render.Render(w, r, ErrNotANumber)
return
}
// Here is where we could lookup the record...
record = &Record{Value: i64}
} else {
render.Render(w, r, ErrNotFound)
return
}
ctx := context.WithValue(r.Context(), "record", record)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
//--------------------------------------------------------------------------
// response renderers
//--------------------------------------------------------------------------
type Response struct {
Operation string `json:"op"`
Identifier uint64 `json:"id"`
}
func (u *Response) Bind(r *http.Request) error {
return nil
}
func (u *Response) Render(w http.ResponseWriter, r *http.Request) error {
return nil
}
func NewResponse(action string, id uint64) *Response {
resp := &Response{Operation: action, Identifier: id}
return resp
}