first commit

way too late.
This commit is contained in:
didier amyot committed 2015-02-06 22:03:05 -08:00
commit d4f7dc57fc
53 files changed
+3518

No files matched your search

+144
View File
@@ -0,0 +1,144 @@
package main
import (
"fmt"
"net/http"
"encoding/json"
"github.com/didiercrunch/doormanserver/doormen"
"github.com/gorilla/mux"
"gopkg.in/mgo.v2/bson"
)
func getDoormenIdsAsJson(id *doormen.DoormanId) string {
return fmt.Sprintf(`{"name": "%v", "id": "%v", "url": "/api/doormen/%v"}`, id.Name, id.Id.Hex(), id.Id.Hex())
}
func CreateDoorman(w http.ResponseWriter, request *http.Request) {
wdef := new(doormen.DoormanDefinition)
defer request.Body.Close()
decoder := json.NewDecoder(request.Body)
if err := decoder.Decode(wdef); err != nil {
w.WriteHeader(400)
fmt.Fprintln(w, "cannot create doorman definition \n", err)
return
}
wdef.Id = bson.NewObjectId()
if err := wdef.Validate(); err != nil {
w.WriteHeader(400)
fmt.Fprintln(w, "New doorman is invalid \n", err)
return
}
if err := CreateDoormanInDatabase(wdef); err != nil {
w.WriteHeader(500)
fmt.Fprintln(w, "Server error \n", err)
return
}
go publisher.Emit(wdef.Id, wdef)
w.Header().Set("location", "/api/doormen/"+wdef.Id.Hex())
w.WriteHeader(201)
}
func GetAllDoormen(w http.ResponseWriter, request *http.Request) {
fmt.Fprint(w, `{"doormen" :[`)
doormenIds := conn.GetAllDoormen()
buff := <-doormenIds
if buff == nil {
fmt.Fprint(w, "]}")
return
}
for doormanId := range doormenIds {
fmt.Fprint(w, getDoormenIdsAsJson(buff)+`,`)
buff = doormanId
}
fmt.Fprint(w, getDoormenIdsAsJson(buff), "]}")
}
func getDoormanIdFromRequest(w http.ResponseWriter, request *http.Request) bson.ObjectId {
id := mux.Vars(request)["id"]
if !bson.IsObjectIdHex(id) {
return ""
} else {
return bson.ObjectIdHex(id)
}
}
func GetDoorman(w http.ResponseWriter, r *http.Request) {
id := getDoormanIdFromRequest(w, r)
if id == "" {
Write404Error(w)
return
}
doorman, err := conn.GetDoorman(id)
if err != nil {
Write500Error(w, err)
} else if doorman == nil {
Write404Error(w)
} else {
encoder := json.NewEncoder(w)
encoder.Encode(doorman)
}
}
func UpdateDoorman(w http.ResponseWriter, request *http.Request) {
id := getDoormanIdFromRequest(w, request)
if id == "" || !conn.ExistsId(id) {
Write404Error(w)
return
}
wdef := new(doormen.DoormanDefinition)
defer request.Body.Close()
decoder := json.NewDecoder(request.Body)
if err := decoder.Decode(wdef); err != nil {
Write400Error(w, err)
return
}
wdef.Id = id
if err := wdef.Validate(); err != nil {
Write400Error(w, err)
return
}
originalDoorman, err := conn.GetDoorman(id)
if err != nil {
Write500Error(w, err)
return
}
if err := originalDoorman.CanBeUpdatedBy(wdef); err != nil {
Write400Error(w, err)
return
}
if err := UpdateDoormanInDatabase(wdef); err != nil {
Write500Error(w, err)
return
}
go publisher.Emit(wdef.Id, wdef)
w.WriteHeader(200)
}
type Api struct {
GetAllDoormen http.HandlerFunc
CreateDoorman http.HandlerFunc
GetDoorman http.HandlerFunc
UpdateDoorman http.HandlerFunc
}
func (a *Api) ServeApi(router *mux.Router) {
router.Path("/doormen").Methods("GET").HandlerFunc(a.GetAllDoormen)
router.Path("/doormen").Methods("POST").HandlerFunc(a.CreateDoorman)
router.Path("/doormen/{id}").Methods("GET").HandlerFunc(a.GetDoorman)
router.Path("/doormen/{id}").Methods("PUT").HandlerFunc(a.UpdateDoorman)
}
func serveApi(router *mux.Router) {
api := new(Api)
api.CreateDoorman = CreateDoorman
api.GetAllDoormen = GetAllDoormen
api.GetDoorman = GetDoorman
api.UpdateDoorman = UpdateDoorman
api.ServeApi(router)
}