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() | ||||
| } | ||||
|  | @ -124,7 +124,7 @@ func GenerateWebhooks(ctx DBContext, templateRepo, generateRepo *Repository) err | |||
| 			Secret:      templateWebhook.Secret, | ||||
| 			HookEvent:   templateWebhook.HookEvent, | ||||
| 			IsActive:    templateWebhook.IsActive, | ||||
| 			HookTaskType: templateWebhook.HookTaskType, | ||||
| 			Type:        templateWebhook.Type, | ||||
| 			OrgID:       templateWebhook.OrgID, | ||||
| 			Events:      templateWebhook.Events, | ||||
| 			Meta:        templateWebhook.Meta, | ||||
|  |  | |||
|  | @ -112,7 +112,7 @@ type Webhook struct { | |||
| 	*HookEvent      `xorm:"-"` | ||||
| 	IsSSL           bool         `xorm:"is_ssl"` | ||||
| 	IsActive        bool         `xorm:"INDEX"` | ||||
| 	HookTaskType    HookTaskType | ||||
| 	Type            HookTaskType `xorm:"char(16) 'type'"` | ||||
| 	Meta            string       `xorm:"TEXT"` // store hook-specific attributes
 | ||||
| 	LastStatus      HookStatus   // Last delivery status
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
|  | @ -133,9 +133,9 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID | |||
| 			BranchFilter: form.BranchFilter, | ||||
| 		}, | ||||
| 		IsActive: form.Active, | ||||
| 		HookTaskType: models.HookTaskType(form.Type), | ||||
| 		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