2014-02-19 13:50:53 +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 main
import (
"fmt"
2014-02-19 23:49:08 +04:00
"html/template"
2014-02-19 13:50:53 +04:00
"net/http"
2014-03-18 09:33:53 +04:00
"strings"
2014-02-19 13:50:53 +04:00
"github.com/codegangsta/cli"
"github.com/codegangsta/martini"
2014-03-06 11:21:44 +04:00
"github.com/gogits/binding"
2014-03-21 09:48:10 +04:00
"github.com/gogits/gogs/models"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/auth"
2014-03-23 14:13:23 +04:00
"github.com/gogits/gogs/modules/avatar"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-08 02:22:15 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-21 09:48:10 +04:00
"github.com/gogits/gogs/modules/mailer"
2014-03-15 15:01:50 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers"
2014-03-20 15:50:26 +04:00
"github.com/gogits/gogs/routers/admin"
2014-03-19 20:50:44 +04:00
"github.com/gogits/gogs/routers/dev"
2014-02-20 06:45:43 +04:00
"github.com/gogits/gogs/routers/repo"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers/user"
)
var CmdWeb = cli . Command {
Name : "web" ,
Usage : "just run" ,
Description : `
gogs web ` ,
Action : runWeb ,
2014-03-13 10:09:36 +04:00
Flags : [ ] cli . Flag { } ,
2014-02-19 13:50:53 +04:00
}
2014-03-21 09:48:10 +04:00
// globalInit is for global configuration reload-able.
func globalInit ( ) {
base . NewConfigContext ( )
mailer . NewMailerContext ( )
models . LoadModelsConfig ( )
models . LoadRepoConfig ( )
models . NewRepoContext ( )
models . NewEngine ( )
}
2014-03-18 09:33:53 +04:00
// Check run mode(Default of martini is Dev).
func checkRunMode ( ) {
switch base . Cfg . MustValue ( "" , "RUN_MODE" ) {
case "prod" :
martini . Env = martini . Prod
case "test" :
martini . Env = martini . Test
}
log . Info ( "Run Mode: %s" , strings . Title ( martini . Env ) )
}
2014-03-19 13:31:38 +04:00
func newMartini ( ) * martini . ClassicMartini {
r := martini . NewRouter ( )
m := martini . New ( )
m . Use ( middleware . Logger ( ) )
m . Use ( martini . Recovery ( ) )
m . Use ( martini . Static ( "public" ) )
m . MapTo ( r , ( * martini . Routes ) ( nil ) )
m . Action ( r . Handle )
return & martini . ClassicMartini { m , r }
}
2014-02-19 13:50:53 +04:00
func runWeb ( * cli . Context ) {
2014-03-21 09:48:10 +04:00
globalInit ( )
2014-03-19 21:24:46 +04:00
base . NewServices ( )
2014-03-18 09:33:53 +04:00
checkRunMode ( )
2014-03-19 12:48:45 +04:00
log . Info ( "%s %s" , base . AppName , base . AppVer )
2014-02-19 13:50:53 +04:00
2014-03-19 13:31:38 +04:00
m := newMartini ( )
2014-02-19 13:50:53 +04:00
2014-03-08 02:08:21 +04:00
// Middlewares.
2014-03-19 17:57:55 +04:00
m . Use ( middleware . Renderer ( middleware . RenderOptions { Funcs : [ ] template . FuncMap { base . TemplateFuncs } } ) )
2014-02-19 13:50:53 +04:00
2014-03-15 15:01:50 +04:00
m . Use ( middleware . InitContext ( ) )
2014-03-22 21:44:02 +04:00
reqSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true } )
ignSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : base . Service . RequireSignInView } )
reqSignOut := middleware . Toggle ( & middleware . ToggleOptions { SignOutRequire : true } )
2014-02-19 13:50:53 +04:00
// Routers.
2014-03-24 14:50:11 +04:00
m . Get ( "/" , reqSignIn , routers . Home )
2014-03-18 17:58:58 +04:00
m . Get ( "/issues" , reqSignIn , user . Issues )
m . Get ( "/pulls" , reqSignIn , user . Pulls )
m . Get ( "/stars" , reqSignIn , user . Stars )
2014-03-23 00:00:46 +04:00
m . Get ( "/help" , routers . Help )
2014-03-23 18:58:50 +04:00
avatarCache := avatar . HttpHandler ( "public/img/avatar/" , "public/img/avatar_default.jpg" )
2014-03-23 18:40:35 +04:00
m . Get ( "/avatar/:hash" , avatarCache . ServeHTTP )
2014-03-23 00:00:46 +04:00
m . Group ( "/user" , func ( r martini . Router ) {
r . Any ( "/login" , binding . BindIgnErr ( auth . LogInForm { } ) , user . SignIn )
2014-03-23 11:21:34 +04:00
r . Any ( "/sign_up" , binding . BindIgnErr ( auth . RegisterForm { } ) , user . SignUp )
2014-03-23 00:00:46 +04:00
} , reqSignOut )
m . Group ( "/user" , func ( r martini . Router ) {
r . Any ( "/logout" , user . SignOut )
r . Any ( "/delete" , user . Delete )
r . Any ( "/setting" , binding . BindIgnErr ( auth . UpdateProfileForm { } ) , user . Setting )
} , reqSignIn )
m . Group ( "/user" , func ( r martini . Router ) {
r . Get ( "/feeds" , binding . Bind ( auth . FeedsForm { } ) , user . Feeds )
r . Get ( "/activate" , user . Activate )
} )
m . Group ( "/user/setting" , func ( r martini . Router ) {
r . Any ( "/password" , binding . BindIgnErr ( auth . UpdatePasswdForm { } ) , user . SettingPassword )
r . Any ( "/ssh" , binding . BindIgnErr ( auth . AddSSHKeyForm { } ) , user . SettingSSHKeys )
r . Any ( "/notification" , user . SettingNotification )
r . Any ( "/security" , user . SettingSecurity )
} , reqSignIn )
2014-03-10 12:54:52 +04:00
2014-03-18 17:58:58 +04:00
m . Get ( "/user/:username" , ignSignIn , user . Profile )
2014-03-08 02:08:21 +04:00
2014-03-18 17:58:58 +04:00
m . Any ( "/repo/create" , reqSignIn , binding . BindIgnErr ( auth . CreateRepoForm { } ) , repo . Create )
2014-03-13 10:08:49 +04:00
2014-03-22 21:44:02 +04:00
adminReq := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true , AdminRequire : true } )
m . Get ( "/admin" , adminReq , admin . Dashboard )
2014-03-23 00:00:46 +04:00
m . Group ( "/admin" , func ( r martini . Router ) {
r . Get ( "/users" , admin . Users )
r . Get ( "/repos" , admin . Repositories )
r . Get ( "/config" , admin . Config )
} , adminReq )
m . Group ( "/admin/users" , func ( r martini . Router ) {
r . Any ( "/new" , binding . BindIgnErr ( auth . RegisterForm { } ) , admin . NewUser )
r . Any ( "/:userid" , binding . BindIgnErr ( auth . AdminEditUserForm { } ) , admin . EditUser )
r . Any ( "/:userid/delete" , admin . DeleteUser )
} , adminReq )
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
r . Post ( "/settings" , repo . SettingPost )
r . Get ( "/settings" , repo . Setting )
r . Get ( "/action/:action" , repo . Action )
} , reqSignIn , middleware . RepoAssignment ( true ) )
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
r . Get ( "/commits/:branchname" , repo . Commits )
r . Get ( "/issues" , repo . Issues )
r . Any ( "/issues/new" , binding . BindIgnErr ( auth . CreateIssueForm { } ) , repo . CreateIssue )
2014-03-24 03:09:11 +04:00
r . Get ( "/issues/:index" , repo . ViewIssue )
r . Post ( "/issues/:index" , binding . BindIgnErr ( auth . CreateIssueForm { } ) , repo . UpdateIssue )
2014-03-23 00:00:46 +04:00
r . Get ( "/pulls" , repo . Pulls )
r . Get ( "/branches" , repo . Branches )
r . Get ( "/src/:branchname" , repo . Single )
r . Get ( "/src/:branchname/**" , repo . Single )
r . Get ( "/commits/:branchname" , repo . Commits )
r . Get ( "/commits/:branchname" , repo . Commits )
} , ignSignIn , middleware . RepoAssignment ( true ) )
// TODO: implement single commit page
// m.Get("/:username/:reponame/commit/:commitid/**", ignSignIn, middleware.RepoAssignment(true), repo.Single)
// m.Get("/:username/:reponame/commit/:commitid", ignSignIn, middleware.RepoAssignment(true), repo.Single)
m . Group ( "/:username" , func ( r martini . Router ) {
r . Get ( "/:reponame" , middleware . RepoAssignment ( true ) , repo . Single )
r . Any ( "/:reponame/**" , repo . Http )
} , ignSignIn )
2014-03-21 20:48:26 +04:00
2014-03-19 20:50:44 +04:00
if martini . Env == martini . Dev {
m . Get ( "/template/**" , dev . TemplatePreview )
}
2014-03-23 14:27:01 +04:00
// Not found handler.
2014-03-23 09:48:01 +04:00
m . NotFound ( routers . NotFound )
2014-02-19 13:50:53 +04:00
listenAddr := fmt . Sprintf ( "%s:%s" ,
2014-03-08 02:22:15 +04:00
base . Cfg . MustValue ( "server" , "HTTP_ADDR" ) ,
base . Cfg . MustValue ( "server" , "HTTP_PORT" , "3000" ) )
2014-02-19 13:50:53 +04:00
log . Info ( "Listen: %s" , listenAddr )
2014-03-18 17:58:58 +04:00
if err := http . ListenAndServe ( listenAddr , m ) ; err != nil {
log . Critical ( err . Error ( ) )
}
2014-02-19 13:50:53 +04:00
}