snap/service_request.go

141 lines
2.2 KiB
Go
Raw Permalink Normal View History

2023-05-29 20:21:08 +00:00
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,
}
}
2023-08-18 03:30:47 +00:00
func (c *ServiceRequest) GetRequest() *http.Request {
return c.r
}