Skip to content

Instantly share code, notes, and snippets.

@theterg
Created September 15, 2014 04:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theterg/e64ba56bba6e91910747 to your computer and use it in GitHub Desktop.
Save theterg/e64ba56bba6e91910747 to your computer and use it in GitHub Desktop.
Golang: Using reflection to abstract web handlers on models in
package routes
import (
"github.com/theterg/BOH-web/models"
"github.com/bmizerany/pat"
"net/http"
"strconv"
"encoding/json"
"reflect"
)
// Global vars for this package:
//var db *gorm.DB
//var generate *render.Render
//var sitevars *SiteVars
func Add_API_routes(prefix string, mux *pat.PatternServeMux) {
mux.Get(prefix+"/employees", http.HandlerFunc(employee_list))
mux.Get(prefix+"/employee/:id", http.HandlerFunc(employee_get))
mux.Del(prefix+"/employee/:id", http.HandlerFunc(employee_delete))
mux.Put(prefix+"/employees", http.HandlerFunc(employee_create))
mux.Put(prefix+"/employee/:id", http.HandlerFunc(employee_update))
}
func employee_list(w http.ResponseWriter, req *http.Request) {
var employees []models.Employee
generic_list(&employees, w, req)
}
func employee_get(w http.ResponseWriter, req *http.Request) {
var employee models.Employee
generic_get(&employee, w, req)
}
func employee_delete(w http.ResponseWriter, req *http.Request) {
var employee models.Employee
generic_delete(&employee, w, req)
}
func employee_create(w http.ResponseWriter, req *http.Request) {
var employee models.Employee
generic_create(&employee, w, req)
}
func employee_update(w http.ResponseWriter, req *http.Request) {
var employee models.Employee
generic_update(&employee, w, req)
}
func generic_list(obj interface{}, w http.ResponseWriter, req *http.Request) {
query := db.Find(obj)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
ret, err := json.Marshal(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
w.Write(ret)
}
func generic_get(obj interface{}, w http.ResponseWriter, req *http.Request) {
id, err := strconv.ParseInt(req.URL.Query().Get(":id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
query := db.First(obj, id)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
ret, err := json.Marshal(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
w.Write(ret)
}
func generic_delete(obj interface{}, w http.ResponseWriter, req *http.Request) {
id, err := strconv.ParseInt(req.URL.Query().Get(":id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
reflect.ValueOf(obj).Elem().FieldByName("Id").SetInt(id)
query := db.Delete(obj)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
w.WriteHeader(204)
}
func generic_create(obj interface{}, w http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(req.Body)
err := decoder.Decode(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
query := db.Save(obj)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
ret, err := json.Marshal(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
w.Write(ret)
}
func generic_update(obj interface{}, w http.ResponseWriter, req *http.Request) {
// Get the existing object
id, err := strconv.ParseInt(req.URL.Query().Get(":id"), 10, 64)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
query := db.First(obj, id)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
// Add fields from request to the object
decoder := json.NewDecoder(req.Body)
err = decoder.Decode(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
// Update the object
query = db.Save(obj)
if query.Error != nil {
http.Error(w, query.Error.Error(), 500)
return
}
ret, err := json.Marshal(obj)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
w.Write(ret)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment