Skip to content

Commit 40b3664

Browse files
authored
Merge pull request #16 from bugout-dev/brood-applications
Added support for Brood applications
2 parents b7c78fc + 01f6e6c commit 40b3664

File tree

6 files changed

+296
-2
lines changed

6 files changed

+296
-2
lines changed

cmd/bugout/brood/applications.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package broodcmd
2+
3+
import (
4+
"encoding/json"
5+
6+
"github.com/spf13/cobra"
7+
8+
"github.com/bugout-dev/bugout-go/cmd/bugout/cmdutils"
9+
bugout "github.com/bugout-dev/bugout-go/pkg"
10+
)
11+
12+
func CreateApplicationsCommand() *cobra.Command {
13+
applicationsCmd := &cobra.Command{
14+
Use: "applications",
15+
Short: "Bugout application operations",
16+
}
17+
18+
applicationsCreateCmd := CreateApplicationsCreateCommand()
19+
applicationsGetCmd := CreateApplicationsGetCommand()
20+
applicationsListCmd := CreateApplicationsListCommand()
21+
applicationsDeleteCmd := CreateApplicationsDeleteCommand()
22+
23+
applicationsCmd.AddCommand(applicationsCreateCmd, applicationsGetCmd, applicationsListCmd, applicationsDeleteCmd)
24+
25+
return applicationsCmd
26+
}
27+
28+
func CreateApplicationsCreateCommand() *cobra.Command {
29+
var token, groupId, name, description string
30+
applicationsCreateCmd := &cobra.Command{
31+
Use: "create",
32+
Short: "Create a new bugout application",
33+
PreRunE: cmdutils.TokenArgPopulator,
34+
RunE: func(cmd *cobra.Command, args []string) error {
35+
client, err := bugout.ClientFromEnv()
36+
if err != nil {
37+
return err
38+
}
39+
40+
applications, applicationsErr := client.Brood.CreateApplication(token, groupId, name, description)
41+
if applicationsErr != nil {
42+
return applicationsErr
43+
}
44+
45+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(applications)
46+
return encodeErr
47+
},
48+
}
49+
50+
applicationsCreateCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
51+
applicationsCreateCmd.Flags().StringVarP(&groupId, "group", "g", "", "ID of Brood group to create the application under")
52+
applicationsCreateCmd.Flags().StringVarP(&name, "name", "n", "", "Name of application to create")
53+
applicationsCreateCmd.Flags().StringVarP(&description, "description", "d", "", "Description of application to create")
54+
applicationsCreateCmd.MarkFlagRequired("group")
55+
applicationsCreateCmd.MarkFlagRequired("name")
56+
57+
return applicationsCreateCmd
58+
}
59+
60+
func CreateApplicationsGetCommand() *cobra.Command {
61+
var token, applicationId string
62+
applicationsGetCmd := &cobra.Command{
63+
Use: "get",
64+
Short: "Get an application by ID",
65+
PreRunE: cmdutils.TokenArgPopulator,
66+
RunE: func(cmd *cobra.Command, args []string) error {
67+
client, err := bugout.ClientFromEnv()
68+
if err != nil {
69+
return err
70+
}
71+
72+
applications, applicationsErr := client.Brood.GetApplication(token, applicationId)
73+
if applicationsErr != nil {
74+
return applicationsErr
75+
}
76+
77+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(applications)
78+
return encodeErr
79+
},
80+
}
81+
82+
applicationsGetCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
83+
applicationsGetCmd.Flags().StringVarP(&applicationId, "application", "a", "", "ID of application to get")
84+
applicationsGetCmd.MarkFlagRequired("application")
85+
86+
return applicationsGetCmd
87+
}
88+
89+
func CreateApplicationsListCommand() *cobra.Command {
90+
var token, groupId string
91+
applicationsListCmd := &cobra.Command{
92+
Use: "list",
93+
Short: "List applications for a given user",
94+
PreRunE: cmdutils.TokenArgPopulator,
95+
RunE: func(cmd *cobra.Command, args []string) error {
96+
client, err := bugout.ClientFromEnv()
97+
if err != nil {
98+
return err
99+
}
100+
101+
applications, applicationsErr := client.Brood.ListApplications(token, groupId)
102+
if applicationsErr != nil {
103+
return applicationsErr
104+
}
105+
106+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(applications)
107+
return encodeErr
108+
},
109+
}
110+
111+
applicationsListCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
112+
applicationsListCmd.Flags().StringVarP(&groupId, "group", "g", "", "Only return applications owned by this group (optional)")
113+
114+
return applicationsListCmd
115+
}
116+
117+
func CreateApplicationsDeleteCommand() *cobra.Command {
118+
var token, applicationID string
119+
applicationsDeleteCmd := &cobra.Command{
120+
Use: "delete",
121+
Short: "Delete a bugout application (by ID)",
122+
PreRunE: cmdutils.TokenArgPopulator,
123+
RunE: func(cmd *cobra.Command, args []string) error {
124+
client, err := bugout.ClientFromEnv()
125+
if err != nil {
126+
return err
127+
}
128+
129+
application, applicationErr := client.Brood.DeleteApplication(token, applicationID)
130+
if applicationErr != nil {
131+
return applicationErr
132+
}
133+
134+
encodeErr := json.NewEncoder(cmd.OutOrStdout()).Encode(application)
135+
return encodeErr
136+
},
137+
}
138+
139+
applicationsDeleteCmd.Flags().StringVarP(&token, "token", "t", "", "Bugout access token to use for the request")
140+
applicationsDeleteCmd.Flags().StringVarP(&applicationID, "id", "i", "", "ID of application to delete")
141+
applicationsDeleteCmd.MarkFlagRequired("id")
142+
143+
return applicationsDeleteCmd
144+
}

cmd/bugout/brood/command.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ func PopulateBroodCommands(cmd *cobra.Command) {
1414
pingCmd := CreatePingCommand()
1515
userCmd := CreateUserCommand()
1616
versionCmd := CreateVersionCommand()
17+
applicationsCmd := CreateApplicationsCommand()
1718

18-
cmd.AddCommand(groupsCmd, resourcesCmd, pingCmd, userCmd, versionCmd)
19+
cmd.AddCommand(groupsCmd, resourcesCmd, pingCmd, userCmd, versionCmd, applicationsCmd)
1920
}
2021

2122
func CreatePingCommand() *cobra.Command {

pkg/brood/applications.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package brood
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"net/http"
7+
"net/url"
8+
"strconv"
9+
"strings"
10+
11+
"github.com/bugout-dev/bugout-go/pkg/utils"
12+
)
13+
14+
func (client BroodClient) CreateApplication(token, groupId, name, description string) (Application, error) {
15+
applicationsRoute := client.Routes.Applications
16+
data := url.Values{}
17+
data.Add("group_id", groupId)
18+
data.Add("name", name)
19+
if description != "" {
20+
data.Add("description", description)
21+
}
22+
encodedData := data.Encode()
23+
24+
request, requestErr := http.NewRequest("POST", applicationsRoute, strings.NewReader(encodedData))
25+
if requestErr != nil {
26+
return Application{}, requestErr
27+
}
28+
request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
29+
request.Header.Add("Content-Length", strconv.Itoa(len(encodedData)))
30+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
31+
request.Header.Add("Accept", "application/json")
32+
response, err := client.HTTPClient.Do(request)
33+
if err != nil {
34+
return Application{}, err
35+
}
36+
defer response.Body.Close()
37+
38+
statusErr := utils.HTTPStatusCheck(response)
39+
if statusErr != nil {
40+
return Application{}, statusErr
41+
}
42+
43+
var application Application
44+
decodeErr := json.NewDecoder(response.Body).Decode(&application)
45+
return application, decodeErr
46+
}
47+
48+
func (client BroodClient) GetApplication(token, applicationId string) (Application, error) {
49+
applicationsRoute := client.Routes.Applications
50+
specificApplicationRoute := fmt.Sprintf("%s/%s", applicationsRoute, applicationId)
51+
request, requestErr := http.NewRequest("GET", specificApplicationRoute, nil)
52+
if requestErr != nil {
53+
return Application{}, requestErr
54+
}
55+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
56+
request.Header.Add("Accept", "application/json")
57+
58+
response, err := client.HTTPClient.Do(request)
59+
if err != nil {
60+
return Application{}, err
61+
}
62+
defer response.Body.Close()
63+
64+
statusErr := utils.HTTPStatusCheck(response)
65+
if statusErr != nil {
66+
return Application{}, statusErr
67+
}
68+
69+
var application Application
70+
decodeErr := json.NewDecoder(response.Body).Decode(&application)
71+
return application, decodeErr
72+
}
73+
74+
func (client BroodClient) ListApplications(token, groupId string) (ApplicationsList, error) {
75+
applicationsRoute := client.Routes.Applications
76+
request, requestErr := http.NewRequest("GET", applicationsRoute, nil)
77+
if requestErr != nil {
78+
return ApplicationsList{}, requestErr
79+
}
80+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
81+
request.Header.Add("Accept", "application/json")
82+
83+
query := request.URL.Query()
84+
if groupId != "" {
85+
query.Add("group_id", groupId)
86+
}
87+
request.URL.RawQuery = query.Encode()
88+
89+
response, err := client.HTTPClient.Do(request)
90+
if err != nil {
91+
return ApplicationsList{}, err
92+
}
93+
defer response.Body.Close()
94+
95+
statusErr := utils.HTTPStatusCheck(response)
96+
if statusErr != nil {
97+
return ApplicationsList{}, statusErr
98+
}
99+
100+
var applications ApplicationsList
101+
decodeErr := json.NewDecoder(response.Body).Decode(&applications)
102+
return applications, decodeErr
103+
}
104+
105+
func (client BroodClient) DeleteApplication(token, applicationId string) (Application, error) {
106+
applicationsRoute := client.Routes.Applications
107+
deletionRoute := fmt.Sprintf("%s/%s", applicationsRoute, applicationId)
108+
109+
request, requestErr := http.NewRequest("DELETE", deletionRoute, nil)
110+
if requestErr != nil {
111+
return Application{}, requestErr
112+
}
113+
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
114+
request.Header.Add("Accept", "application/json")
115+
116+
response, err := client.HTTPClient.Do(request)
117+
if err != nil {
118+
return Application{}, err
119+
}
120+
defer response.Body.Close()
121+
122+
statusErr := utils.HTTPStatusCheck(response)
123+
if statusErr != nil {
124+
return Application{}, statusErr
125+
}
126+
127+
var application Application
128+
decodeErr := json.NewDecoder(response.Body).Decode(&application)
129+
return application, decodeErr
130+
}

pkg/brood/client.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ type BroodCaller interface {
3535
CreateResource(token, applicationId string, resourceData interface{}) (Resource, error)
3636
GetResources(token, applicationId string, queryParameters map[string]string) (Resources, error)
3737
DeleteResource(token, resourceId string) (Resource, error)
38+
CreateApplication(token, groupId, name, description string) (Application, error)
39+
GetApplication(token, applicationId string) (Application, error)
40+
ListApplications(token, groupId string) (ApplicationsList, error)
41+
DeleteApplication(token, applicationId string) (Application, error)
3842
}
3943

4044
type BroodRoutes struct {
@@ -51,6 +55,7 @@ type BroodRoutes struct {
5155
RequestReset string
5256
ConfirmReset string
5357
Resources string
58+
Applications string
5459
}
5560

5661
func RoutesFromURL(broodURL string) BroodRoutes {
@@ -69,6 +74,7 @@ func RoutesFromURL(broodURL string) BroodRoutes {
6974
RequestReset: fmt.Sprintf("%s/reset", cleanURL),
7075
ConfirmReset: fmt.Sprintf("%s/reset_password", cleanURL),
7176
Resources: fmt.Sprintf("%s/resources", cleanURL),
77+
Applications: fmt.Sprintf("%s/applications", cleanURL),
7278
}
7379
}
7480

pkg/brood/data.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ type UserGroupsList struct {
4848
Groups []UserGroup `json:"groups"`
4949
}
5050

51+
// Applications
52+
53+
type Application struct {
54+
Id string `json:"id"`
55+
GroupId string `json:"group_id"`
56+
Name string `json:"name"`
57+
Description string `json:"description,omitempty"`
58+
}
59+
60+
type ApplicationsList struct {
61+
Applications []Application `json:"applications"`
62+
}
63+
5164
// Resources
5265
type Resource struct {
5366
Id string `json:"id"`

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

0 commit comments

Comments
 (0)