Skip to content

Commit 4bc8c7f

Browse files
authored
Merge pull request #17 from bugout-dev/resource-update
Resource update support
2 parents 40b3664 + ea410c3 commit 4bc8c7f

5 files changed

Lines changed: 91 additions & 2 deletions

File tree

cmd/bugout/brood/resources.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ func GenerateResourcesCommand() *cobra.Command {
1717
}
1818

1919
resourcesCreateCmd := GenerateResourceCreateCommand()
20+
resourcesUpdateCmd := GenerateResourceUpdateCommand()
2021
resourcesDeleteCmd := GenerateResourceDeleteCommand()
2122
resourcesGetCmd := GenerateResourcesGetCommand()
2223

23-
resourcesCmd.AddCommand(resourcesCreateCmd, resourcesDeleteCmd, resourcesGetCmd)
24+
resourcesCmd.AddCommand(resourcesCreateCmd, resourcesUpdateCmd, resourcesDeleteCmd, resourcesGetCmd)
2425

2526
return resourcesCmd
2627
}
@@ -62,6 +63,48 @@ func GenerateResourceCreateCommand() *cobra.Command {
6263
return resourceCreateCmd
6364
}
6465

66+
type resourceUpdateArg struct {
67+
Update interface{} `json:"update"`
68+
DropKeys []string `json:"drop_keys"`
69+
}
70+
71+
func GenerateResourceUpdateCommand() *cobra.Command {
72+
var token, resourceId string
73+
resourceUpdateCmd := &cobra.Command{
74+
Use: "update [resource]",
75+
Short: "Update resource",
76+
PreRunE: cmdutils.TokenArgPopulator,
77+
RunE: func(cmd *cobra.Command, args []string) error {
78+
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`)
80+
}
81+
var resourceUpdateRaw resourceUpdateArg
82+
err := json.Unmarshal([]byte(args[0]), &resourceUpdateRaw)
83+
if err != nil {
84+
return err
85+
}
86+
87+
client, clientErr := bugout.ClientFromEnv()
88+
if clientErr != nil {
89+
return clientErr
90+
}
91+
92+
resource, err := client.Brood.UpdateResource(token, resourceId, resourceUpdateRaw.Update, resourceUpdateRaw.DropKeys)
93+
if err != nil {
94+
return err
95+
}
96+
97+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(&resource)
98+
return encodeErr
99+
},
100+
}
101+
102+
resourceUpdateCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
103+
resourceUpdateCmd.Flags().StringVarP(&resourceId, "resource_id", "r", "", "Resource ID")
104+
105+
return resourceUpdateCmd
106+
}
107+
65108
func GenerateResourceDeleteCommand() *cobra.Command {
66109
var token, resourceId string
67110
resourceDeleteCmd := &cobra.Command{

pkg/brood/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type BroodCaller interface {
3333
AddUserToGroup(token, groupID, username, role string) (UserGroup, error)
3434
RemoveUserFromGroup(token, groupID, username string) (UserGroup, error)
3535
CreateResource(token, applicationId string, resourceData interface{}) (Resource, error)
36+
UpdateResource(token, resourceId string, update interface{}, dropKeys []string) (Resource, error)
3637
GetResources(token, applicationId string, queryParameters map[string]string) (Resources, error)
3738
DeleteResource(token, resourceId string) (Resource, error)
3839
CreateApplication(token, groupId, name, description string) (Application, error)

pkg/brood/data.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,8 @@ type resourceCreateRequest struct {
7676
ApplicationId string `json:"application_id"`
7777
ResourceData interface{} `json:"resource_data"`
7878
}
79+
80+
type resourceUpdateRequest struct {
81+
Update interface{} `json:"update"`
82+
DropKeys []string `json:"drop_keys"`
83+
}

pkg/brood/resources.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,46 @@ func (client BroodClient) CreateResource(token, applicationId string, resourceDa
4444
return resource, decodeErr
4545
}
4646

47+
func (client BroodClient) UpdateResource(token, resourceId string, update interface{}, dropKeys []string) (Resource, error) {
48+
requestBody := resourceUpdateRequest{
49+
Update: make(map[string]interface{}),
50+
DropKeys: []string{},
51+
}
52+
if update != nil {
53+
requestBody.Update = update
54+
}
55+
if dropKeys != nil {
56+
requestBody.DropKeys = dropKeys
57+
}
58+
requestBuffer := new(bytes.Buffer)
59+
encodeErr := json.NewEncoder(requestBuffer).Encode(requestBody)
60+
if encodeErr != nil {
61+
return Resource{}, encodeErr
62+
}
63+
resourcesRoute := fmt.Sprintf("%s/%s", client.Routes.Resources, resourceId)
64+
request, requestErr := http.NewRequest("PUT", resourcesRoute, requestBuffer)
65+
if requestErr != nil {
66+
return Resource{}, requestErr
67+
}
68+
request.Header.Add("Content-Type", "application/json")
69+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
70+
71+
response, responseErr := client.HTTPClient.Do(request)
72+
if responseErr != nil {
73+
return Resource{}, responseErr
74+
}
75+
defer response.Body.Close()
76+
77+
statusErr := utils.HTTPStatusCheck(response)
78+
if statusErr != nil {
79+
return Resource{}, statusErr
80+
}
81+
82+
var resource Resource
83+
decodeErr := json.NewDecoder(response.Body).Decode(&resource)
84+
return resource, decodeErr
85+
}
86+
4787
func (client BroodClient) GetResources(token, applicationId string, queryParameters map[string]string) (Resources, error) {
4888
resourcesRoute := client.Routes.Resources
4989
request, requestErr := http.NewRequest("GET", resourcesRoute, nil)

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.0"
3+
const Version string = "0.4.1"

0 commit comments

Comments
 (0)