@ -9,6 +9,7 @@ import (
"encoding/json"
"errors"
"fmt"
"path"
"strings"
"code.gitea.io/git"
@ -23,16 +24,17 @@ import (
)
const (
tplHooks base . TplName = "repo/settings/webhook/base"
tplHookNew base . TplName = "repo/settings/webhook/new"
tplOrgHookNew base . TplName = "org/settings/hook_new"
tplHooks base . TplName = "repo/settings/webhook/base"
tplHookNew base . TplName = "repo/settings/webhook/new"
tplOrgHookNew base . TplName = "org/settings/hook_new"
tplAdminHookNew base . TplName = "admin/hook_new"
)
// Webhooks render web hooks list page
func Webhooks ( ctx * context . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.hooks" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "BaseLink" ] = ctx . Repo . RepoLink
ctx . Data [ "BaseLink" ] = ctx . Repo . RepoLink + "/settings/hooks"
ctx . Data [ "Description" ] = ctx . Tr ( "repo.settings.hooks_desc" , "https://docs.gitea.io/en-us/webhooks/" )
ws , err := models . GetWebhooksByRepoID ( ctx . Repo . Repository . ID )
@ -48,16 +50,17 @@ func Webhooks(ctx *context.Context) {
type orgRepoCtx struct {
OrgID int64
RepoID int64
IsAdmin bool
Link string
NewTemplate base . TplName
}
// getOrgRepoCtx determines whether this is a repo context or organizatio n context.
// getOrgRepoCtx determines whether this is a repo, organization, or admi n context.
func getOrgRepoCtx ( ctx * context . Context ) ( * orgRepoCtx , error ) {
if len ( ctx . Repo . RepoLink ) > 0 {
return & orgRepoCtx {
RepoID : ctx . Repo . Repository . ID ,
Link : ctx . Repo . RepoLink ,
Link : path . Join ( ctx. Repo . RepoLink , "settings/hooks" ) ,
NewTemplate : tplHookNew ,
} , nil
}
@ -65,11 +68,19 @@ func getOrgRepoCtx(ctx *context.Context) (*orgRepoCtx, error) {
if len ( ctx . Org . OrgLink ) > 0 {
return & orgRepoCtx {
OrgID : ctx . Org . Organization . ID ,
Link : ctx . Org . OrgLink ,
Link : path . Join ( ctx. Org . OrgLink , "settings/hooks" ) ,
NewTemplate : tplOrgHookNew ,
} , nil
}
if ctx . User . IsAdmin {
return & orgRepoCtx {
IsAdmin : true ,
Link : path . Join ( setting . AppSubURL , "/admin/hooks" ) ,
NewTemplate : tplAdminHookNew ,
} , nil
}
return nil , errors . New ( "Unable to set OrgRepo context" )
}
@ -85,8 +96,6 @@ func checkHookType(ctx *context.Context) string {
// WebhooksNew render creating webhook page
func WebhooksNew ( ctx * context . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.add_webhook" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
orCtx , err := getOrgRepoCtx ( ctx )
@ -95,6 +104,14 @@ func WebhooksNew(ctx *context.Context) {
return
}
if orCtx . IsAdmin {
ctx . Data [ "PageIsAdminHooks" ] = true
ctx . Data [ "PageIsAdminHooksNew" ] = true
} else {
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
}
hookType := checkHookType ( ctx )
ctx . Data [ "HookType" ] = hookType
if ctx . Written ( ) {
@ -175,7 +192,7 @@ func WebHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
ctx . Redirect ( orCtx . Link )
}
// GogsHooksNewPost response for creating webhook
@ -222,7 +239,7 @@ func GogsHooksNewPost(ctx *context.Context, form auth.NewGogshookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
ctx . Redirect ( orCtx . Link )
}
// DiscordHooksNewPost response for creating discord hook
@ -271,7 +288,7 @@ func DiscordHooksNewPost(ctx *context.Context, form auth.NewDiscordHookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
ctx . Redirect ( orCtx . Link )
}
// DingtalkHooksNewPost response for creating dingtalk hook
@ -311,7 +328,7 @@ func DingtalkHooksNewPost(ctx *context.Context, form auth.NewDingtalkHookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
ctx . Redirect ( orCtx . Link )
}
// SlackHooksNewPost response for creating slack hook
@ -368,7 +385,7 @@ func SlackHooksNewPost(ctx *context.Context, form auth.NewSlackHookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
ctx . Redirect ( orCtx . Link )
}
func checkWebhook ( ctx * context . Context ) ( * orgRepoCtx , * models . Webhook ) {
@ -384,8 +401,10 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) {
var w * models . Webhook
if orCtx . RepoID > 0 {
w , err = models . GetWebhookByRepoID ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":id" ) )
} else {
} else if orCtx . OrgID > 0 {
w , err = models . GetWebhookByOrgID ( ctx . Org . Organization . ID , ctx . ParamsInt64 ( ":id" ) )
} else {
w , err = models . GetDefaultWebhook ( ctx . ParamsInt64 ( ":id" ) )
}
if err != nil {
if models . IsErrWebhookNotExist ( err ) {
@ -462,7 +481,7 @@ func WebHooksEditPost(ctx *context.Context, form auth.NewWebhookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/ %d" , orCtx . Link , w . ID ) )
ctx . Redirect ( fmt . Sprintf ( "%s/%d" , orCtx . Link , w . ID ) )
}
// GogsHooksEditPost response for editing gogs hook
@ -501,7 +520,7 @@ func GogsHooksEditPost(ctx *context.Context, form auth.NewGogshookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/ %d" , orCtx . Link , w . ID ) )
ctx . Redirect ( fmt . Sprintf ( "%s/%d" , orCtx . Link , w . ID ) )
}
// SlackHooksEditPost response for editing slack hook
@ -551,7 +570,7 @@ func SlackHooksEditPost(ctx *context.Context, form auth.NewSlackHookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/ %d" , orCtx . Link , w . ID ) )
ctx . Redirect ( fmt . Sprintf ( "%s/%d" , orCtx . Link , w . ID ) )
}
// DiscordHooksEditPost response for editing discord hook
@ -593,7 +612,7 @@ func DiscordHooksEditPost(ctx *context.Context, form auth.NewDiscordHookForm) {
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/ %d" , orCtx . Link , w . ID ) )
ctx . Redirect ( fmt . Sprintf ( "%s/%d" , orCtx . Link , w . ID ) )
}
// DingtalkHooksEditPost response for editing discord hook
@ -625,7 +644,7 @@ func DingtalkHooksEditPost(ctx *context.Context, form auth.NewDingtalkHookForm)
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/ %d" , orCtx . Link , w . ID ) )
ctx . Redirect ( fmt . Sprintf ( "%s/%d" , orCtx . Link , w . ID ) )
}
// TestWebhook test if web hook is work fine