Add packagist webhook (#18224)
Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
87141b908d
commit
3349fd8f79
20 changed files with 416 additions and 3 deletions
|
@ -396,6 +396,20 @@ func (f *NewWechatWorkHookForm) Validate(req *http.Request, errs binding.Errors)
|
|||
return middleware.Validate(errs, ctx.Data, f, ctx.Locale)
|
||||
}
|
||||
|
||||
// NewPackagistHookForm form for creating packagist hook
|
||||
type NewPackagistHookForm struct {
|
||||
Username string `binding:"Required"`
|
||||
APIToken string `binding:"Required"`
|
||||
PackageURL string `binding:"Required;ValidUrl"`
|
||||
WebhookForm
|
||||
}
|
||||
|
||||
// Validate validates the fields
|
||||
func (f *NewPackagistHookForm) Validate(req *http.Request, errs binding.Errors) binding.Errors {
|
||||
ctx := context.GetContext(req)
|
||||
return middleware.Validate(errs, ctx.Data, f, ctx.Locale)
|
||||
}
|
||||
|
||||
// .___
|
||||
// | | ______ ________ __ ____
|
||||
// | |/ ___// ___/ | \_/ __ \
|
||||
|
|
112
services/webhook/packagist.go
Normal file
112
services/webhook/packagist.go
Normal file
|
@ -0,0 +1,112 @@
|
|||
// Copyright 2022 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 webhook
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
webhook_model "code.gitea.io/gitea/models/webhook"
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
)
|
||||
|
||||
type (
|
||||
// PackagistPayload represents
|
||||
PackagistPayload struct {
|
||||
PackagistRepository struct {
|
||||
URL string `json:"url"`
|
||||
} `json:"repository"`
|
||||
}
|
||||
|
||||
// PackagistMeta contains the meta data for the webhook
|
||||
PackagistMeta struct {
|
||||
Username string `json:"username"`
|
||||
APIToken string `json:"api_token"`
|
||||
PackageURL string `json:"package_url"`
|
||||
}
|
||||
)
|
||||
|
||||
// GetPackagistHook returns packagist metadata
|
||||
func GetPackagistHook(w *webhook_model.Webhook) *PackagistMeta {
|
||||
s := &PackagistMeta{}
|
||||
if err := json.Unmarshal([]byte(w.Meta), s); err != nil {
|
||||
log.Error("webhook.GetPackagistHook(%d): %v", w.ID, err)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// JSONPayload Marshals the PackagistPayload to json
|
||||
func (f *PackagistPayload) JSONPayload() ([]byte, error) {
|
||||
data, err := json.MarshalIndent(f, "", " ")
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
var _ PayloadConvertor = &PackagistPayload{}
|
||||
|
||||
// Create implements PayloadConvertor Create method
|
||||
func (f *PackagistPayload) Create(p *api.CreatePayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Delete implements PayloadConvertor Delete method
|
||||
func (f *PackagistPayload) Delete(p *api.DeletePayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Fork implements PayloadConvertor Fork method
|
||||
func (f *PackagistPayload) Fork(p *api.ForkPayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Push implements PayloadConvertor Push method
|
||||
func (f *PackagistPayload) Push(p *api.PushPayload) (api.Payloader, error) {
|
||||
return f, nil
|
||||
}
|
||||
|
||||
// Issue implements PayloadConvertor Issue method
|
||||
func (f *PackagistPayload) Issue(p *api.IssuePayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// IssueComment implements PayloadConvertor IssueComment method
|
||||
func (f *PackagistPayload) IssueComment(p *api.IssueCommentPayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// PullRequest implements PayloadConvertor PullRequest method
|
||||
func (f *PackagistPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Review implements PayloadConvertor Review method
|
||||
func (f *PackagistPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Repository implements PayloadConvertor Repository method
|
||||
func (f *PackagistPayload) Repository(p *api.RepositoryPayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Release implements PayloadConvertor Release method
|
||||
func (f *PackagistPayload) Release(p *api.ReleasePayload) (api.Payloader, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// GetPackagistPayload converts a packagist webhook into a PackagistPayload
|
||||
func GetPackagistPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) {
|
||||
s := new(PackagistPayload)
|
||||
|
||||
packagist := &PackagistMeta{}
|
||||
if err := json.Unmarshal([]byte(meta), &packagist); err != nil {
|
||||
return s, errors.New("GetPackagistPayload meta json:" + err.Error())
|
||||
}
|
||||
s.PackagistRepository.URL = packagist.PackageURL
|
||||
return convertPayloader(s, p, event)
|
||||
}
|
140
services/webhook/packagist_test.go
Normal file
140
services/webhook/packagist_test.go
Normal file
|
@ -0,0 +1,140 @@
|
|||
// Copyright 2022 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 webhook
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
webhook_model "code.gitea.io/gitea/models/webhook"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPackagistPayload(t *testing.T) {
|
||||
t.Run("Create", func(t *testing.T) {
|
||||
p := createTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Create(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Delete", func(t *testing.T) {
|
||||
p := deleteTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Delete(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Fork", func(t *testing.T) {
|
||||
p := forkTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Fork(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Push", func(t *testing.T) {
|
||||
p := pushTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
d.PackagistRepository.URL = "https://packagist.org/api/update-package?username=THEUSERNAME&apiToken=TOPSECRETAPITOKEN"
|
||||
pl, err := d.Push(p)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, pl)
|
||||
require.IsType(t, &PackagistPayload{}, pl)
|
||||
|
||||
assert.Equal(t, "https://packagist.org/api/update-package?username=THEUSERNAME&apiToken=TOPSECRETAPITOKEN", pl.(*PackagistPayload).PackagistRepository.URL)
|
||||
})
|
||||
|
||||
t.Run("Issue", func(t *testing.T) {
|
||||
p := issueTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
p.Action = api.HookIssueOpened
|
||||
pl, err := d.Issue(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
|
||||
p.Action = api.HookIssueClosed
|
||||
pl, err = d.Issue(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("IssueComment", func(t *testing.T) {
|
||||
p := issueCommentTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.IssueComment(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("PullRequest", func(t *testing.T) {
|
||||
p := pullRequestTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.PullRequest(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("PullRequestComment", func(t *testing.T) {
|
||||
p := pullRequestCommentTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.IssueComment(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Review", func(t *testing.T) {
|
||||
p := pullRequestTestPayload()
|
||||
p.Action = api.HookIssueReviewed
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Repository", func(t *testing.T) {
|
||||
p := repositoryTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Repository(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
|
||||
t.Run("Release", func(t *testing.T) {
|
||||
p := pullReleaseTestPayload()
|
||||
|
||||
d := new(PackagistPayload)
|
||||
pl, err := d.Release(p)
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, pl)
|
||||
})
|
||||
}
|
||||
|
||||
func TestPackagistJSONPayload(t *testing.T) {
|
||||
p := pushTestPayload()
|
||||
|
||||
pl, err := new(PackagistPayload).Push(p)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, pl)
|
||||
require.IsType(t, &PackagistPayload{}, pl)
|
||||
|
||||
json, err := pl.JSONPayload()
|
||||
require.NoError(t, err)
|
||||
assert.NotEmpty(t, json)
|
||||
}
|
|
@ -58,6 +58,10 @@ var webhooks = map[webhook_model.HookType]*webhook{
|
|||
name: webhook_model.WECHATWORK,
|
||||
payloadCreator: GetWechatworkPayload,
|
||||
},
|
||||
webhook_model.PACKAGIST: {
|
||||
name: webhook_model.PACKAGIST,
|
||||
payloadCreator: GetPackagistPayload,
|
||||
},
|
||||
}
|
||||
|
||||
// RegisterWebhook registers a webhook
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue