mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-01 05:36:19 +01:00
Fix broken migration on webhook (#13911)
* Fix broken migration on webhook * Fix lint Co-authored-by: John Olheiser <john.olheiser@gmail.com>
This commit is contained in:
parent
18e4477ad4
commit
6edfa6bc88
8 changed files with 98 additions and 37 deletions
|
@ -267,6 +267,8 @@ var migrations = []Migration{
|
|||
NewMigration("Add block on official review requests branch protection", addBlockOnOfficialReviewRequests),
|
||||
// v161 -> v162
|
||||
NewMigration("Convert task type from int to string", convertTaskTypeToString),
|
||||
// v162 -> v163
|
||||
NewMigration("Convert webhook task type from int to string", convertWebhookTaskTypeToString),
|
||||
}
|
||||
|
||||
// GetCurrentDBVersion returns the current db version
|
||||
|
|
59
models/migrations/v162.go
Normal file
59
models/migrations/v162.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
// Copyright 2020 The Gitea 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 migrations
|
||||
|
||||
import (
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
func convertWebhookTaskTypeToString(x *xorm.Engine) error {
|
||||
const (
|
||||
GOGS int = iota + 1
|
||||
SLACK
|
||||
GITEA
|
||||
DISCORD
|
||||
DINGTALK
|
||||
TELEGRAM
|
||||
MSTEAMS
|
||||
FEISHU
|
||||
MATRIX
|
||||
)
|
||||
|
||||
var hookTaskTypes = map[int]string{
|
||||
GITEA: "gitea",
|
||||
GOGS: "gogs",
|
||||
SLACK: "slack",
|
||||
DISCORD: "discord",
|
||||
DINGTALK: "dingtalk",
|
||||
TELEGRAM: "telegram",
|
||||
MSTEAMS: "msteams",
|
||||
FEISHU: "feishu",
|
||||
MATRIX: "matrix",
|
||||
}
|
||||
|
||||
type Webhook struct {
|
||||
Type string `xorm:"char(16) index"`
|
||||
}
|
||||
if err := x.Sync2(new(Webhook)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i, s := range hookTaskTypes {
|
||||
if _, err := x.Exec("UPDATE webhook set type = ? where hook_task_type=?", s, i); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err := sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := dropTableColumns(sess, "webhook", "hook_task_type"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
|
@ -117,17 +117,17 @@ func GenerateWebhooks(ctx DBContext, templateRepo, generateRepo *Repository) err
|
|||
|
||||
for _, templateWebhook := range templateWebhooks {
|
||||
generateWebhook := &Webhook{
|
||||
RepoID: generateRepo.ID,
|
||||
URL: templateWebhook.URL,
|
||||
HTTPMethod: templateWebhook.HTTPMethod,
|
||||
ContentType: templateWebhook.ContentType,
|
||||
Secret: templateWebhook.Secret,
|
||||
HookEvent: templateWebhook.HookEvent,
|
||||
IsActive: templateWebhook.IsActive,
|
||||
HookTaskType: templateWebhook.HookTaskType,
|
||||
OrgID: templateWebhook.OrgID,
|
||||
Events: templateWebhook.Events,
|
||||
Meta: templateWebhook.Meta,
|
||||
RepoID: generateRepo.ID,
|
||||
URL: templateWebhook.URL,
|
||||
HTTPMethod: templateWebhook.HTTPMethod,
|
||||
ContentType: templateWebhook.ContentType,
|
||||
Secret: templateWebhook.Secret,
|
||||
HookEvent: templateWebhook.HookEvent,
|
||||
IsActive: templateWebhook.IsActive,
|
||||
Type: templateWebhook.Type,
|
||||
OrgID: templateWebhook.OrgID,
|
||||
Events: templateWebhook.Events,
|
||||
Meta: templateWebhook.Meta,
|
||||
}
|
||||
if err := createWebhook(ctx.e, generateWebhook); err != nil {
|
||||
return err
|
||||
|
|
|
@ -110,11 +110,11 @@ type Webhook struct {
|
|||
Secret string `xorm:"TEXT"`
|
||||
Events string `xorm:"TEXT"`
|
||||
*HookEvent `xorm:"-"`
|
||||
IsSSL bool `xorm:"is_ssl"`
|
||||
IsActive bool `xorm:"INDEX"`
|
||||
HookTaskType HookTaskType
|
||||
Meta string `xorm:"TEXT"` // store hook-specific attributes
|
||||
LastStatus HookStatus // Last delivery status
|
||||
IsSSL bool `xorm:"is_ssl"`
|
||||
IsActive bool `xorm:"INDEX"`
|
||||
Type HookTaskType `xorm:"char(16) 'type'"`
|
||||
Meta string `xorm:"TEXT"` // store hook-specific attributes
|
||||
LastStatus HookStatus // Last delivery status
|
||||
|
||||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
|
||||
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
|
||||
|
|
|
@ -227,7 +227,7 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
|
|||
"url": w.URL,
|
||||
"content_type": w.ContentType.Name(),
|
||||
}
|
||||
if w.HookTaskType == models.SLACK {
|
||||
if w.Type == models.SLACK {
|
||||
s := webhook.GetSlackHook(w)
|
||||
config["channel"] = s.Channel
|
||||
config["username"] = s.Username
|
||||
|
@ -237,7 +237,7 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
|
|||
|
||||
return &api.Hook{
|
||||
ID: w.ID,
|
||||
Type: string(w.HookTaskType),
|
||||
Type: string(w.Type),
|
||||
URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID),
|
||||
Active: w.IsActive,
|
||||
Config: config,
|
||||
|
|
|
@ -132,10 +132,10 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID
|
|||
},
|
||||
BranchFilter: form.BranchFilter,
|
||||
},
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.HookTaskType(form.Type),
|
||||
IsActive: form.Active,
|
||||
Type: models.HookTaskType(form.Type),
|
||||
}
|
||||
if w.HookTaskType == models.SLACK {
|
||||
if w.Type == models.SLACK {
|
||||
channel, ok := form.Config["channel"]
|
||||
if !ok {
|
||||
ctx.Error(http.StatusUnprocessableEntity, "", "Missing config option: channel")
|
||||
|
@ -219,7 +219,7 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho
|
|||
w.ContentType = models.ToHookContentType(ct)
|
||||
}
|
||||
|
||||
if w.HookTaskType == models.SLACK {
|
||||
if w.Type == models.SLACK {
|
||||
if channel, ok := form.Config["channel"]; ok {
|
||||
meta, err := json.Marshal(&webhook.SlackMeta{
|
||||
Channel: channel,
|
||||
|
|
|
@ -208,7 +208,7 @@ func GiteaHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) {
|
|||
Secret: form.Secret,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.GITEA,
|
||||
Type: models.GITEA,
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
}
|
||||
|
@ -261,7 +261,7 @@ func newGogsWebhookPost(ctx *context.Context, form auth.NewGogshookForm, kind mo
|
|||
Secret: form.Secret,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: kind,
|
||||
Type: kind,
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
}
|
||||
|
@ -311,7 +311,7 @@ func DiscordHooksNewPost(ctx *context.Context, form auth.NewDiscordHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.DISCORD,
|
||||
Type: models.DISCORD,
|
||||
Meta: string(meta),
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -353,7 +353,7 @@ func DingtalkHooksNewPost(ctx *context.Context, form auth.NewDingtalkHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.DINGTALK,
|
||||
Type: models.DINGTALK,
|
||||
Meta: "",
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -404,7 +404,7 @@ func TelegramHooksNewPost(ctx *context.Context, form auth.NewTelegramHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.TELEGRAM,
|
||||
Type: models.TELEGRAM,
|
||||
Meta: string(meta),
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -458,7 +458,7 @@ func MatrixHooksNewPost(ctx *context.Context, form auth.NewMatrixHookForm) {
|
|||
HTTPMethod: "PUT",
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.MATRIX,
|
||||
Type: models.MATRIX,
|
||||
Meta: string(meta),
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -500,7 +500,7 @@ func MSTeamsHooksNewPost(ctx *context.Context, form auth.NewMSTeamsHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.MSTEAMS,
|
||||
Type: models.MSTEAMS,
|
||||
Meta: "",
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -559,7 +559,7 @@ func SlackHooksNewPost(ctx *context.Context, form auth.NewSlackHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.SLACK,
|
||||
Type: models.SLACK,
|
||||
Meta: string(meta),
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -601,7 +601,7 @@ func FeishuHooksNewPost(ctx *context.Context, form auth.NewFeishuHookForm) {
|
|||
ContentType: models.ContentTypeJSON,
|
||||
HookEvent: ParseHookEvent(form.WebhookForm),
|
||||
IsActive: form.Active,
|
||||
HookTaskType: models.FEISHU,
|
||||
Type: models.FEISHU,
|
||||
Meta: "",
|
||||
OrgID: orCtx.OrgID,
|
||||
IsSystemWebhook: orCtx.IsSystemWebhook,
|
||||
|
@ -647,8 +647,8 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) {
|
|||
return nil, nil
|
||||
}
|
||||
|
||||
ctx.Data["HookType"] = w.HookTaskType
|
||||
switch w.HookTaskType {
|
||||
ctx.Data["HookType"] = w.Type
|
||||
switch w.Type {
|
||||
case models.SLACK:
|
||||
ctx.Data["SlackHook"] = webhook.GetSlackHook(w)
|
||||
case models.DISCORD:
|
||||
|
|
|
@ -128,7 +128,7 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
|
|||
// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
|
||||
// Integration webhooks (e.g. drone) still receive the required data.
|
||||
if pushEvent, ok := p.(*api.PushPayload); ok &&
|
||||
w.HookTaskType != models.GITEA && w.HookTaskType != models.GOGS &&
|
||||
w.Type != models.GITEA && w.Type != models.GOGS &&
|
||||
len(pushEvent.Commits) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
@ -144,11 +144,11 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
|
|||
|
||||
var payloader api.Payloader
|
||||
var err error
|
||||
webhook, ok := webhooks[w.HookTaskType]
|
||||
webhook, ok := webhooks[w.Type]
|
||||
if ok {
|
||||
payloader, err = webhook.payloadCreator(p, event, w.Meta)
|
||||
if err != nil {
|
||||
return fmt.Errorf("create payload for %s[%s]: %v", w.HookTaskType, event, err)
|
||||
return fmt.Errorf("create payload for %s[%s]: %v", w.Type, event, err)
|
||||
}
|
||||
} else {
|
||||
p.SetSecret(w.Secret)
|
||||
|
@ -172,7 +172,7 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
|
|||
if err = models.CreateHookTask(&models.HookTask{
|
||||
RepoID: repo.ID,
|
||||
HookID: w.ID,
|
||||
Typ: w.HookTaskType,
|
||||
Typ: w.Type,
|
||||
URL: w.URL,
|
||||
Signature: signature,
|
||||
Payloader: payloader,
|
||||
|
|
Loading…
Reference in a new issue