Skip to content

Commit c2eb0db

Browse files
ferrandinandFerran Tomas
andauthored
Added groups and user repository permissions (ktrysmt#217)
Co-authored-by: Ferran Tomas <[email protected]>
1 parent 9c7a555 commit c2eb0db

File tree

3 files changed

+565
-0
lines changed

3 files changed

+565
-0
lines changed

bitbucket.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,20 @@ type RepositoryEnvironmentsOptions struct {
476476
RepoSlug string `json:"repo_slug"`
477477
}
478478

479+
type RepositoryGroupPermissionsOptions struct {
480+
Owner string `json:"owner"`
481+
RepoSlug string `json:"repo_slug"`
482+
Group string `json:"group"`
483+
Permission string `json:"permission"`
484+
}
485+
486+
type RepositoryUserPermissionsOptions struct {
487+
Owner string `json:"owner"`
488+
RepoSlug string `json:"repo_slug"`
489+
User string `json:"user"`
490+
Permission string `json:"permission"`
491+
}
492+
479493
type RepositoryEnvironmentTypeOption int
480494

481495
const (

repository.go

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,51 @@ type DefaultReviewers struct {
205205
DefaultReviewers []DefaultReviewer
206206
}
207207

208+
type Group struct {
209+
AccountPrivilege string `mapstructure:"account_privilege"`
210+
DefaultPermission string `mapstructure:"default_permission"`
211+
EmailForwardingDisabled bool `mapstructure:"email_forwarding_disabled"`
212+
FullSlug string `mapstructure:"full_slug"`
213+
Links map[string]map[string]string
214+
Name string `mapstructure:"name"`
215+
Slug string `mapstructure:"slug"`
216+
Type string `mapstructure:"type"`
217+
Workspace map[string]interface{} `mapstructure:"workspace"`
218+
Owner map[string]interface{}
219+
}
220+
221+
type GroupPermission struct {
222+
Type string
223+
Group Group
224+
Permission string
225+
Links map[string]map[string]string
226+
}
227+
228+
type GroupPermissions struct {
229+
Page int
230+
Pagelen int
231+
MaxDepth int
232+
Size int
233+
Next string
234+
GroupPermissions []GroupPermission
235+
}
236+
237+
type UserPermission struct {
238+
Type string
239+
User User
240+
Permission string
241+
Links map[string]map[string]string
242+
}
243+
244+
type UserPermissions struct {
245+
Page int
246+
Pagelen int
247+
MaxDepth int
248+
Size int
249+
Next string
250+
UserPermissions []UserPermission
251+
}
252+
208253
func (r *Repository) Create(ro *RepositoryOptions) (*Repository, error) {
209254
data, err := r.buildRepositoryBody(ro)
210255
if err != nil {
@@ -834,6 +879,88 @@ func (r *Repository) UpdateDeploymentVariable(opt *RepositoryDeploymentVariableO
834879
return decodeDeploymentVariable(response)
835880
}
836881

882+
func (r *Repository) ListGroupPermissions(ro *RepositoryOptions) (*GroupPermissions, error) {
883+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/groups?pagelen=1", ro.Owner, ro.RepoSlug)
884+
885+
res, err := r.c.executePaginated("GET", urlStr, "")
886+
if err != nil {
887+
return nil, err
888+
}
889+
return decodeGroupsPermissions(res)
890+
}
891+
892+
func (r *Repository) SetGroupPermissions(rgo *RepositoryGroupPermissionsOptions) (*GroupPermission, error) {
893+
body, err := r.buildRepositoryGroupPermissionBody(rgo)
894+
if err != nil {
895+
return nil, err
896+
}
897+
898+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/groups/%s", rgo.Owner, rgo.RepoSlug, rgo.Group)
899+
900+
res, err := r.c.execute("PUT", urlStr, body)
901+
if err != nil {
902+
return nil, err
903+
}
904+
905+
return decodeGroupPermissions(res)
906+
}
907+
908+
func (r *Repository) DeleteGroupPermissions(rgo *RepositoryGroupPermissionsOptions) (interface{}, error) {
909+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/groups/%s", rgo.Owner, rgo.RepoSlug, rgo.Group)
910+
return r.c.execute("DELETE", urlStr, "")
911+
}
912+
913+
func (r *Repository) GetGroupPermissions(rgo *RepositoryGroupPermissionsOptions) (*GroupPermission, error) {
914+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/groups/%s", rgo.Owner, rgo.RepoSlug, rgo.Group)
915+
916+
res, err := r.c.executePaginated("GET", urlStr, "")
917+
if err != nil {
918+
return nil, err
919+
}
920+
return decodeGroupPermissions(res)
921+
}
922+
923+
func (r *Repository) ListUserPermissions(ro *RepositoryOptions) (*UserPermissions, error) {
924+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/users?pagelen=1", ro.Owner, ro.RepoSlug)
925+
926+
res, err := r.c.executePaginated("GET", urlStr, "")
927+
if err != nil {
928+
return nil, err
929+
}
930+
return decodeUsersPermissions(res)
931+
}
932+
933+
func (r *Repository) SetUserPermissions(rgo *RepositoryUserPermissionsOptions) (*UserPermission, error) {
934+
body, err := r.buildRepositoryUserPermissionBody(rgo)
935+
if err != nil {
936+
return nil, err
937+
}
938+
939+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/users/%s", rgo.Owner, rgo.RepoSlug, rgo.User)
940+
941+
res, err := r.c.execute("PUT", urlStr, body)
942+
if err != nil {
943+
return nil, err
944+
}
945+
946+
return decodeUserPermissions(res)
947+
}
948+
949+
func (r *Repository) DeleteUserPermissions(rgo *RepositoryUserPermissionsOptions) (interface{}, error) {
950+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/users/%s", rgo.Owner, rgo.RepoSlug, rgo.User)
951+
return r.c.execute("DELETE", urlStr, "")
952+
}
953+
954+
func (r *Repository) GetUserPermissions(rgo *RepositoryUserPermissionsOptions) (*UserPermission, error) {
955+
urlStr := r.c.requestUrl("/repositories/%s/%s/permissions-config/users/%s", rgo.Owner, rgo.RepoSlug, rgo.User)
956+
957+
res, err := r.c.executePaginated("GET", urlStr, "")
958+
if err != nil {
959+
return nil, err
960+
}
961+
return decodeUserPermissions(res)
962+
}
963+
837964
func (r *Repository) buildRepositoryBody(ro *RepositoryOptions) (string, error) {
838965
body := map[string]interface{}{}
839966

@@ -1019,6 +1146,22 @@ func (r *Repository) buildDeploymentVariableBody(opt *RepositoryDeploymentVariab
10191146
return r.buildJsonBody(body)
10201147
}
10211148

1149+
func (r *Repository) buildRepositoryGroupPermissionBody(rpo *RepositoryGroupPermissionsOptions) (string, error) {
1150+
body := map[string]interface{}{}
1151+
1152+
body["permission"] = rpo.Permission
1153+
1154+
return r.buildJsonBody(body)
1155+
}
1156+
1157+
func (r *Repository) buildRepositoryUserPermissionBody(rpo *RepositoryUserPermissionsOptions) (string, error) {
1158+
body := map[string]interface{}{}
1159+
1160+
body["permission"] = rpo.Permission
1161+
1162+
return r.buildJsonBody(body)
1163+
}
1164+
10221165
func (r *Repository) buildJsonBody(body map[string]interface{}) (string, error) {
10231166
data, err := json.Marshal(body)
10241167
if err != nil {
@@ -1591,3 +1734,115 @@ func decodeDefaultReviewers(response interface{}) (*DefaultReviewers, error) {
15911734
}
15921735
return &defaultReviewerVariables, nil
15931736
}
1737+
1738+
func decodeGroupPermissions(response interface{}) (*GroupPermission, error) {
1739+
var groupPermission GroupPermission
1740+
err := mapstructure.Decode(response, &groupPermission)
1741+
if err != nil {
1742+
return nil, err
1743+
}
1744+
return &groupPermission, nil
1745+
}
1746+
1747+
func decodeGroupsPermissions(response interface{}) (*GroupPermissions, error) {
1748+
responseMap := response.(map[string]interface{})
1749+
values := responseMap["values"].([]interface{})
1750+
1751+
var variables []GroupPermission
1752+
for _, variable := range values {
1753+
var groupPermission GroupPermission
1754+
err := mapstructure.Decode(variable, &groupPermission)
1755+
if err == nil {
1756+
variables = append(variables, groupPermission)
1757+
}
1758+
}
1759+
1760+
page, ok := responseMap["page"].(float64)
1761+
if !ok {
1762+
page = 0
1763+
}
1764+
1765+
pagelen, ok := responseMap["pagelen"].(float64)
1766+
if !ok {
1767+
pagelen = 0
1768+
}
1769+
max_depth, ok := responseMap["max_depth"].(float64)
1770+
if !ok {
1771+
max_depth = 0
1772+
}
1773+
size, ok := responseMap["size"].(float64)
1774+
if !ok {
1775+
size = 0
1776+
}
1777+
1778+
next, ok := responseMap["next"].(string)
1779+
if !ok {
1780+
next = ""
1781+
}
1782+
1783+
groupPermissions := GroupPermissions{
1784+
Page: int(page),
1785+
Pagelen: int(pagelen),
1786+
MaxDepth: int(max_depth),
1787+
Size: int(size),
1788+
Next: next,
1789+
GroupPermissions: variables,
1790+
}
1791+
return &groupPermissions, nil
1792+
}
1793+
1794+
func decodeUserPermissions(response interface{}) (*UserPermission, error) {
1795+
var userPermission UserPermission
1796+
err := mapstructure.Decode(response, &userPermission)
1797+
if err != nil {
1798+
return nil, err
1799+
}
1800+
return &userPermission, nil
1801+
}
1802+
1803+
func decodeUsersPermissions(response interface{}) (*UserPermissions, error) {
1804+
responseMap := response.(map[string]interface{})
1805+
values := responseMap["values"].([]interface{})
1806+
1807+
var variables []UserPermission
1808+
for _, variable := range values {
1809+
var userPermission UserPermission
1810+
err := mapstructure.Decode(variable, &userPermission)
1811+
if err == nil {
1812+
variables = append(variables, userPermission)
1813+
}
1814+
}
1815+
1816+
page, ok := responseMap["page"].(float64)
1817+
if !ok {
1818+
page = 0
1819+
}
1820+
1821+
pagelen, ok := responseMap["pagelen"].(float64)
1822+
if !ok {
1823+
pagelen = 0
1824+
}
1825+
max_depth, ok := responseMap["max_depth"].(float64)
1826+
if !ok {
1827+
max_depth = 0
1828+
}
1829+
size, ok := responseMap["size"].(float64)
1830+
if !ok {
1831+
size = 0
1832+
}
1833+
1834+
next, ok := responseMap["next"].(string)
1835+
if !ok {
1836+
next = ""
1837+
}
1838+
1839+
userPermissions := UserPermissions{
1840+
Page: int(page),
1841+
Pagelen: int(pagelen),
1842+
MaxDepth: int(max_depth),
1843+
Size: int(size),
1844+
Next: next,
1845+
UserPermissions: variables,
1846+
}
1847+
return &userPermissions, nil
1848+
}

0 commit comments

Comments
 (0)