2014-11-13 10:32:18 +03: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 v1
import (
2014-11-13 20:57:00 +03:00
"encoding/json"
2015-08-29 06:49:59 +03:00
"fmt"
"github.com/Unknwon/com"
2014-11-13 20:57:00 +03:00
2014-11-15 01:11:30 +03:00
api "github.com/gogits/go-gogs-client"
2014-11-13 10:32:18 +03:00
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
)
2015-08-29 06:49:59 +03:00
// ToApiHook converts webhook to API format.
func ToApiHook ( repoLink string , w * models . Webhook ) * api . Hook {
config := map [ string ] string {
"url" : w . URL ,
"content_type" : w . ContentType . Name ( ) ,
}
if w . HookTaskType == models . SLACK {
s := w . GetSlackHook ( )
config [ "channel" ] = s . Channel
config [ "username" ] = s . Username
config [ "icon_url" ] = s . IconURL
config [ "color" ] = s . Color
}
return & api . Hook {
ID : w . ID ,
Type : w . HookTaskType . Name ( ) ,
URL : fmt . Sprintf ( "%s/settings/hooks/%d" , repoLink , w . ID ) ,
Active : w . IsActive ,
Config : config ,
Events : w . EventsArray ( ) ,
Updated : w . Updated ,
Created : w . Created ,
}
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories#list-hooks
2014-11-13 10:32:18 +03:00
func ListRepoHooks ( ctx * middleware . Context ) {
2015-08-08 17:43:14 +03:00
hooks , err := models . GetWebhooksByRepoId ( ctx . Repo . Repository . ID )
2014-11-13 10:32:18 +03:00
if err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "GetWebhooksByRepoId" , err )
2014-11-13 10:32:18 +03:00
return
}
2014-11-15 01:11:30 +03:00
apiHooks := make ( [ ] * api . Hook , len ( hooks ) )
2014-11-13 10:32:18 +03:00
for i := range hooks {
2015-08-29 06:49:59 +03:00
apiHooks [ i ] = ToApiHook ( ctx . Repo . RepoLink , hooks [ i ] )
2014-11-13 10:32:18 +03:00
}
ctx . JSON ( 200 , & apiHooks )
}
2014-11-13 20:57:00 +03:00
2015-08-29 06:49:59 +03:00
// https://github.com/gogits/go-gogs-client/wiki/Repositories#create-a-hook
2014-12-13 04:30:32 +03:00
func CreateRepoHook ( ctx * middleware . Context , form api . CreateHookOption ) {
2014-11-13 20:57:00 +03:00
if ! models . IsValidHookTaskType ( form . Type ) {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 422 , "" , "Invalid hook type" )
2014-11-13 20:57:00 +03:00
return
}
for _ , name := range [ ] string { "url" , "content_type" } {
if _ , ok := form . Config [ name ] ; ! ok {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 422 , "" , "Missing config option: " + name )
2014-11-13 20:57:00 +03:00
return
}
}
if ! models . IsValidHookContentType ( form . Config [ "content_type" ] ) {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 422 , "" , "Invalid content type" )
2014-11-13 20:57:00 +03:00
return
}
2015-08-29 06:53:46 +03:00
if len ( form . Events ) == 0 {
form . Events = [ ] string { "push" }
}
2014-11-13 20:57:00 +03:00
w := & models . Webhook {
2015-08-26 16:45:51 +03:00
RepoID : ctx . Repo . Repository . ID ,
URL : form . Config [ "url" ] ,
2014-11-13 20:57:00 +03:00
ContentType : models . ToHookContentType ( form . Config [ "content_type" ] ) ,
Secret : form . Config [ "secret" ] ,
HookEvent : & models . HookEvent {
2015-08-29 06:49:59 +03:00
ChooseEvents : true ,
HookEvents : models . HookEvents {
Create : com . IsSliceContainsStr ( form . Events , string ( models . HOOK_EVENT_CREATE ) ) ,
Push : com . IsSliceContainsStr ( form . Events , string ( models . HOOK_EVENT_PUSH ) ) ,
} ,
2014-11-13 20:57:00 +03:00
} ,
IsActive : form . Active ,
HookTaskType : models . ToHookTaskType ( form . Type ) ,
}
if w . HookTaskType == models . SLACK {
channel , ok := form . Config [ "channel" ]
if ! ok {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 422 , "" , "Missing config option: channel" )
2014-11-13 20:57:00 +03:00
return
}
2015-08-28 18:36:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2015-08-29 06:49:59 +03:00
Channel : channel ,
Username : form . Config [ "username" ] ,
IconURL : form . Config [ "icon_url" ] ,
Color : form . Config [ "color" ] ,
2014-11-13 20:57:00 +03:00
} )
if err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "slack: JSON marshal failed" , err )
2014-11-13 20:57:00 +03:00
return
}
w . Meta = string ( meta )
}
if err := w . UpdateEvent ( ) ; err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "UpdateEvent" , err )
2014-11-13 20:57:00 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "CreateWebhook" , err )
2014-11-13 20:57:00 +03:00
return
}
2015-08-29 06:49:59 +03:00
ctx . JSON ( 201 , ToApiHook ( ctx . Repo . RepoLink , w ) )
2014-11-13 20:57:00 +03:00
}
2015-08-29 06:49:59 +03:00
// https://github.com/gogits/go-gogs-client/wiki/Repositories#edit-a-hook
2014-12-13 04:30:32 +03:00
func EditRepoHook ( ctx * middleware . Context , form api . EditHookOption ) {
2015-08-27 18:06:14 +03:00
w , err := models . GetWebhookByID ( ctx . ParamsInt64 ( ":id" ) )
2014-11-13 20:57:00 +03:00
if err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "GetWebhookById" , err )
2014-11-13 20:57:00 +03:00
return
}
if form . Config != nil {
if url , ok := form . Config [ "url" ] ; ok {
2015-08-26 16:45:51 +03:00
w . URL = url
2014-11-13 20:57:00 +03:00
}
if ct , ok := form . Config [ "content_type" ] ; ok {
if ! models . IsValidHookContentType ( ct ) {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 422 , "" , "Invalid content type" )
2014-11-13 20:57:00 +03:00
return
}
w . ContentType = models . ToHookContentType ( ct )
}
if w . HookTaskType == models . SLACK {
if channel , ok := form . Config [ "channel" ] ; ok {
2015-08-28 18:36:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2015-08-29 06:49:59 +03:00
Channel : channel ,
Username : form . Config [ "username" ] ,
IconURL : form . Config [ "icon_url" ] ,
Color : form . Config [ "color" ] ,
2014-11-13 20:57:00 +03:00
} )
if err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "slack: JSON marshal failed" , err )
2014-11-13 20:57:00 +03:00
return
}
w . Meta = string ( meta )
}
}
}
2015-08-29 06:49:59 +03:00
// Update events
2015-08-29 06:53:46 +03:00
if len ( form . Events ) == 0 {
form . Events = [ ] string { "push" }
}
2015-08-29 06:49:59 +03:00
w . PushOnly = false
w . SendEverything = false
w . ChooseEvents = true
w . Create = com . IsSliceContainsStr ( form . Events , string ( models . HOOK_EVENT_CREATE ) )
w . Push = com . IsSliceContainsStr ( form . Events , string ( models . HOOK_EVENT_PUSH ) )
if err = w . UpdateEvent ( ) ; err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "UpdateEvent" , err )
2015-08-29 06:49:59 +03:00
return
}
2014-11-13 20:57:00 +03:00
if form . Active != nil {
w . IsActive = * form . Active
}
if err := models . UpdateWebhook ( w ) ; err != nil {
2015-10-09 03:36:07 +03:00
ctx . APIError ( 500 , "UpdateWebhook" , err )
2014-11-13 20:57:00 +03:00
return
}
2015-08-29 06:49:59 +03:00
ctx . JSON ( 200 , ToApiHook ( ctx . Repo . RepoLink , w ) )
2014-11-13 20:57:00 +03:00
}