From 9edcc94266e6a275c4a002206bd441c551595a9e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 14 Dec 2021 15:26:29 +0000 Subject: [PATCH] Delete only HookTasks of the repository. --- models/repo.go | 13 +++++++++++-- models/webhook/webhook.go | 41 ++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/models/repo.go b/models/repo.go index 897ceeede9793..de23054431309 100644 --- a/models/repo.go +++ b/models/repo.go @@ -766,7 +766,6 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { &Comment{RefRepoID: repoID}, &CommitStatus{RepoID: repoID}, &DeletedBranch{RepoID: repoID}, - &webhook.HookTask{RepoID: repoID}, &LFSLock{RepoID: repoID}, &repo_model.LanguageStat{RepoID: repoID}, &Milestone{RepoID: repoID}, @@ -783,11 +782,21 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error { &repo_model.Star{RepoID: repoID}, &Task{RepoID: repoID}, &repo_model.Watch{RepoID: repoID}, - &webhook.Webhook{RepoID: repoID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } + // Delete Webhooks and related objects + hooks, err := webhook.ListWebhooksByOptsCtx(ctx, &webhook.ListWebhookOptions{RepoID: repoID}) + if err != nil { + return err + } + for _, hook := range hooks { + if err := webhook.DeleteWebhook(ctx, hook); err != nil { + return err + } + } + // Delete Labels and related objects if err := deleteLabelsByRepoID(sess, repoID); err != nil { return err diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index d01f548eed418..df8b88ed3559c 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -429,8 +429,10 @@ func (opts *ListWebhookOptions) toCond() builder.Cond { return cond } -func listWebhooksByOpts(e db.Engine, opts *ListWebhookOptions) ([]*Webhook, error) { - sess := e.Where(opts.toCond()) +// ListWebhooksByOptsCtx gets webhooks based on options +func ListWebhooksByOptsCtx(ctx context.Context, opts *ListWebhookOptions) ([]*Webhook, error) { + sess := db.GetEngine(ctx). + Where(opts.toCond()) if opts.Page != 0 { sess = db.SetSessionPagination(sess, opts) @@ -440,13 +442,12 @@ func listWebhooksByOpts(e db.Engine, opts *ListWebhookOptions) ([]*Webhook, erro } webhooks := make([]*Webhook, 0, 10) - err := sess.Find(&webhooks) - return webhooks, err + return webhooks, sess.Find(&webhooks) } // ListWebhooksByOpts return webhooks based on options func ListWebhooksByOpts(opts *ListWebhookOptions) ([]*Webhook, error) { - return listWebhooksByOpts(db.GetEngine(db.DefaultContext), opts) + return ListWebhooksByOptsCtx(db.DefaultContext, opts) } // CountWebhooksByOpts count webhooks based on options and ignore pagination @@ -504,15 +505,8 @@ func UpdateWebhookLastStatus(w *Webhook) error { return err } -// deleteWebhook uses argument bean as query condition, -// ID must be specified and do not assign unnecessary fields. -func deleteWebhook(bean *Webhook) (err error) { - ctx, committer, err := db.TxContext() - if err != nil { - return err - } - defer committer.Close() - +// DeleteWebhook deletes a webhook +func DeleteWebhook(ctx context.Context, bean *Webhook) error { if count, err := db.DeleteByBean(ctx, bean); err != nil { return err } else if count == 0 { @@ -520,23 +514,26 @@ func deleteWebhook(bean *Webhook) (err error) { } else if _, err = db.DeleteByBean(ctx, &HookTask{HookID: bean.ID}); err != nil { return err } - - return committer.Commit() + return nil } // DeleteWebhookByRepoID deletes webhook of repository by given ID. func DeleteWebhookByRepoID(repoID, id int64) error { - return deleteWebhook(&Webhook{ - ID: id, - RepoID: repoID, + return db.WithTx(func(ctx context.Context) error { + return DeleteWebhook(ctx, &Webhook{ + ID: id, + RepoID: repoID, + }) }) } // DeleteWebhookByOrgID deletes webhook of organization by given ID. func DeleteWebhookByOrgID(orgID, id int64) error { - return deleteWebhook(&Webhook{ - ID: id, - OrgID: orgID, + return db.WithTx(func(ctx context.Context) error { + return DeleteWebhook(ctx, &Webhook{ + ID: id, + OrgID: orgID, + }) }) }