This repository has been archived on 2025-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
bactdb/handlers/handlers.go
Matthew Dillon e756b13099 Refactor handlers package
Fixes #19.
2015-10-13 11:06:02 -07:00

72 lines
3.1 KiB
Go

package handlers
import (
"net/http"
"github.com/thermokarst/bactdb/Godeps/_workspace/src/github.com/gorilla/mux"
"github.com/thermokarst/bactdb/Godeps/_workspace/src/github.com/nytimes/gziphandler"
"github.com/thermokarst/bactdb/api"
"github.com/thermokarst/bactdb/auth"
)
// Handler is the root HTTP handler for bactdb.
func Handler() http.Handler {
m := mux.NewRouter()
userService := api.UserService{}
strainService := api.StrainService{}
speciesService := api.SpeciesService{}
characteristicService := api.CharacteristicService{}
measurementService := api.MeasurementService{}
m.Handle("/authenticate", tokenHandler(auth.Middleware.Authenticate())).Methods("POST")
m.Handle("/refresh", auth.Middleware.Secure(errorHandler(tokenRefresh(auth.Middleware)), verifyClaims)).Methods("POST")
// Everything past here is lumped under a genus
s := m.PathPrefix("/{genus}").Subrouter()
s.Handle("/users", errorHandler(handleCreater(userService))).Methods("POST")
s.Handle("/users/verify/{Nonce}", errorHandler(api.HandleUserVerify)).Methods("GET")
s.Handle("/users/lockout", errorHandler(api.HandleUserLockout)).Methods("POST")
s.Handle("/compare", auth.Middleware.Secure(errorHandler(api.HandleCompare), verifyClaims)).Methods("GET")
type r struct {
f errorHandler
m string
p string
}
// Everything past this point requires a valid token
routes := []r{
r{handleLister(userService), "GET", "/users"},
r{api.HandleUserPasswordChange, "POST", "/users/password"},
r{handleGetter(userService), "GET", "/users/{ID:.+}"},
r{handleUpdater(userService), "PUT", "/users/{ID:.+}"},
r{handleLister(speciesService), "GET", "/species"},
r{handleCreater(speciesService), "POST", "/species"},
r{handleGetter(speciesService), "GET", "/species/{ID:.+}"},
r{handleUpdater(speciesService), "PUT", "/species/{ID:.+}"},
r{handleDeleter(speciesService), "DELETE", "/species/{ID:.+}"},
r{handleLister(strainService), "GET", "/strains"},
r{handleCreater(strainService), "POST", "/strains"},
r{handleGetter(strainService), "GET", "/strains/{ID:.+}"},
r{handleUpdater(strainService), "PUT", "/strains/{ID:.+}"},
r{handleDeleter(strainService), "DELETE", "/strains/{ID:.+}"},
r{handleLister(characteristicService), "GET", "/characteristics"},
r{handleCreater(characteristicService), "POST", "/characteristics"},
r{handleGetter(characteristicService), "GET", "/characteristics/{ID:.+}"},
r{handleUpdater(characteristicService), "PUT", "/characteristics/{ID:.+}"},
r{handleDeleter(characteristicService), "DELETE", "/characteristics/{ID:.+}"},
r{handleLister(measurementService), "GET", "/measurements"},
r{handleCreater(measurementService), "POST", "/measurements"},
r{handleGetter(measurementService), "GET", "/measurements/{ID:.+}"},
r{handleUpdater(measurementService), "PUT", "/measurements/{ID:.+}"},
r{handleDeleter(measurementService), "DELETE", "/measurements/{ID:.+}"},
}
for _, route := range routes {
s.Handle(route.p, auth.Middleware.Secure(errorHandler(route.f), verifyClaims)).Methods(route.m)
}
return jsonHandler(gziphandler.GzipHandler(corsHandler(m)))
}