2014-05-05 20:52:25 -04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2017-05-29 09:17:15 +02:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2014-05-05 20:52:25 -04:00
2021-11-10 13:13:16 +08:00
package webhook
2014-05-05 20:52:25 -04:00
import (
2021-01-26 15:02:42 -06:00
"context"
2015-08-27 23:06:14 +08:00
"fmt"
2020-12-12 00:04:04 +08:00
"strings"
2014-05-05 20:52:25 -04:00
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2021-07-25 00:03:58 +08:00
"code.gitea.io/gitea/modules/json"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/modules/log"
2022-11-03 19:23:20 +01:00
"code.gitea.io/gitea/modules/secret"
"code.gitea.io/gitea/modules/setting"
2019-08-15 22:46:21 +08:00
"code.gitea.io/gitea/modules/timeutil"
2021-08-12 14:43:08 +02:00
"code.gitea.io/gitea/modules/util"
2023-01-01 16:23:15 +01:00
webhook_module "code.gitea.io/gitea/modules/webhook"
2019-08-15 22:46:21 +08:00
2021-08-12 14:43:08 +02:00
"xorm.io/builder"
2014-05-05 20:52:25 -04:00
)
2021-11-10 13:13:16 +08:00
// ErrWebhookNotExist represents a "WebhookNotExist" kind of error.
type ErrWebhookNotExist struct {
ID int64
}
// IsErrWebhookNotExist checks if an error is a ErrWebhookNotExist.
func IsErrWebhookNotExist ( err error ) bool {
_ , ok := err . ( ErrWebhookNotExist )
return ok
}
func ( err ErrWebhookNotExist ) Error ( ) string {
return fmt . Sprintf ( "webhook does not exist [id: %d]" , err . ID )
}
2022-10-18 06:50:37 +01:00
func ( err ErrWebhookNotExist ) Unwrap ( ) error {
return util . ErrNotExist
}
2022-01-05 22:00:20 +01:00
// ErrHookTaskNotExist represents a "HookTaskNotExist" kind of error.
type ErrHookTaskNotExist struct {
2022-10-21 18:21:56 +02:00
TaskID int64
2022-01-05 22:00:20 +01:00
HookID int64
UUID string
}
2023-01-01 16:23:15 +01:00
// IsErrHookTaskNotExist checks if an error is a ErrHookTaskNotExist.
2022-01-05 22:00:20 +01:00
func IsErrHookTaskNotExist ( err error ) bool {
_ , ok := err . ( ErrHookTaskNotExist )
return ok
}
func ( err ErrHookTaskNotExist ) Error ( ) string {
2022-10-21 18:21:56 +02:00
return fmt . Sprintf ( "hook task does not exist [task: %d, hook: %d, uuid: %s]" , err . TaskID , err . HookID , err . UUID )
2022-01-05 22:00:20 +01:00
}
2022-10-18 06:50:37 +01:00
func ( err ErrHookTaskNotExist ) Unwrap ( ) error {
return util . ErrNotExist
}
2016-11-22 07:42:52 +01:00
// HookContentType is the content type of a web hook
2014-06-08 04:45:34 -04:00
type HookContentType int
2014-05-05 20:52:25 -04:00
const (
2016-11-22 07:42:52 +01:00
// ContentTypeJSON is a JSON payload for web hooks
2016-11-07 21:58:22 +01:00
ContentTypeJSON HookContentType = iota + 1
2016-11-22 07:42:52 +01:00
// ContentTypeForm is an url-encoded form payload for web hook
2016-11-07 17:53:22 +01:00
ContentTypeForm
2014-05-05 20:52:25 -04:00
)
2014-11-13 12:57:00 -05:00
var hookContentTypes = map [ string ] HookContentType {
2016-11-07 21:58:22 +01:00
"json" : ContentTypeJSON ,
2016-11-07 17:53:22 +01:00
"form" : ContentTypeForm ,
2014-11-13 12:57:00 -05:00
}
// ToHookContentType returns HookContentType by given name.
func ToHookContentType ( name string ) HookContentType {
return hookContentTypes [ name ]
}
2021-01-26 15:02:42 -06:00
// HookTaskCleanupType is the type of cleanup to perform on hook_task
type HookTaskCleanupType int
const (
// OlderThan hook_task rows will be cleaned up by the age of the row
OlderThan HookTaskCleanupType = iota
// PerWebhook hook_task rows will be cleaned up by leaving the most recent deliveries for each webhook
PerWebhook
)
var hookTaskCleanupTypes = map [ string ] HookTaskCleanupType {
"OlderThan" : OlderThan ,
"PerWebhook" : PerWebhook ,
}
// ToHookTaskCleanupType returns HookTaskCleanupType by given name.
func ToHookTaskCleanupType ( name string ) HookTaskCleanupType {
return hookTaskCleanupTypes [ name ]
}
2016-11-22 07:42:52 +01:00
// Name returns the name of a given web hook's content type
2014-11-13 02:32:18 -05:00
func ( t HookContentType ) Name ( ) string {
switch t {
2016-11-07 21:58:22 +01:00
case ContentTypeJSON :
2014-11-13 02:32:18 -05:00
return "json"
2016-11-07 17:53:22 +01:00
case ContentTypeForm :
2014-11-13 02:32:18 -05:00
return "form"
}
return ""
}
2014-11-13 12:57:00 -05:00
// IsValidHookContentType returns true if given name is a valid hook content type.
func IsValidHookContentType ( name string ) bool {
_ , ok := hookContentTypes [ name ]
return ok
}
2014-06-08 04:45:34 -04:00
// Webhook represents a web hook object.
2014-05-05 20:52:25 -04:00
type Webhook struct {
2023-01-01 16:23:15 +01:00
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" ` // An ID of 0 indicates either a default or system webhook
2023-03-10 15:28:32 +01:00
OwnerID int64 ` xorm:"INDEX" `
2023-01-01 16:23:15 +01:00
IsSystemWebhook bool
URL string ` xorm:"url TEXT" `
HTTPMethod string ` xorm:"http_method" `
ContentType HookContentType
Secret string ` xorm:"TEXT" `
Events string ` xorm:"TEXT" `
* webhook_module . HookEvent ` xorm:"-" `
IsActive bool ` xorm:"INDEX" `
Type webhook_module . HookType ` xorm:"VARCHAR(16) 'type'" `
Meta string ` xorm:"TEXT" ` // store hook-specific attributes
LastStatus webhook_module . HookStatus // Last delivery status
2016-03-09 19:53:30 -05:00
2022-11-03 19:23:20 +01:00
// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization()
HeaderAuthorizationEncrypted string ` xorm:"TEXT" `
2019-08-15 22:46:21 +08:00
CreatedUnix timeutil . TimeStamp ` xorm:"INDEX created" `
UpdatedUnix timeutil . TimeStamp ` xorm:"INDEX updated" `
2014-05-05 20:52:25 -04:00
}
2021-09-19 19:49:59 +08:00
func init ( ) {
db . RegisterModel ( new ( Webhook ) )
}
2017-10-02 00:52:35 +08:00
// AfterLoad updates the webhook object upon setting a column
func ( w * Webhook ) AfterLoad ( ) {
2023-01-01 16:23:15 +01:00
w . HookEvent = & webhook_module . HookEvent { }
2017-10-02 00:52:35 +08:00
if err := json . Unmarshal ( [ ] byte ( w . Events ) , w . HookEvent ) ; err != nil {
2019-04-02 08:48:31 +01:00
log . Error ( "Unmarshal[%d]: %v" , w . ID , err )
2014-05-05 20:52:25 -04:00
}
}
2015-08-27 23:06:14 +08:00
// History returns history of webhook by given conditions.
func ( w * Webhook ) History ( page int ) ( [ ] * HookTask , error ) {
return HookTasks ( w . ID , page )
}
2014-06-08 04:54:52 -04:00
// UpdateEvent handles conversion from HookEvent to Events.
2014-06-08 04:45:34 -04:00
func ( w * Webhook ) UpdateEvent ( ) error {
2014-05-05 21:36:08 -04:00
data , err := json . Marshal ( w . HookEvent )
2014-05-05 20:52:25 -04:00
w . Events = string ( data )
return err
}
2015-08-28 23:36:13 +08:00
// HasCreateEvent returns true if hook enabled create event.
func ( w * Webhook ) HasCreateEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Create )
}
2018-05-16 22:01:55 +08:00
// HasDeleteEvent returns true if hook enabled delete event.
func ( w * Webhook ) HasDeleteEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Delete )
}
// HasForkEvent returns true if hook enabled fork event.
func ( w * Webhook ) HasForkEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Fork )
}
// HasIssuesEvent returns true if hook enabled issues event.
func ( w * Webhook ) HasIssuesEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Issues )
}
2020-03-05 23:10:48 -06:00
// HasIssuesAssignEvent returns true if hook enabled issues assign event.
func ( w * Webhook ) HasIssuesAssignEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . IssueAssign )
}
// HasIssuesLabelEvent returns true if hook enabled issues label event.
func ( w * Webhook ) HasIssuesLabelEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . IssueLabel )
}
// HasIssuesMilestoneEvent returns true if hook enabled issues milestone event.
func ( w * Webhook ) HasIssuesMilestoneEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . IssueMilestone )
}
2018-05-16 22:01:55 +08:00
// HasIssueCommentEvent returns true if hook enabled issue_comment event.
func ( w * Webhook ) HasIssueCommentEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . IssueComment )
}
2014-12-06 20:22:48 -05:00
// HasPushEvent returns true if hook enabled push event.
2014-05-06 11:50:31 -04:00
func ( w * Webhook ) HasPushEvent ( ) bool {
2015-08-28 23:36:13 +08:00
return w . PushOnly || w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Push )
2014-05-06 11:50:31 -04:00
}
2016-08-14 03:32:24 -07:00
// HasPullRequestEvent returns true if hook enabled pull request event.
func ( w * Webhook ) HasPullRequestEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequest )
}
2020-03-05 23:10:48 -06:00
// HasPullRequestAssignEvent returns true if hook enabled pull request assign event.
func ( w * Webhook ) HasPullRequestAssignEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestAssign )
}
// HasPullRequestLabelEvent returns true if hook enabled pull request label event.
func ( w * Webhook ) HasPullRequestLabelEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestLabel )
}
// HasPullRequestMilestoneEvent returns true if hook enabled pull request milestone event.
func ( w * Webhook ) HasPullRequestMilestoneEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestMilestone )
}
// HasPullRequestCommentEvent returns true if hook enabled pull_request_comment event.
func ( w * Webhook ) HasPullRequestCommentEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestComment )
}
// HasPullRequestApprovedEvent returns true if hook enabled pull request review event.
func ( w * Webhook ) HasPullRequestApprovedEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestReview )
}
// HasPullRequestRejectedEvent returns true if hook enabled pull request review event.
func ( w * Webhook ) HasPullRequestRejectedEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestReview )
}
// HasPullRequestReviewCommentEvent returns true if hook enabled pull request review event.
func ( w * Webhook ) HasPullRequestReviewCommentEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestReview )
}
// HasPullRequestSyncEvent returns true if hook enabled pull request sync event.
func ( w * Webhook ) HasPullRequestSyncEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestSync )
}
2022-09-04 21:54:23 +02:00
// HasWikiEvent returns true if hook enabled wiki event.
func ( w * Webhook ) HasWikiEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvent . Wiki )
}
2018-05-16 22:01:55 +08:00
// HasReleaseEvent returns if hook enabled release event.
func ( w * Webhook ) HasReleaseEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Release )
}
2017-09-03 01:20:24 -07:00
// HasRepositoryEvent returns if hook enabled repository event.
func ( w * Webhook ) HasRepositoryEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Repository )
}
2022-03-30 10:42:47 +02:00
// HasPackageEvent returns if hook enabled package event.
func ( w * Webhook ) HasPackageEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . Package )
}
2023-05-25 10:06:27 +08:00
// HasPullRequestReviewRequestEvent returns true if hook enabled pull request review request event.
func ( w * Webhook ) HasPullRequestReviewRequestEvent ( ) bool {
return w . SendEverything ||
( w . ChooseEvents && w . HookEvents . PullRequestReviewRequest )
}
2019-11-02 06:51:22 +08:00
// EventCheckers returns event checkers
func ( w * Webhook ) EventCheckers ( ) [ ] struct {
Has func ( ) bool
2023-01-01 16:23:15 +01:00
Type webhook_module . HookEventType
2018-05-16 22:01:55 +08:00
} {
return [ ] struct {
2019-11-02 06:51:22 +08:00
Has func ( ) bool
2023-01-01 16:23:15 +01:00
Type webhook_module . HookEventType
2018-05-16 22:01:55 +08:00
} {
2023-01-01 16:23:15 +01:00
{ w . HasCreateEvent , webhook_module . HookEventCreate } ,
{ w . HasDeleteEvent , webhook_module . HookEventDelete } ,
{ w . HasForkEvent , webhook_module . HookEventFork } ,
{ w . HasPushEvent , webhook_module . HookEventPush } ,
{ w . HasIssuesEvent , webhook_module . HookEventIssues } ,
{ w . HasIssuesAssignEvent , webhook_module . HookEventIssueAssign } ,
{ w . HasIssuesLabelEvent , webhook_module . HookEventIssueLabel } ,
{ w . HasIssuesMilestoneEvent , webhook_module . HookEventIssueMilestone } ,
{ w . HasIssueCommentEvent , webhook_module . HookEventIssueComment } ,
{ w . HasPullRequestEvent , webhook_module . HookEventPullRequest } ,
{ w . HasPullRequestAssignEvent , webhook_module . HookEventPullRequestAssign } ,
{ w . HasPullRequestLabelEvent , webhook_module . HookEventPullRequestLabel } ,
{ w . HasPullRequestMilestoneEvent , webhook_module . HookEventPullRequestMilestone } ,
{ w . HasPullRequestCommentEvent , webhook_module . HookEventPullRequestComment } ,
{ w . HasPullRequestApprovedEvent , webhook_module . HookEventPullRequestReviewApproved } ,
{ w . HasPullRequestRejectedEvent , webhook_module . HookEventPullRequestReviewRejected } ,
{ w . HasPullRequestCommentEvent , webhook_module . HookEventPullRequestReviewComment } ,
{ w . HasPullRequestSyncEvent , webhook_module . HookEventPullRequestSync } ,
{ w . HasWikiEvent , webhook_module . HookEventWiki } ,
{ w . HasRepositoryEvent , webhook_module . HookEventRepository } ,
{ w . HasReleaseEvent , webhook_module . HookEventRelease } ,
{ w . HasPackageEvent , webhook_module . HookEventPackage } ,
2023-05-25 10:06:27 +08:00
{ w . HasPullRequestReviewRequestEvent , webhook_module . HookEventPullRequestReviewRequest } ,
2018-05-16 22:01:55 +08:00
}
}
2016-11-22 07:42:52 +01:00
// EventsArray returns an array of hook events
2015-08-29 11:49:59 +08:00
func ( w * Webhook ) EventsArray ( ) [ ] string {
2018-05-16 22:01:55 +08:00
events := make ( [ ] string , 0 , 7 )
2019-11-02 06:51:22 +08:00
for _ , c := range w . EventCheckers ( ) {
if c . Has ( ) {
events = append ( events , string ( c . Type ) )
2018-05-16 22:01:55 +08:00
}
2016-08-24 23:44:58 -04:00
}
2015-08-29 11:49:59 +08:00
return events
}
2022-11-03 19:23:20 +01:00
// HeaderAuthorization returns the decrypted Authorization header.
// Not on the reference (*w), to be accessible on WebhooksNew.
func ( w Webhook ) HeaderAuthorization ( ) ( string , error ) {
if w . HeaderAuthorizationEncrypted == "" {
return "" , nil
}
return secret . DecryptSecret ( setting . SecretKey , w . HeaderAuthorizationEncrypted )
}
// SetHeaderAuthorization encrypts and sets the Authorization header.
func ( w * Webhook ) SetHeaderAuthorization ( cleartext string ) error {
if cleartext == "" {
w . HeaderAuthorizationEncrypted = ""
return nil
}
ciphertext , err := secret . EncryptSecret ( setting . SecretKey , cleartext )
if err != nil {
return err
}
w . HeaderAuthorizationEncrypted = ciphertext
return nil
}
2014-06-08 04:45:34 -04:00
// CreateWebhook creates a new web hook.
2021-11-10 13:13:16 +08:00
func CreateWebhook ( ctx context . Context , w * Webhook ) error {
2020-12-12 00:04:04 +08:00
w . Type = strings . TrimSpace ( w . Type )
2021-11-10 13:13:16 +08:00
return db . Insert ( ctx , w )
2014-05-05 20:52:25 -04:00
}
2022-06-06 16:01:49 +08:00
// CreateWebhooks creates multiple web hooks
func CreateWebhooks ( ctx context . Context , ws [ ] * Webhook ) error {
2022-08-04 07:22:50 +03:00
// xorm returns err "no element on slice when insert" for empty slices.
if len ( ws ) == 0 {
return nil
}
2022-06-06 16:01:49 +08:00
for i := 0 ; i < len ( ws ) ; i ++ {
ws [ i ] . Type = strings . TrimSpace ( ws [ i ] . Type )
}
return db . Insert ( ctx , ws )
}
2016-07-17 08:33:59 +08:00
// getWebhook uses argument bean as query condition,
// ID must be specified and do not assign unnecessary fields.
func getWebhook ( bean * Webhook ) ( * Webhook , error ) {
2021-09-23 16:45:36 +01:00
has , err := db . GetEngine ( db . DefaultContext ) . Get ( bean )
2014-05-05 21:36:08 -04:00
if err != nil {
return nil , err
} else if ! has {
2023-01-01 16:23:15 +01:00
return nil , ErrWebhookNotExist { ID : bean . ID }
2014-05-05 21:36:08 -04:00
}
2016-07-17 08:33:59 +08:00
return bean , nil
}
2017-08-30 13:36:52 +08:00
// GetWebhookByID returns webhook of repository by given ID.
func GetWebhookByID ( id int64 ) ( * Webhook , error ) {
return getWebhook ( & Webhook {
ID : id ,
} )
}
2016-07-17 08:33:59 +08:00
// GetWebhookByRepoID returns webhook of repository by given ID.
func GetWebhookByRepoID ( repoID , id int64 ) ( * Webhook , error ) {
return getWebhook ( & Webhook {
ID : id ,
RepoID : repoID ,
} )
2014-05-05 21:36:08 -04:00
}
2023-03-10 15:28:32 +01:00
// GetWebhookByOwnerID returns webhook of a user or organization by given ID.
func GetWebhookByOwnerID ( ownerID , id int64 ) ( * Webhook , error ) {
2016-07-17 08:33:59 +08:00
return getWebhook ( & Webhook {
2023-03-10 15:28:32 +01:00
ID : id ,
OwnerID : ownerID ,
2016-07-17 08:33:59 +08:00
} )
2016-07-16 01:02:55 +08:00
}
2021-08-12 14:43:08 +02:00
// ListWebhookOptions are options to filter webhooks on ListWebhooksByOpts
type ListWebhookOptions struct {
2021-09-24 19:32:56 +08:00
db . ListOptions
2021-08-12 14:43:08 +02:00
RepoID int64
2023-03-10 15:28:32 +01:00
OwnerID int64
2021-08-12 14:43:08 +02:00
IsActive util . OptionalBool
2017-09-03 01:20:24 -07:00
}
2021-08-12 14:43:08 +02:00
func ( opts * ListWebhookOptions ) toCond ( ) builder . Cond {
cond := builder . NewCond ( )
if opts . RepoID != 0 {
cond = cond . And ( builder . Eq { "webhook.repo_id" : opts . RepoID } )
}
2023-03-10 15:28:32 +01:00
if opts . OwnerID != 0 {
cond = cond . And ( builder . Eq { "webhook.owner_id" : opts . OwnerID } )
2021-08-12 14:43:08 +02:00
}
if ! opts . IsActive . IsNone ( ) {
cond = cond . And ( builder . Eq { "webhook.is_active" : opts . IsActive . IsTrue ( ) } )
2020-01-24 19:00:29 +00:00
}
2021-08-12 14:43:08 +02:00
return cond
}
2020-01-24 19:00:29 +00:00
2022-05-20 22:08:52 +08:00
// ListWebhooksByOpts return webhooks based on options
func ListWebhooksByOpts ( ctx context . Context , opts * ListWebhookOptions ) ( [ ] * Webhook , error ) {
sess := db . GetEngine ( ctx ) . Where ( opts . toCond ( ) )
2020-01-24 19:00:29 +00:00
2021-08-12 14:43:08 +02:00
if opts . Page != 0 {
2021-09-24 19:32:56 +08:00
sess = db . SetSessionPagination ( sess , opts )
2021-08-12 14:43:08 +02:00
webhooks := make ( [ ] * Webhook , 0 , opts . PageSize )
err := sess . Find ( & webhooks )
return webhooks , err
}
2014-05-05 21:36:08 -04:00
2021-08-12 14:43:08 +02:00
webhooks := make ( [ ] * Webhook , 0 , 10 )
err := sess . Find ( & webhooks )
return webhooks , err
2017-09-03 01:20:24 -07:00
}
2021-08-12 14:43:08 +02:00
// CountWebhooksByOpts count webhooks based on options and ignore pagination
func CountWebhooksByOpts ( opts * ListWebhookOptions ) ( int64 , error ) {
2021-09-23 16:45:36 +01:00
return db . GetEngine ( db . DefaultContext ) . Where ( opts . toCond ( ) ) . Count ( & Webhook { } )
2017-01-25 05:37:35 -05:00
}
2014-06-08 04:45:34 -04:00
// UpdateWebhook updates information of webhook.
func UpdateWebhook ( w * Webhook ) error {
2021-09-23 16:45:36 +01:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( w . ID ) . AllCols ( ) . Update ( w )
2014-06-08 04:45:34 -04:00
return err
}
2017-08-30 13:36:52 +08:00
// UpdateWebhookLastStatus updates last status of webhook.
func UpdateWebhookLastStatus ( w * Webhook ) error {
2021-09-23 16:45:36 +01:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( w . ID ) . Cols ( "last_status" ) . Update ( w )
2017-08-30 13:36:52 +08:00
return err
}
2016-07-17 08:33:59 +08:00
// deleteWebhook uses argument bean as query condition,
// ID must be specified and do not assign unnecessary fields.
func deleteWebhook ( bean * Webhook ) ( err error ) {
2022-11-13 04:18:50 +08:00
ctx , committer , err := db . TxContext ( db . DefaultContext )
2021-11-21 23:41:00 +08:00
if err != nil {
2015-08-26 21:45:51 +08:00
return err
}
2021-11-21 23:41:00 +08:00
defer committer . Close ( )
2015-08-26 21:45:51 +08:00
2021-11-21 23:41:00 +08:00
if count , err := db . DeleteByBean ( ctx , bean ) ; err != nil {
2015-08-26 21:45:51 +08:00
return err
2017-01-13 21:14:48 -05:00
} else if count == 0 {
return ErrWebhookNotExist { ID : bean . ID }
2021-11-21 23:41:00 +08:00
} else if _ , err = db . DeleteByBean ( ctx , & HookTask { HookID : bean . ID } ) ; err != nil {
2015-08-26 21:45:51 +08:00
return err
}
2021-11-21 23:41:00 +08:00
return committer . Commit ( )
2014-05-05 21:36:08 -04:00
}
2014-06-08 04:45:34 -04:00
2016-07-17 08:33:59 +08:00
// DeleteWebhookByRepoID deletes webhook of repository by given ID.
2016-07-23 20:24:44 +08:00
func DeleteWebhookByRepoID ( repoID , id int64 ) error {
2016-07-17 08:33:59 +08:00
return deleteWebhook ( & Webhook {
ID : id ,
RepoID : repoID ,
} )
}
2023-03-10 15:28:32 +01:00
// DeleteWebhookByOwnerID deletes webhook of a user or organization by given ID.
func DeleteWebhookByOwnerID ( ownerID , id int64 ) error {
2016-07-17 08:33:59 +08:00
return deleteWebhook ( & Webhook {
2023-03-10 15:28:32 +01:00
ID : id ,
OwnerID : ownerID ,
2016-07-17 08:33:59 +08:00
} )
}