Skip to content

Commit 887594b

Browse files
authored
Merge pull request #18 from bugout-dev/resource-holders
Support of resource holder permissions
2 parents 4bc8c7f + b3f8428 commit 887594b

5 files changed

Lines changed: 224 additions & 3 deletions

File tree

cmd/bugout/brood/resources.go

Lines changed: 122 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/bugout-dev/bugout-go/cmd/bugout/cmdutils"
1010
bugout "github.com/bugout-dev/bugout-go/pkg"
11+
"github.com/bugout-dev/bugout-go/pkg/brood"
1112
)
1213

1314
func GenerateResourcesCommand() *cobra.Command {
@@ -21,11 +22,28 @@ func GenerateResourcesCommand() *cobra.Command {
2122
resourcesDeleteCmd := GenerateResourceDeleteCommand()
2223
resourcesGetCmd := GenerateResourcesGetCommand()
2324

24-
resourcesCmd.AddCommand(resourcesCreateCmd, resourcesUpdateCmd, resourcesDeleteCmd, resourcesGetCmd)
25+
resourceHoldersCmd := GenerateResourceHoldersCommand()
26+
27+
resourcesCmd.AddCommand(resourcesCreateCmd, resourcesUpdateCmd, resourcesDeleteCmd, resourcesGetCmd, resourceHoldersCmd)
2528

2629
return resourcesCmd
2730
}
2831

32+
func GenerateResourceHoldersCommand() *cobra.Command {
33+
holdersCmd := &cobra.Command{
34+
Use: "holders",
35+
Short: "Bugout resource holders operations",
36+
}
37+
38+
resourceHoldersGetCmd := GenerateResourceHoldersGetCommand()
39+
resourceHoldersAddCmd := GenerateResourceHoldersAddCommand()
40+
resourceHoldersDeleteCmd := GenerateResourceHoldersDeleteCommand()
41+
42+
holdersCmd.AddCommand(resourceHoldersGetCmd, resourceHoldersAddCmd, resourceHoldersDeleteCmd)
43+
44+
return holdersCmd
45+
}
46+
2947
func GenerateResourceCreateCommand() *cobra.Command {
3048
var token, applicationId string
3149
resourceCreateCmd := &cobra.Command{
@@ -76,7 +94,7 @@ func GenerateResourceUpdateCommand() *cobra.Command {
7694
PreRunE: cmdutils.TokenArgPopulator,
7795
RunE: func(cmd *cobra.Command, args []string) error {
7896
if len(args) != 1 {
79-
return fmt.Errorf(`One resource argument as json string in format {"update": {"key": "value"}, drop_keys: ["key"]} must be specified`)
97+
return fmt.Errorf(`Resource argument as json string in format {"update": {"key": "value"}, "drop_keys": ["key"]} must be specified`)
8098
}
8199
var resourceUpdateRaw resourceUpdateArg
82100
err := json.Unmarshal([]byte(args[0]), &resourceUpdateRaw)
@@ -162,3 +180,105 @@ func GenerateResourcesGetCommand() *cobra.Command {
162180

163181
return resourcesGetCmd
164182
}
183+
184+
func GenerateResourceHoldersGetCommand() *cobra.Command {
185+
var token, resourceId string
186+
resourceHoldersGetCmd := &cobra.Command{
187+
Use: "get",
188+
Short: "Get resource holders",
189+
PreRunE: cmdutils.TokenArgPopulator,
190+
RunE: func(cmd *cobra.Command, args []string) error {
191+
client, clientErr := bugout.ClientFromEnv()
192+
if clientErr != nil {
193+
return clientErr
194+
}
195+
196+
resourceHolders, err := client.Brood.GetResourceHolders(token, resourceId)
197+
if err != nil {
198+
return err
199+
}
200+
201+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(&resourceHolders)
202+
return encodeErr
203+
},
204+
}
205+
206+
resourceHoldersGetCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
207+
resourceHoldersGetCmd.Flags().StringVarP(&resourceId, "resource_id", "r", "", "Resource ID")
208+
209+
return resourceHoldersGetCmd
210+
}
211+
212+
func GenerateResourceHoldersAddCommand() *cobra.Command {
213+
var token, resourceId string
214+
resourceHoldersAddCmd := &cobra.Command{
215+
Use: "add [holder]",
216+
Short: "Add resource holders",
217+
PreRunE: cmdutils.TokenArgPopulator,
218+
RunE: func(cmd *cobra.Command, args []string) error {
219+
if len(args) != 1 {
220+
return fmt.Errorf(`Resource holder argument as json string in format {"holder_id": "user_or_group_uuid", "holder_type": "user_or_group", "permissions": ["admin", "create", "read", "update", "delete"]} must be specified`)
221+
}
222+
var resourceHolderPermissionsRaw brood.ResourceHolder
223+
err := json.Unmarshal([]byte(args[0]), &resourceHolderPermissionsRaw)
224+
if err != nil {
225+
return err
226+
}
227+
228+
client, clientErr := bugout.ClientFromEnv()
229+
if clientErr != nil {
230+
return clientErr
231+
}
232+
233+
resource, err := client.Brood.AddResourceHolderPermissions(token, resourceId, resourceHolderPermissionsRaw)
234+
if err != nil {
235+
return err
236+
}
237+
238+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(&resource)
239+
return encodeErr
240+
},
241+
}
242+
243+
resourceHoldersAddCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
244+
resourceHoldersAddCmd.Flags().StringVarP(&resourceId, "resource_id", "r", "", "Resource ID")
245+
246+
return resourceHoldersAddCmd
247+
}
248+
249+
func GenerateResourceHoldersDeleteCommand() *cobra.Command {
250+
var token, resourceId string
251+
resourceHoldersDeleteCmd := &cobra.Command{
252+
Use: "delete [holder]",
253+
Short: "Delete resource holders",
254+
PreRunE: cmdutils.TokenArgPopulator,
255+
RunE: func(cmd *cobra.Command, args []string) error {
256+
if len(args) != 1 {
257+
return fmt.Errorf(`Resource holder argument as json string in format {"holder_id": "user_or_group_uuid", "holder_type": "user_or_group", "permissions": ["admin", "create", "read", "update", "delete"]} must be specified`)
258+
}
259+
var resourceHolderPermissionsRaw brood.ResourceHolder
260+
err := json.Unmarshal([]byte(args[0]), &resourceHolderPermissionsRaw)
261+
if err != nil {
262+
return err
263+
}
264+
265+
client, clientErr := bugout.ClientFromEnv()
266+
if clientErr != nil {
267+
return clientErr
268+
}
269+
270+
resource, err := client.Brood.DeleteResourceHolderPermissions(token, resourceId, resourceHolderPermissionsRaw)
271+
if err != nil {
272+
return err
273+
}
274+
275+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(&resource)
276+
return encodeErr
277+
},
278+
}
279+
280+
resourceHoldersDeleteCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
281+
resourceHoldersDeleteCmd.Flags().StringVarP(&resourceId, "resource_id", "r", "", "Resource ID")
282+
283+
return resourceHoldersDeleteCmd
284+
}

pkg/brood/client.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ type BroodCaller interface {
3636
UpdateResource(token, resourceId string, update interface{}, dropKeys []string) (Resource, error)
3737
GetResources(token, applicationId string, queryParameters map[string]string) (Resources, error)
3838
DeleteResource(token, resourceId string) (Resource, error)
39+
GetResourceHolders(token, resourceId string) (ResourceHolders, error)
40+
AddResourceHolderPermissions(token, resourceId string, resourceHolder ResourceHolder) (ResourceHolders, error)
41+
DeleteResourceHolderPermissions(token, resourceId string, resourceHolder ResourceHolder) (ResourceHolders, error)
3942
CreateApplication(token, groupId, name, description string) (Application, error)
4043
GetApplication(token, applicationId string) (Application, error)
4144
ListApplications(token, groupId string) (ApplicationsList, error)

pkg/brood/data.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,14 @@ type resourceUpdateRequest struct {
8181
Update interface{} `json:"update"`
8282
DropKeys []string `json:"drop_keys"`
8383
}
84+
85+
type ResourceHolder struct {
86+
Id string `json:"holder_id"`
87+
HolderType string `json:"holder_type"`
88+
Permissions []string `json:"permissions"`
89+
}
90+
91+
type ResourceHolders struct {
92+
ResourceId string `json:"resource_id"`
93+
Holders []ResourceHolder `json:"holders"`
94+
}

pkg/brood/resources.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,90 @@ func (client BroodClient) DeleteResource(token, resourceId string) (Resource, er
141141

142142
return resource, decodeErr
143143
}
144+
145+
func (client BroodClient) GetResourceHolders(token, resourceId string) (ResourceHolders, error) {
146+
resourcesRoute := fmt.Sprintf("%s/%s/holders", client.Routes.Resources, resourceId)
147+
request, requestErr := http.NewRequest("GET", resourcesRoute, nil)
148+
if requestErr != nil {
149+
return ResourceHolders{}, requestErr
150+
}
151+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
152+
request.Header.Add("Accept", "application/json")
153+
154+
response, responseErr := client.HTTPClient.Do(request)
155+
if responseErr != nil {
156+
return ResourceHolders{}, responseErr
157+
}
158+
defer response.Body.Close()
159+
160+
statusErr := utils.HTTPStatusCheck(response)
161+
if statusErr != nil {
162+
return ResourceHolders{}, statusErr
163+
}
164+
165+
var resourceHolders ResourceHolders
166+
decodeErr := json.NewDecoder(response.Body).Decode(&resourceHolders)
167+
return resourceHolders, decodeErr
168+
}
169+
170+
func (client BroodClient) AddResourceHolderPermissions(token, resourceId string, resourceHolder ResourceHolder) (ResourceHolders, error) {
171+
requestBody := ResourceHolder(resourceHolder)
172+
requestBuffer := new(bytes.Buffer)
173+
encodeErr := json.NewEncoder(requestBuffer).Encode(requestBody)
174+
if encodeErr != nil {
175+
return ResourceHolders{}, encodeErr
176+
}
177+
resourcesRoute := fmt.Sprintf("%s/%s/holders", client.Routes.Resources, resourceId)
178+
request, requestErr := http.NewRequest("POST", resourcesRoute, requestBuffer)
179+
if requestErr != nil {
180+
return ResourceHolders{}, requestErr
181+
}
182+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
183+
request.Header.Add("Accept", "application/json")
184+
185+
response, responseErr := client.HTTPClient.Do(request)
186+
if responseErr != nil {
187+
return ResourceHolders{}, responseErr
188+
}
189+
defer response.Body.Close()
190+
191+
statusErr := utils.HTTPStatusCheck(response)
192+
if statusErr != nil {
193+
return ResourceHolders{}, statusErr
194+
}
195+
196+
var resourceHolders ResourceHolders
197+
decodeErr := json.NewDecoder(response.Body).Decode(&resourceHolders)
198+
return resourceHolders, decodeErr
199+
}
200+
201+
func (client BroodClient) DeleteResourceHolderPermissions(token, resourceId string, resourceHolder ResourceHolder) (ResourceHolders, error) {
202+
requestBody := ResourceHolder(resourceHolder)
203+
requestBuffer := new(bytes.Buffer)
204+
encodeErr := json.NewEncoder(requestBuffer).Encode(requestBody)
205+
if encodeErr != nil {
206+
return ResourceHolders{}, encodeErr
207+
}
208+
resourcesRoute := fmt.Sprintf("%s/%s/holders", client.Routes.Resources, resourceId)
209+
request, requestErr := http.NewRequest("DELETE", resourcesRoute, requestBuffer)
210+
if requestErr != nil {
211+
return ResourceHolders{}, requestErr
212+
}
213+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
214+
request.Header.Add("Accept", "application/json")
215+
216+
response, responseErr := client.HTTPClient.Do(request)
217+
if responseErr != nil {
218+
return ResourceHolders{}, responseErr
219+
}
220+
defer response.Body.Close()
221+
222+
statusErr := utils.HTTPStatusCheck(response)
223+
if statusErr != nil {
224+
return ResourceHolders{}, statusErr
225+
}
226+
227+
var resourceHolders ResourceHolders
228+
decodeErr := json.NewDecoder(response.Body).Decode(&resourceHolders)
229+
return resourceHolders, decodeErr
230+
}

pkg/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package bugout
22

3-
const Version string = "0.4.1"
3+
const Version string = "0.4.2"

0 commit comments

Comments
 (0)