137 lines
2.1 KiB
Go
137 lines
2.1 KiB
Go
package snap
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"git.twelvetwelve.org/library/snap/auth"
|
|
)
|
|
|
|
type ServiceRequest struct {
|
|
r *http.Request
|
|
auth *auth.AuthData
|
|
vars *Vars
|
|
form *Form
|
|
query *Query
|
|
}
|
|
|
|
func (c *ServiceRequest) GetUser() string {
|
|
if c.auth == nil {
|
|
return ""
|
|
}
|
|
return c.auth.User
|
|
}
|
|
|
|
func (c *ServiceRequest) ReplyMessage(code int, msg string) *ServiceResponse {
|
|
return &ServiceResponse{
|
|
Code: code,
|
|
Message: []byte(msg),
|
|
}
|
|
}
|
|
|
|
func (c *ServiceRequest) ReplyObject(code int, obj interface{}) *ServiceResponse {
|
|
var err error
|
|
resp := &ServiceResponse{
|
|
Code: code,
|
|
}
|
|
|
|
resp.Message, err = json.Marshal(obj)
|
|
if err != nil {
|
|
resp.Code = http.StatusInternalServerError
|
|
resp.Message = []byte("Internal Server Error")
|
|
|
|
}
|
|
|
|
compact := c.r.Header.Get("Compact")
|
|
if compact == "" {
|
|
var pretty bytes.Buffer
|
|
err := json.Indent(&pretty, resp.Message, "", " ")
|
|
if err == nil {
|
|
resp.Message = pretty.Bytes()
|
|
}
|
|
}
|
|
return resp
|
|
}
|
|
|
|
func (c *ServiceRequest) GetObject(object interface{}) error {
|
|
decoder := json.NewDecoder(c.r.Body)
|
|
return decoder.Decode(object)
|
|
}
|
|
|
|
func (c *ServiceRequest) Form() (*Options, error) {
|
|
if c.form != nil {
|
|
return &Options{
|
|
kv: c.form,
|
|
}, nil
|
|
}
|
|
|
|
err := c.r.ParseForm()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
c.form = &Form{
|
|
r: c.r,
|
|
}
|
|
|
|
return &Options{
|
|
kv: c.form,
|
|
}, nil
|
|
}
|
|
|
|
func (c *ServiceRequest) Query() *Options {
|
|
if c.query != nil {
|
|
return &Options{
|
|
kv: c.query,
|
|
}
|
|
}
|
|
|
|
c.query = &Query{
|
|
Values: c.r.URL.Query(),
|
|
}
|
|
return &Options{
|
|
kv: c.query,
|
|
}
|
|
}
|
|
|
|
func (c *ServiceRequest) Vars() *Options {
|
|
if c.vars != nil {
|
|
return &Options{
|
|
kv: c.vars,
|
|
}
|
|
}
|
|
|
|
c.vars = &Vars{
|
|
vars: mux.Vars(c.r),
|
|
}
|
|
return &Options{
|
|
kv: c.vars,
|
|
}
|
|
}
|
|
|
|
// Options get compound options
|
|
func (c *ServiceRequest) Options() *Options {
|
|
opts := &CompoundOptions{}
|
|
|
|
opts.kvs = append(opts.kvs, &Vars{
|
|
vars: mux.Vars(c.r),
|
|
})
|
|
|
|
opts.kvs = append(opts.kvs, &Query{
|
|
Values: c.r.URL.Query(),
|
|
})
|
|
|
|
err := c.r.ParseForm()
|
|
if err == nil {
|
|
opts.kvs = append(opts.kvs, &Form{
|
|
r: c.r,
|
|
})
|
|
}
|
|
|
|
return &Options{
|
|
kv: opts,
|
|
}
|
|
}
|