You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
. "github.com/josebarn/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
|
|
}
|