diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2017-11-21 12:26:43 +0800 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2017-11-21 06:26:43 +0200 |
commit | 10b54df2b2efa539fbaa0bf624e81cb5da99f97a (patch) | |
tree | 24d30bb8fdb9f4396b0bc5212b3a95b6fa09cb93 /models/webhook_dingtalk.go | |
parent | 420fc8efc24d7a77598307557e5b38077d0efafc (diff) | |
download | gitea-10b54df2b2efa539fbaa0bf624e81cb5da99f97a.tar.gz gitea-10b54df2b2efa539fbaa0bf624e81cb5da99f97a.zip |
Add dingtalk webhook (#2777)
* add dingtalk webhook type
* add vendor
* some fixes
* fix name check
* fix name check & improvment
Diffstat (limited to 'models/webhook_dingtalk.go')
-rw-r--r-- | models/webhook_dingtalk.go | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/models/webhook_dingtalk.go b/models/webhook_dingtalk.go new file mode 100644 index 0000000000..e25e989084 --- /dev/null +++ b/models/webhook_dingtalk.go @@ -0,0 +1,197 @@ +// Copyright 2017 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 models + +import ( + "encoding/json" + "fmt" + "strings" + + "code.gitea.io/git" + api "code.gitea.io/sdk/gitea" + + dingtalk "github.com/lunny/dingtalk_webhook" +) + +type ( + // DingtalkPayload represents + DingtalkPayload dingtalk.Payload +) + +// SetSecret sets the dingtalk secret +func (p *DingtalkPayload) SetSecret(_ string) {} + +// JSONPayload Marshals the DingtalkPayload to json +func (p *DingtalkPayload) JSONPayload() ([]byte, error) { + data, err := json.MarshalIndent(p, "", " ") + if err != nil { + return []byte{}, err + } + return data, nil +} + +func getDingtalkCreatePayload(p *api.CreatePayload) (*DingtalkPayload, error) { + // created tag/branch + refName := git.RefEndName(p.Ref) + title := fmt.Sprintf("[%s] %s %s created", p.Repo.FullName, p.RefType, refName) + + return &DingtalkPayload{ + MsgType: "actionCard", + ActionCard: dingtalk.ActionCard{ + Text: title, + Title: title, + HideAvatar: "0", + SingleTitle: fmt.Sprintf("view branch %s", refName), + SingleURL: p.Repo.HTMLURL + "/src/" + refName, + }, + }, nil +} + +func getDingtalkPushPayload(p *api.PushPayload) (*DingtalkPayload, error) { + var ( + branchName = git.RefEndName(p.Ref) + commitDesc string + ) + + var titleLink, linkText string + if len(p.Commits) == 1 { + commitDesc = "1 new commit" + titleLink = p.Commits[0].URL + linkText = fmt.Sprintf("view commit %s", p.Commits[0].ID[:7]) + } else { + commitDesc = fmt.Sprintf("%d new commits", len(p.Commits)) + titleLink = p.CompareURL + linkText = fmt.Sprintf("view commit %s...%s", p.Commits[0].ID[:7], p.Commits[len(p.Commits)-1].ID[:7]) + } + if titleLink == "" { + titleLink = p.Repo.HTMLURL + "/src/" + branchName + } + + title := fmt.Sprintf("[%s:%s] %s", p.Repo.FullName, branchName, commitDesc) + + var text string + // for each commit, generate attachment text + for i, commit := range p.Commits { + var authorName string + if commit.Author != nil { + authorName = " - " + commit.Author.Name + } + text += fmt.Sprintf("[%s](%s) %s", commit.ID[:7], commit.URL, + strings.TrimRight(commit.Message, "\r\n")) + authorName + // add linebreak to each commit but the last + if i < len(p.Commits)-1 { + text += "\n" + } + } + + return &DingtalkPayload{ + MsgType: "actionCard", + ActionCard: dingtalk.ActionCard{ + Text: text, + Title: title, + HideAvatar: "0", + SingleTitle: linkText, + SingleURL: titleLink, + }, + }, nil +} + +func getDingtalkPullRequestPayload(p *api.PullRequestPayload) (*DingtalkPayload, error) { + var text, title string + switch p.Action { + case api.HookIssueOpened: + title = fmt.Sprintf("[%s] Pull request opened: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueClosed: + if p.PullRequest.HasMerged { + title = fmt.Sprintf("[%s] Pull request merged: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + } else { + title = fmt.Sprintf("[%s] Pull request closed: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + } + text = p.PullRequest.Body + case api.HookIssueReOpened: + title = fmt.Sprintf("[%s] Pull request re-opened: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueEdited: + title = fmt.Sprintf("[%s] Pull request edited: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueAssigned: + title = fmt.Sprintf("[%s] Pull request assigned to %s: #%d %s", p.Repository.FullName, + p.PullRequest.Assignee.UserName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueUnassigned: + title = fmt.Sprintf("[%s] Pull request unassigned: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueLabelUpdated: + title = fmt.Sprintf("[%s] Pull request labels updated: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueLabelCleared: + title = fmt.Sprintf("[%s] Pull request labels cleared: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + case api.HookIssueSynchronized: + title = fmt.Sprintf("[%s] Pull request synchronized: #%d %s", p.Repository.FullName, p.Index, p.PullRequest.Title) + text = p.PullRequest.Body + } + + return &DingtalkPayload{ + MsgType: "actionCard", + ActionCard: dingtalk.ActionCard{ + Text: text, + Title: title, + HideAvatar: "0", + SingleTitle: "view pull request", + SingleURL: p.PullRequest.HTMLURL, + }, + }, nil +} + +func getDingtalkRepositoryPayload(p *api.RepositoryPayload) (*DingtalkPayload, error) { + var title, url string + switch p.Action { + case api.HookRepoCreated: + title = fmt.Sprintf("[%s] Repository created", p.Repository.FullName) + url = p.Repository.HTMLURL + return &DingtalkPayload{ + MsgType: "actionCard", + ActionCard: dingtalk.ActionCard{ + Text: title, + Title: title, + HideAvatar: "0", + SingleTitle: "view repository", + SingleURL: url, + }, + }, nil + case api.HookRepoDeleted: + title = fmt.Sprintf("[%s] Repository deleted", p.Repository.FullName) + return &DingtalkPayload{ + MsgType: "text", + Text: struct { + Content string `json:"content"` + }{ + Content: title, + }, + }, nil + } + + return nil, nil +} + +// GetDingtalkPayload converts a ding talk webhook into a DingtalkPayload +func GetDingtalkPayload(p api.Payloader, event HookEventType, meta string) (*DingtalkPayload, error) { + s := new(DingtalkPayload) + + switch event { + case HookEventCreate: + return getDingtalkCreatePayload(p.(*api.CreatePayload)) + case HookEventPush: + return getDingtalkPushPayload(p.(*api.PushPayload)) + case HookEventPullRequest: + return getDingtalkPullRequestPayload(p.(*api.PullRequestPayload)) + case HookEventRepository: + return getDingtalkRepositoryPayload(p.(*api.RepositoryPayload)) + } + + return s, nil +} |