2014-03-15 15:01:50 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package middleware
import (
2014-03-15 17:17:16 +04:00
"fmt"
2014-03-15 15:01:50 +04:00
"net/http"
"github.com/codegangsta/martini"
"github.com/martini-contrib/render"
"github.com/martini-contrib/sessions"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
)
2014-03-15 17:17:16 +04:00
// Context represents context of a request.
2014-03-15 15:01:50 +04:00
type Context struct {
c martini . Context
p martini . Params
Req * http . Request
Res http . ResponseWriter
Session sessions . Session
Data base . TmplData
Render render . Render
User * models . User
IsSigned bool
}
2014-03-15 17:17:16 +04:00
// Query querys form parameter.
2014-03-15 15:01:50 +04:00
func ( ctx * Context ) Query ( name string ) string {
ctx . Req . ParseForm ( )
return ctx . Req . Form . Get ( name )
}
// func (ctx *Context) Param(name string) string {
// return ctx.p[name]
// }
2014-03-15 18:52:14 +04:00
// HasError returns true if error occurs in form validation.
func ( ctx * Context ) HasError ( ) bool {
hasErr , ok := ctx . Data [ "HasError" ]
if ! ok {
return false
}
return hasErr . ( bool )
}
// RenderWithErr used for page has form validation but need to prompt error to users.
func ( ctx * Context ) RenderWithErr ( msg , tpl string , form auth . Form ) {
ctx . Data [ "HasError" ] = true
ctx . Data [ "ErrorMsg" ] = msg
auth . AssignForm ( form , ctx . Data )
ctx . Render . HTML ( 200 , tpl , ctx . Data )
}
2014-03-15 17:17:16 +04:00
// Handle handles and logs error by given status.
func ( ctx * Context ) Handle ( status int , title string , err error ) {
ctx . Data [ "ErrorMsg" ] = err
log . Error ( "%s: %v" , title , err )
ctx . Render . HTML ( status , fmt . Sprintf ( "status/%d" , status ) , ctx . Data )
2014-03-15 15:01:50 +04:00
}
2014-03-15 17:17:16 +04:00
// InitContext initializes a classic context for a request.
2014-03-15 15:01:50 +04:00
func InitContext ( ) martini . Handler {
return func ( res http . ResponseWriter , r * http . Request , c martini . Context ,
session sessions . Session , rd render . Render ) {
data := base . TmplData { }
ctx := & Context {
c : c ,
// p: p,
2014-03-15 18:34:33 +04:00
Req : r ,
Res : res ,
Session : session ,
Data : data ,
Render : rd ,
2014-03-15 15:01:50 +04:00
}
// Get user from session if logined.
user := auth . SignedInUser ( session )
ctx . User = user
2014-03-15 16:50:17 +04:00
ctx . IsSigned = user != nil
2014-03-15 15:01:50 +04:00
2014-03-15 16:50:17 +04:00
data [ "IsSigned" ] = ctx . IsSigned
if user != nil {
data [ "SignedUser" ] = user
data [ "SignedUserId" ] = user . Id
data [ "SignedUserName" ] = user . LowerName
}
2014-03-15 15:01:50 +04:00
c . Map ( ctx )
c . Map ( data )
c . Next ( )
}
}