Created
September 15, 2014 04:04
-
-
Save theterg/e64ba56bba6e91910747 to your computer and use it in GitHub Desktop.
Golang: Using reflection to abstract web handlers on models in
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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