/vendor/github.com/gogits/go-gogs-client/repo_hooks.go
Go | 203 lines | 153 code | 27 blank | 23 comment | 18 complexity | 210fd120611b65daf37613f271f3df7c MD5 | raw file
- // Copyright 2014 The Gogs 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 gogs
- import (
- "bytes"
- "encoding/json"
- "errors"
- "fmt"
- "net/http"
- "strings"
- "time"
- )
- var (
- ErrInvalidReceiveHook = errors.New("Invalid JSON payload received over webhook")
- )
- type Hook struct {
- ID int64 `json:"id"`
- Type string `json:"type"`
- URL string `json:"-"`
- Config map[string]string `json:"config"`
- Events []string `json:"events"`
- Active bool `json:"active"`
- Updated time.Time `json:"updated_at"`
- Created time.Time `json:"created_at"`
- }
- func (c *Client) ListRepoHooks(user, repo string) ([]*Hook, error) {
- hooks := make([]*Hook, 0, 10)
- return hooks, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks", user, repo), nil, nil, &hooks)
- }
- type CreateHookOption struct {
- Type string `json:"type" binding:"Required"`
- Config map[string]string `json:"config" binding:"Required"`
- Events []string `json:"events"`
- Active bool `json:"active"`
- }
- func (c *Client) CreateRepoHook(user, repo string, opt CreateHookOption) (*Hook, error) {
- body, err := json.Marshal(&opt)
- if err != nil {
- return nil, err
- }
- h := new(Hook)
- return h, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/hooks", user, repo),
- http.Header{"content-type": []string{"application/json"}}, bytes.NewReader(body), h)
- }
- type EditHookOption struct {
- Config map[string]string `json:"config"`
- Events []string `json:"events"`
- Active *bool `json:"active"`
- }
- func (c *Client) EditRepoHook(user, repo string, id int64, opt EditHookOption) error {
- body, err := json.Marshal(&opt)
- if err != nil {
- return err
- }
- _, err = c.getResponse("PATCH", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id),
- http.Header{"content-type": []string{"application/json"}}, bytes.NewReader(body))
- return err
- }
- type Payloader interface {
- SetSecret(string)
- JSONPayload() ([]byte, error)
- }
- type PayloadAuthor struct {
- Name string `json:"name"`
- Email string `json:"email"`
- UserName string `json:"username"`
- }
- type PayloadUser struct {
- UserName string `json:"login"`
- ID int64 `json:"id"`
- AvatarUrl string `json:"avatar_url"`
- }
- type PayloadCommit struct {
- ID string `json:"id"`
- Message string `json:"message"`
- URL string `json:"url"`
- Author *PayloadAuthor `json:"author"`
- }
- type PayloadRepo struct {
- ID int64 `json:"id"`
- Name string `json:"name"`
- URL string `json:"url"`
- Description string `json:"description"`
- Website string `json:"website"`
- Watchers int `json:"watchers"`
- Owner *PayloadAuthor `json:"owner"`
- Private bool `json:"private"`
- }
- // _________ __
- // \_ ___ \_______ ____ _____ _/ |_ ____
- // / \ \/\_ __ \_/ __ \\__ \\ __\/ __ \
- // \ \____| | \/\ ___/ / __ \| | \ ___/
- // \______ /|__| \___ >____ /__| \___ >
- // \/ \/ \/ \/
- type CreatePayload struct {
- Secret string `json:"secret"`
- Ref string `json:"ref"`
- RefType string `json:"ref_type"`
- Repo *PayloadRepo `json:"repository"`
- Sender *PayloadUser `json:"sender"`
- }
- func (p *CreatePayload) SetSecret(secret string) {
- p.Secret = secret
- }
- func (p *CreatePayload) JSONPayload() ([]byte, error) {
- data, err := json.MarshalIndent(p, "", " ")
- if err != nil {
- return []byte{}, err
- }
- return data, nil
- }
- // 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
- }
- // __________ .__
- // \______ \__ __ _____| |__
- // | ___/ | \/ ___/ | \
- // | | | | /\___ \| Y \
- // |____| |____//____ >___| /
- // \/ \/
- // PushPayload represents a payload information of push event.
- type PushPayload struct {
- Secret string `json:"secret"`
- Ref string `json:"ref"`
- Before string `json:"before"`
- After string `json:"after"`
- CompareUrl string `json:"compare_url"`
- Commits []*PayloadCommit `json:"commits"`
- Repo *PayloadRepo `json:"repository"`
- Pusher *PayloadAuthor `json:"pusher"`
- Sender *PayloadUser `json:"sender"`
- }
- func (p *PushPayload) SetSecret(secret string) {
- p.Secret = secret
- }
- func (p *PushPayload) JSONPayload() ([]byte, error) {
- data, err := json.MarshalIndent(p, "", " ")
- if err != nil {
- return []byte{}, err
- }
- return data, nil
- }
- // 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.Replace(p.Ref, "refs/heads/", "", -1)
- }