mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-23 18:42:26 +00:00
templates/swagger/v1_json.tmpl updated with `make generate-swagger` (cherry picked from commit88899c492e) (cherry picked from commit7171bd9617) (cherry picked from commit1a742446c1) (cherry picked from commitd7c189d7b2) Conflicts: routers/web/web.go (cherry picked from commitcbdea868e4) (cherry picked from commit6cd150483b) (cherry picked from commit47246da8d3) (cherry picked from commitf2aa0e6b76) (cherry picked from commit5a4fc69a16) (cherry picked from commit48e444ca09) (cherry picked from commit888e537811) (cherry picked from commit5121f493c9) (cherry picked from commit9394e55fdf) (cherry picked from commit3a2ce51768) (cherry picked from commit719ead3a65) (cherry picked from commit83e6f82e2a) (cherry picked from commit494a429b21) (cherry picked from commit4d775db6b4) (cherry picked from commitb68f777dc2) (cherry picked from commit5b934023fa) (cherry picked from commit3b1ed8b16c) (cherry picked from commit6bc4a46c9f) (cherry picked from commit8064bb24a3) Conflicts: templates/admin/hook_new.tmpl templates/org/settings/hook_new.tmpl templates/repo/settings/webhook/base_list.tmpl templates/repo/settings/webhook/new.tmpl templates/user/settings/hook_new.tmpl https://codeberg.org/forgejo/forgejo/pulls/1181 (cherry picked from commit55f5588a91) (cherry picked from commita428bc06b3) (cherry picked from commitd2186eceb9) (cherry picked from commitb4e126e9af) (cherry picked from commite4c7a92c2d) (cherry picked from commita7165c8146) Conflicts: templates/admin/hook_new.tmpl templates/repo/settings/webhook/new.tmpl https://codeberg.org/forgejo/forgejo/pulls/1420 [BRANDING] add the forgejo webhook type & update webhook docs URLs (squash) gitea logo for gitea webhooks Refs: https://codeberg.org/forgejo/forgejo/issues/1367 (cherry picked from commit2d8c1b9373) (cherry picked from commit9135a5e1db) (cherry picked from commit270f4020b0) (cherry picked from commit33e5e2f0d8) (cherry picked from commit7af8bcf479) Conflicts: tests/integration/links_test.go https://codeberg.org/forgejo/forgejo/pulls/1548 (cherry picked from commitce2a434dcf) (cherry picked from commitc2fa42b4fd) (cherry picked from commitb04e3ab5bd) (cherry picked from commitde7d892884) (cherry picked from commit0bc1651c36) (cherry picked from commit8570815742) (cherry picked from commit0666253dbb)
496 lines
16 KiB
Go
496 lines
16 KiB
Go
// Copyright 2014 The Gogs Authors. All rights reserved.
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package structs
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"time"
|
|
|
|
"code.gitea.io/gitea/modules/json"
|
|
)
|
|
|
|
// ErrInvalidReceiveHook FIXME
|
|
var ErrInvalidReceiveHook = errors.New("Invalid JSON payload received over webhook")
|
|
|
|
// Hook a hook is a web hook when one repository changed
|
|
type Hook struct {
|
|
ID int64 `json:"id"`
|
|
Type string `json:"type"`
|
|
BranchFilter string `json:"branch_filter"`
|
|
URL string `json:"-"`
|
|
Config map[string]string `json:"config"`
|
|
Events []string `json:"events"`
|
|
AuthorizationHeader string `json:"authorization_header"`
|
|
Active bool `json:"active"`
|
|
// swagger:strfmt date-time
|
|
Updated time.Time `json:"updated_at"`
|
|
// swagger:strfmt date-time
|
|
Created time.Time `json:"created_at"`
|
|
}
|
|
|
|
// HookList represents a list of API hook.
|
|
type HookList []*Hook
|
|
|
|
// CreateHookOptionConfig has all config options in it
|
|
// required are "content_type" and "url" Required
|
|
type CreateHookOptionConfig map[string]string
|
|
|
|
// CreateHookOption options when create a hook
|
|
type CreateHookOption struct {
|
|
// required: true
|
|
// enum: forgejo,dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
|
|
Type string `json:"type" binding:"Required"`
|
|
// required: true
|
|
Config CreateHookOptionConfig `json:"config" binding:"Required"`
|
|
Events []string `json:"events"`
|
|
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
|
|
AuthorizationHeader string `json:"authorization_header"`
|
|
// default: false
|
|
Active bool `json:"active"`
|
|
}
|
|
|
|
// EditHookOption options when modify one hook
|
|
type EditHookOption struct {
|
|
Config map[string]string `json:"config"`
|
|
Events []string `json:"events"`
|
|
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
|
|
AuthorizationHeader string `json:"authorization_header"`
|
|
Active *bool `json:"active"`
|
|
}
|
|
|
|
// Payloader payload is some part of one hook
|
|
type Payloader interface {
|
|
JSONPayload() ([]byte, error)
|
|
}
|
|
|
|
// PayloadUser represents the author or committer of a commit
|
|
type PayloadUser struct {
|
|
// Full name of the commit author
|
|
Name string `json:"name"`
|
|
// swagger:strfmt email
|
|
Email string `json:"email"`
|
|
UserName string `json:"username"`
|
|
}
|
|
|
|
// FIXME: consider using same format as API when commits API are added.
|
|
// applies to PayloadCommit and PayloadCommitVerification
|
|
|
|
// PayloadCommit represents a commit
|
|
type PayloadCommit struct {
|
|
// sha1 hash of the commit
|
|
ID string `json:"id"`
|
|
Message string `json:"message"`
|
|
URL string `json:"url"`
|
|
Author *PayloadUser `json:"author"`
|
|
Committer *PayloadUser `json:"committer"`
|
|
Verification *PayloadCommitVerification `json:"verification"`
|
|
// swagger:strfmt date-time
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Added []string `json:"added"`
|
|
Removed []string `json:"removed"`
|
|
Modified []string `json:"modified"`
|
|
}
|
|
|
|
// PayloadCommitVerification represents the GPG verification of a commit
|
|
type PayloadCommitVerification struct {
|
|
Verified bool `json:"verified"`
|
|
Reason string `json:"reason"`
|
|
Signature string `json:"signature"`
|
|
Signer *PayloadUser `json:"signer"`
|
|
Payload string `json:"payload"`
|
|
}
|
|
|
|
var (
|
|
_ Payloader = &CreatePayload{}
|
|
_ Payloader = &DeletePayload{}
|
|
_ Payloader = &ForkPayload{}
|
|
_ Payloader = &PushPayload{}
|
|
_ Payloader = &IssuePayload{}
|
|
_ Payloader = &IssueCommentPayload{}
|
|
_ Payloader = &PullRequestPayload{}
|
|
_ Payloader = &RepositoryPayload{}
|
|
_ Payloader = &ReleasePayload{}
|
|
_ Payloader = &PackagePayload{}
|
|
)
|
|
|
|
// _________ __
|
|
// \_ ___ \_______ ____ _____ _/ |_ ____
|
|
// / \ \/\_ __ \_/ __ \\__ \\ __\/ __ \
|
|
// \ \____| | \/\ ___/ / __ \| | \ ___/
|
|
// \______ /|__| \___ >____ /__| \___ >
|
|
// \/ \/ \/ \/
|
|
|
|
// CreatePayload FIXME
|
|
type CreatePayload struct {
|
|
Sha string `json:"sha"`
|
|
Ref string `json:"ref"`
|
|
RefType string `json:"ref_type"`
|
|
Repo *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload return payload information
|
|
func (p *CreatePayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// ParseCreateHook parses create event hook content.
|
|
func ParseCreateHook(raw []byte) (*CreatePayload, error) {
|
|
hook := new(CreatePayload)
|
|
if err := json.Unmarshal(raw, hook); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// it is possible the JSON was parsed, however,
|
|
// was not from Gogs (maybe was from Bitbucket)
|
|
// So we'll check to be sure certain key fields
|
|
// were populated
|
|
switch {
|
|
case hook.Repo == nil:
|
|
return nil, ErrInvalidReceiveHook
|
|
case len(hook.Ref) == 0:
|
|
return nil, ErrInvalidReceiveHook
|
|
}
|
|
return hook, nil
|
|
}
|
|
|
|
// ________ .__ __
|
|
// \______ \ ____ | | _____/ |_ ____
|
|
// | | \_/ __ \| | _/ __ \ __\/ __ \
|
|
// | ` \ ___/| |_\ ___/| | \ ___/
|
|
// /_______ /\___ >____/\___ >__| \___ >
|
|
// \/ \/ \/ \/
|
|
|
|
// PusherType define the type to push
|
|
type PusherType string
|
|
|
|
// describe all the PusherTypes
|
|
const (
|
|
PusherTypeUser PusherType = "user"
|
|
)
|
|
|
|
// DeletePayload represents delete payload
|
|
type DeletePayload struct {
|
|
Ref string `json:"ref"`
|
|
RefType string `json:"ref_type"`
|
|
PusherType PusherType `json:"pusher_type"`
|
|
Repo *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload implements Payload
|
|
func (p *DeletePayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// ___________ __
|
|
// \_ _____/__________| | __
|
|
// | __)/ _ \_ __ \ |/ /
|
|
// | \( <_> ) | \/ <
|
|
// \___ / \____/|__| |__|_ \
|
|
// \/ \/
|
|
|
|
// ForkPayload represents fork payload
|
|
type ForkPayload struct {
|
|
Forkee *Repository `json:"forkee"`
|
|
Repo *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload implements Payload
|
|
func (p *ForkPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// HookIssueCommentAction defines hook issue comment action
|
|
type HookIssueCommentAction string
|
|
|
|
// all issue comment actions
|
|
const (
|
|
HookIssueCommentCreated HookIssueCommentAction = "created"
|
|
HookIssueCommentEdited HookIssueCommentAction = "edited"
|
|
HookIssueCommentDeleted HookIssueCommentAction = "deleted"
|
|
)
|
|
|
|
// IssueCommentPayload represents a payload information of issue comment event.
|
|
type IssueCommentPayload struct {
|
|
Action HookIssueCommentAction `json:"action"`
|
|
Issue *Issue `json:"issue"`
|
|
Comment *Comment `json:"comment"`
|
|
Changes *ChangesPayload `json:"changes,omitempty"`
|
|
Repository *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
IsPull bool `json:"is_pull"`
|
|
}
|
|
|
|
// JSONPayload implements Payload
|
|
func (p *IssueCommentPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// __________ .__
|
|
// \______ \ ____ | | ____ _____ ______ ____
|
|
// | _// __ \| | _/ __ \\__ \ / ___// __ \
|
|
// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/
|
|
// |____|_ /\___ >____/\___ >____ /____ >\___ >
|
|
// \/ \/ \/ \/ \/ \/
|
|
|
|
// HookReleaseAction defines hook release action type
|
|
type HookReleaseAction string
|
|
|
|
// all release actions
|
|
const (
|
|
HookReleasePublished HookReleaseAction = "published"
|
|
HookReleaseUpdated HookReleaseAction = "updated"
|
|
HookReleaseDeleted HookReleaseAction = "deleted"
|
|
)
|
|
|
|
// ReleasePayload represents a payload information of release event.
|
|
type ReleasePayload struct {
|
|
Action HookReleaseAction `json:"action"`
|
|
Release *Release `json:"release"`
|
|
Repository *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload implements Payload
|
|
func (p *ReleasePayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// __________ .__
|
|
// \______ \__ __ _____| |__
|
|
// | ___/ | \/ ___/ | \
|
|
// | | | | /\___ \| Y \
|
|
// |____| |____//____ >___| /
|
|
// \/ \/
|
|
|
|
// PushPayload represents a payload information of push event.
|
|
type PushPayload struct {
|
|
Ref string `json:"ref"`
|
|
Before string `json:"before"`
|
|
After string `json:"after"`
|
|
CompareURL string `json:"compare_url"`
|
|
Commits []*PayloadCommit `json:"commits"`
|
|
TotalCommits int `json:"total_commits"`
|
|
HeadCommit *PayloadCommit `json:"head_commit"`
|
|
Repo *Repository `json:"repository"`
|
|
Pusher *User `json:"pusher"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload FIXME
|
|
func (p *PushPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// ParsePushHook parses push event hook content.
|
|
func ParsePushHook(raw []byte) (*PushPayload, error) {
|
|
hook := new(PushPayload)
|
|
if err := json.Unmarshal(raw, hook); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch {
|
|
case hook.Repo == nil:
|
|
return nil, ErrInvalidReceiveHook
|
|
case len(hook.Ref) == 0:
|
|
return nil, ErrInvalidReceiveHook
|
|
}
|
|
return hook, nil
|
|
}
|
|
|
|
// Branch returns branch name from a payload
|
|
func (p *PushPayload) Branch() string {
|
|
return strings.ReplaceAll(p.Ref, "refs/heads/", "")
|
|
}
|
|
|
|
// .___
|
|
// | | ______ ________ __ ____
|
|
// | |/ ___// ___/ | \_/ __ \
|
|
// | |\___ \ \___ \| | /\ ___/
|
|
// |___/____ >____ >____/ \___ >
|
|
// \/ \/ \/
|
|
|
|
// HookIssueAction FIXME
|
|
type HookIssueAction string
|
|
|
|
const (
|
|
// HookIssueOpened opened
|
|
HookIssueOpened HookIssueAction = "opened"
|
|
// HookIssueClosed closed
|
|
HookIssueClosed HookIssueAction = "closed"
|
|
// HookIssueReOpened reopened
|
|
HookIssueReOpened HookIssueAction = "reopened"
|
|
// HookIssueEdited edited
|
|
HookIssueEdited HookIssueAction = "edited"
|
|
// HookIssueAssigned assigned
|
|
HookIssueAssigned HookIssueAction = "assigned"
|
|
// HookIssueUnassigned unassigned
|
|
HookIssueUnassigned HookIssueAction = "unassigned"
|
|
// HookIssueLabelUpdated label_updated
|
|
HookIssueLabelUpdated HookIssueAction = "label_updated"
|
|
// HookIssueLabelCleared label_cleared
|
|
HookIssueLabelCleared HookIssueAction = "label_cleared"
|
|
// HookIssueSynchronized synchronized
|
|
HookIssueSynchronized HookIssueAction = "synchronized"
|
|
// HookIssueMilestoned is an issue action for when a milestone is set on an issue.
|
|
HookIssueMilestoned HookIssueAction = "milestoned"
|
|
// HookIssueDemilestoned is an issue action for when a milestone is cleared on an issue.
|
|
HookIssueDemilestoned HookIssueAction = "demilestoned"
|
|
// HookIssueReviewed is an issue action for when a pull request is reviewed
|
|
HookIssueReviewed HookIssueAction = "reviewed"
|
|
// HookIssueReviewRequested is an issue action for when a reviewer is requested for a pull request.
|
|
HookIssueReviewRequested HookIssueAction = "review_requested"
|
|
// HookIssueReviewRequestRemoved is an issue action for removing a review request to someone on a pull request.
|
|
HookIssueReviewRequestRemoved HookIssueAction = "review_request_removed"
|
|
)
|
|
|
|
// IssuePayload represents the payload information that is sent along with an issue event.
|
|
type IssuePayload struct {
|
|
Action HookIssueAction `json:"action"`
|
|
Index int64 `json:"number"`
|
|
Changes *ChangesPayload `json:"changes,omitempty"`
|
|
Issue *Issue `json:"issue"`
|
|
Repository *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
CommitID string `json:"commit_id"`
|
|
}
|
|
|
|
// JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces.
|
|
func (p *IssuePayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// ChangesFromPayload FIXME
|
|
type ChangesFromPayload struct {
|
|
From string `json:"from"`
|
|
}
|
|
|
|
// ChangesPayload represents the payload information of issue change
|
|
type ChangesPayload struct {
|
|
Title *ChangesFromPayload `json:"title,omitempty"`
|
|
Body *ChangesFromPayload `json:"body,omitempty"`
|
|
Ref *ChangesFromPayload `json:"ref,omitempty"`
|
|
}
|
|
|
|
// __________ .__ .__ __________ __
|
|
// \______ \__ __| | | | \______ \ ____ ________ __ ____ _______/ |_
|
|
// | ___/ | \ | | | | _// __ \/ ____/ | \_/ __ \ / ___/\ __\
|
|
// | | | | / |_| |__ | | \ ___< <_| | | /\ ___/ \___ \ | |
|
|
// |____| |____/|____/____/ |____|_ /\___ >__ |____/ \___ >____ > |__|
|
|
// \/ \/ |__| \/ \/
|
|
|
|
// PullRequestPayload represents a payload information of pull request event.
|
|
type PullRequestPayload struct {
|
|
Action HookIssueAction `json:"action"`
|
|
Index int64 `json:"number"`
|
|
Changes *ChangesPayload `json:"changes,omitempty"`
|
|
PullRequest *PullRequest `json:"pull_request"`
|
|
RequestedReviewer *User `json:"requested_reviewer"`
|
|
Repository *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
CommitID string `json:"commit_id"`
|
|
Review *ReviewPayload `json:"review"`
|
|
}
|
|
|
|
// JSONPayload FIXME
|
|
func (p *PullRequestPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// ReviewPayload FIXME
|
|
type ReviewPayload struct {
|
|
Type string `json:"type"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
// __ __.__ __ .__
|
|
// / \ / \__| | _|__|
|
|
// \ \/\/ / | |/ / |
|
|
// \ /| | <| |
|
|
// \__/\ / |__|__|_ \__|
|
|
// \/ \/
|
|
|
|
// HookWikiAction an action that happens to a wiki page
|
|
type HookWikiAction string
|
|
|
|
const (
|
|
// HookWikiCreated created
|
|
HookWikiCreated HookWikiAction = "created"
|
|
// HookWikiEdited edited
|
|
HookWikiEdited HookWikiAction = "edited"
|
|
// HookWikiDeleted deleted
|
|
HookWikiDeleted HookWikiAction = "deleted"
|
|
)
|
|
|
|
// WikiPayload payload for repository webhooks
|
|
type WikiPayload struct {
|
|
Action HookWikiAction `json:"action"`
|
|
Repository *Repository `json:"repository"`
|
|
Sender *User `json:"sender"`
|
|
Page string `json:"page"`
|
|
Comment string `json:"comment"`
|
|
}
|
|
|
|
// JSONPayload JSON representation of the payload
|
|
func (p *WikiPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
//__________ .__ __
|
|
//\______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__.
|
|
// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | |
|
|
// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ |
|
|
// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____|
|
|
// \/ \/|__| \/ \/
|
|
|
|
// HookRepoAction an action that happens to a repo
|
|
type HookRepoAction string
|
|
|
|
const (
|
|
// HookRepoCreated created
|
|
HookRepoCreated HookRepoAction = "created"
|
|
// HookRepoDeleted deleted
|
|
HookRepoDeleted HookRepoAction = "deleted"
|
|
)
|
|
|
|
// RepositoryPayload payload for repository webhooks
|
|
type RepositoryPayload struct {
|
|
Action HookRepoAction `json:"action"`
|
|
Repository *Repository `json:"repository"`
|
|
Organization *User `json:"organization"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload JSON representation of the payload
|
|
func (p *RepositoryPayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|
|
|
|
// HookPackageAction an action that happens to a package
|
|
type HookPackageAction string
|
|
|
|
const (
|
|
// HookPackageCreated created
|
|
HookPackageCreated HookPackageAction = "created"
|
|
// HookPackageDeleted deleted
|
|
HookPackageDeleted HookPackageAction = "deleted"
|
|
)
|
|
|
|
// PackagePayload represents a package payload
|
|
type PackagePayload struct {
|
|
Action HookPackageAction `json:"action"`
|
|
Repository *Repository `json:"repository"`
|
|
Package *Package `json:"package"`
|
|
Organization *User `json:"organization"`
|
|
Sender *User `json:"sender"`
|
|
}
|
|
|
|
// JSONPayload implements Payload
|
|
func (p *PackagePayload) JSONPayload() ([]byte, error) {
|
|
return json.MarshalIndent(p, "", " ")
|
|
}
|