grafana/pkg/middleware/middleware.go

108 lines
2.1 KiB
Go
Raw Normal View History

2014-10-05 22:50:04 +08:00
package middleware
import (
2014-10-06 03:13:01 +08:00
"encoding/json"
2014-10-08 05:56:37 +08:00
"strconv"
2015-01-14 21:25:12 +08:00
"strings"
2014-10-05 22:50:04 +08:00
"github.com/Unknwon/macaron"
"github.com/macaron-contrib/session"
"github.com/torkelo/grafana-pro/pkg/bus"
2014-10-05 22:50:04 +08:00
"github.com/torkelo/grafana-pro/pkg/log"
m "github.com/torkelo/grafana-pro/pkg/models"
2014-12-16 19:04:08 +08:00
"github.com/torkelo/grafana-pro/pkg/setting"
2014-10-05 22:50:04 +08:00
)
type Context struct {
*macaron.Context
*m.SignInUser
2014-10-05 22:50:04 +08:00
Session session.Store
IsSignedIn bool
2014-10-07 03:31:54 +08:00
}
2014-10-05 22:50:04 +08:00
func GetContextHandler() macaron.Handler {
2014-10-06 03:13:01 +08:00
return func(c *macaron.Context, sess session.Store) {
2014-10-05 22:50:04 +08:00
ctx := &Context{
Context: c,
2014-10-06 03:13:01 +08:00
Session: sess,
2014-10-05 22:50:04 +08:00
}
// try get account id from request
if accountId, err := getRequestAccountId(ctx); err == nil {
query := m.GetSignedInUserQuery{AccountId: accountId}
if err := bus.Dispatch(&query); err != nil {
log.Error(3, "Failed to get user by id, %v, %v", accountId, err)
} else {
ctx.IsSignedIn = true
ctx.SignInUser = query.Result
}
}
2014-10-05 22:50:04 +08:00
c.Map(ctx)
}
}
// Handle handles and logs error by given status.
func (ctx *Context) Handle(status int, title string, err error) {
if err != nil {
log.Error(4, "%s: %v", title, err)
if macaron.Env != macaron.PROD {
ctx.Data["ErrorMsg"] = err
}
}
switch status {
case 404:
ctx.Data["Title"] = "Page Not Found"
case 500:
ctx.Data["Title"] = "Internal Server Error"
}
2014-10-08 05:56:37 +08:00
ctx.HTML(status, strconv.Itoa(status))
2014-10-05 22:50:04 +08:00
}
2014-10-06 03:13:01 +08:00
func (ctx *Context) JsonOK(message string) {
resp := make(map[string]interface{})
resp["message"] = message
ctx.JSON(200, resp)
}
2015-01-14 21:25:12 +08:00
func (ctx *Context) IsApiRequest() bool {
return strings.HasPrefix(ctx.Req.URL.Path, "/api")
}
2014-10-08 03:54:38 +08:00
func (ctx *Context) JsonApiErr(status int, message string, err error) {
2014-10-07 03:31:54 +08:00
resp := make(map[string]interface{})
if err != nil {
log.Error(4, "%s: %v", message, err)
2014-12-16 19:04:08 +08:00
if setting.Env != setting.PROD {
resp["error"] = err.Error()
2014-10-07 03:31:54 +08:00
}
}
switch status {
case 404:
resp["message"] = "Not Found"
case 500:
resp["message"] = "Internal Server Error"
}
if message != "" {
resp["message"] = message
}
2014-11-24 17:17:13 +08:00
ctx.JSON(status, resp)
2014-10-07 03:31:54 +08:00
}
2014-10-06 03:13:01 +08:00
func (ctx *Context) JsonBody(model interface{}) bool {
2014-11-20 16:16:28 +08:00
b, _ := ctx.Req.Body().Bytes()
2014-10-06 03:13:01 +08:00
err := json.Unmarshal(b, &model)
return err == nil
}