package wrouter import ( "net/http" "strings" "git.aiterp.net/gisle/wrouter/response" "git.aiterp.net/gisle/wrouter/auth" ) type ResourceFunc func(http.ResponseWriter, *http.Request, *auth.User) type ResourceIDFunc func(http.ResponseWriter, *http.Request, string, *auth.User) type Resource struct { list ResourceFunc create ResourceFunc get ResourceIDFunc update ResourceIDFunc delete ResourceIDFunc PrivateRead bool PrivateWrite bool } func NewResource(list, create ResourceFunc, get, update, delete ResourceIDFunc) *Resource { return &Resource{list, create, get, update, delete, false, false} } func (resource *Resource) Handle(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool { // Get the subpath out of the path subpath := req.URL.Path[len(path):] if len(subpath) > 0 && subpath[0] == '/' { subpath = subpath[1:] } // Error out on bad IDs which contains /es if x := strings.Index(subpath, "/"); x != -1 { response.Text(w, 400, "Invalid ID: "+subpath) return true } // Route it to the resource switch req.Method { case "GET": { if resource.PrivateRead && user == nil { response.Text(w, 401, "Not logged in") return true } if subpath != "" { resource.get(w, req, subpath, user) } else { resource.list(w, req, user) } } case "POST": { if resource.PrivateWrite && user == nil { response.Text(w, 401, "Not logged in") return true } if subpath != "" { response.Text(w, 400, "ID not allowed in POST") return true } resource.create(w, req, user) } case "PATCH", "PUT": { if resource.PrivateWrite && user == nil { response.Text(w, 401, "Not logged in") return true } resource.update(w, req, subpath, user) } case "DELETE": { if resource.PrivateWrite && user == nil { response.Text(w, 401, "Not logged in") return true } resource.delete(w, req, subpath, user) } } return true }