From a6205c63c90da3cad51a9c47f5212428e38e4b90 Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Thu, 10 Jun 2021 09:11:52 +0200 Subject: [PATCH 1/2] allow to overwrite content-type --- client.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/client.go b/client.go index ec1cc54..c253f2e 100644 --- a/client.go +++ b/client.go @@ -173,6 +173,10 @@ func (c *Client) SetApiBaseURL(urlStr url.URL) { } func (c *Client) executeRaw(method string, urlStr string, text string) (io.ReadCloser, error) { + return c.executeRawContentType(method, urlStr, text, "application/json") +} + +func (c *Client) executeRawContentType(method, urlStr, text, contentType string) (io.ReadCloser, error) { body := strings.NewReader(text) req, err := http.NewRequest(method, urlStr, body) @@ -180,7 +184,7 @@ func (c *Client) executeRaw(method string, urlStr string, text string) (io.ReadC return nil, err } if text != "" { - req.Header.Set("Content-Type", "application/json") + req.Header.Set("Content-Type", contentType) } c.authenticateRequest(req) @@ -188,6 +192,10 @@ func (c *Client) executeRaw(method string, urlStr string, text string) (io.ReadC } func (c *Client) execute(method string, urlStr string, text string) (interface{}, error) { + return c.executeContentType(method, urlStr, text, "application/json") +} + +func (c *Client) executeContentType(method string, urlStr string, text string, contentType string) (interface{}, error) { // Use pagination if changed from default value const DEC_RADIX = 10 if strings.Contains(urlStr, "/repositories/") { @@ -221,7 +229,7 @@ func (c *Client) execute(method string, urlStr string, text string) (interface{} return nil, err } if text != "" { - req.Header.Set("Content-Type", "application/json") + req.Header.Set("Content-Type", contentType) } c.authenticateRequest(req) From 86e5b93d44d19126b6dbecbb94e5f20926209fdb Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Thu, 10 Jun 2021 09:14:59 +0200 Subject: [PATCH 2/2] add groupprivileges --- client.go | 20 ++++---- commits.go | 4 +- groupprivileges.go | 112 +++++++++++++++++++++++++++++++++++++++++++++ teams.go | 5 +- 4 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 groupprivileges.go diff --git a/client.go b/client.go index c253f2e..45a5532 100644 --- a/client.go +++ b/client.go @@ -35,15 +35,16 @@ func apiBaseUrl() (*url.URL, error) { } type Client struct { - Auth *auth - Users users - User user - Teams teams - Repositories *Repositories - Workspaces *Workspace - Pagelen uint64 - MaxDepth uint64 - apiBaseURL *url.URL + Auth *auth + Users users + User user + Teams teams + Repositories *Repositories + Workspaces *Workspace + GroupPrivileges *GroupPrivileges + Pagelen uint64 + MaxDepth uint64 + apiBaseURL *url.URL HttpClient *http.Client } @@ -156,6 +157,7 @@ func injectClient(a *auth) *Client { c.User = &User{c: c} c.Teams = &Teams{c: c} c.Workspaces = &Workspace{c: c, Repositories: c.Repositories, Permissions: &Permission{c: c}} + c.GroupPrivileges = &GroupPrivileges{c: c} c.HttpClient = new(http.Client) return c } diff --git a/commits.go b/commits.go index 5cf585a..956a3b8 100644 --- a/commits.go +++ b/commits.go @@ -1,8 +1,8 @@ package bitbucket import ( - "net/url" "encoding/json" + "net/url" ) type Commits struct { @@ -50,7 +50,6 @@ func (cm *Commits) RemoveApprove(cmo *CommitsOptions) (interface{}, error) { return cm.c.execute("DELETE", urlStr, "") } - func (cm *Commits) CreateCommitStatus(cmo *CommitsOptions, cso *CommitStatusOptions) (interface{}, error) { urlStr := cm.c.requestUrl("/repositories/%s/%s/commit/%s/statuses/build", cmo.Owner, cmo.RepoSlug, cmo.Revision) data, err := json.Marshal(cso) @@ -60,7 +59,6 @@ func (cm *Commits) CreateCommitStatus(cmo *CommitsOptions, cso *CommitStatusOpti return cm.c.execute("POST", urlStr, string(data)) } - func (cm *Commits) buildCommitsQuery(include, exclude string) string { p := url.Values{} diff --git a/groupprivileges.go b/groupprivileges.go new file mode 100644 index 0000000..089eff4 --- /dev/null +++ b/groupprivileges.go @@ -0,0 +1,112 @@ +package bitbucket + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type GroupPrivileges struct { + c *Client +} + +type GroupPrivilegesOptions struct { + Owner string + RepoSlug string + Group string + GroupOwner string + Permission string +} + +type GroupPrivilege struct { + Repo string `mapstructure:"repo"` + Privilege string `mapstructure:"privilege"` + Group struct { + Owner struct { + DisplayName string `mapstructure:"display_name"` + UUID string `mapstructure:"uuid"` + IsActive bool `mapstructure:"is_active"` + IsTeam bool `mapstructure:"is_team"` + MentionID string `mapstructure:"mention_id"` + Avatar string `mapstructure:"avatar"` + Nickname string `mapstructure:"nickname"` + AccountID string `mapstructure:"account_id"` + } `mapstructure:"owner"` + Name string `mapstructure:"name"` + Members []interface{} `mapstructure:"members"` + Slug string `mapstructure:"slug"` + } `mapstructure:"group"` + Repository struct { + Owner struct { + DisplayName string `mapstructure:"display_name"` + UUID string `mapstructure:"uuid"` + IsActive bool `mapstructure:"is_active"` + IsTeam bool `mapstructure:"is_team"` + MentionID string `mapstructure:"mention_id"` + Avatar string `mapstructure:"avatar"` + Nickname string `mapstructure:"nickname"` + AccountID string `mapstructure:"account_id"` + } `mapstructure:"owner"` + Name string `mapstructure:"name"` + Slug string `mapstructure:"slug"` + } `mapstructure:"repository"` +} + +func (g *GroupPrivileges) List(workspace, repoSlug string) ([]GroupPrivilege, error) { + urlStr := fmt.Sprintf("%s/1.0/group-privileges/%s/%s", g.c.GetApiHostnameURL(), workspace, repoSlug) + data, err := g.c.execute("GET", urlStr, "") + if err != nil { + return nil, err + } + + return g.decodeGroupPrivileges(data) +} + +func (g *GroupPrivileges) Add(gpo GroupPrivilegesOptions) ([]GroupPrivilege, error) { + groupOwner := gpo.GroupOwner + if gpo.GroupOwner == "" { + groupOwner = gpo.Owner + + } + urlStr := fmt.Sprintf("%s/1.0/group-privileges/%s/%s/%s/%s/", g.c.GetApiHostnameURL(), gpo.Owner, gpo.RepoSlug, groupOwner, gpo.Group) + data, err := g.c.executeContentType("PUT", urlStr, gpo.Permission, "application/x-www-form-urlencoded") + if err != nil { + return nil, err + } + + return g.decodeGroupPrivileges(data) +} + +func (g *GroupPrivileges) Get(gpo GroupPrivilegesOptions) ([]GroupPrivilege, error) { + groupOwner := gpo.GroupOwner + if gpo.GroupOwner == "" { + groupOwner = gpo.Owner + + } + urlStr := fmt.Sprintf("%s/1.0/group-privileges/%s/%s/%s/%s/", g.c.GetApiHostnameURL(), gpo.Owner, gpo.RepoSlug, groupOwner, gpo.Group) + data, err := g.c.execute("GET", urlStr, "") + if err != nil { + return nil, err + } + + return g.decodeGroupPrivileges(data) +} + +func (g *GroupPrivileges) Delete(gpo GroupPrivilegesOptions) (interface{}, error) { + groupOwner := gpo.GroupOwner + if gpo.GroupOwner == "" { + groupOwner = gpo.Owner + + } + urlStr := fmt.Sprintf("%s/1.0/group-privileges/%s/%s/%s/%s/", g.c.GetApiHostnameURL(), gpo.Owner, gpo.RepoSlug, groupOwner, gpo.Group) + return g.c.execute("DELETE", urlStr, "") +} + +func (g *GroupPrivileges) decodeGroupPrivileges(response interface{}) ([]GroupPrivilege, error) { + var gp []GroupPrivilege + err := mapstructure.Decode(response, &gp) + if err != nil { + return nil, err + } + return gp, nil +} diff --git a/teams.go b/teams.go index 793fa56..45c96b9 100644 --- a/teams.go +++ b/teams.go @@ -35,7 +35,6 @@ func (t *Teams) Repositories(teamname string) (interface{}, error) { } func (t *Teams) Projects(teamname string) (interface{}, error) { - urlStr := t.c.requestUrl("/teams/%s/projects/", teamname) - return t.c.execute("GET", urlStr, "") + urlStr := t.c.requestUrl("/teams/%s/projects/", teamname) + return t.c.execute("GET", urlStr, "") } -