From f870d2c36a0716a8303d4a1557e498dfb8f93663 Mon Sep 17 00:00:00 2001 From: Soner Sayakci Date: Sat, 15 Jan 2022 11:59:19 +0000 Subject: [PATCH] feat (account-api): implement GetExtensionByName and GetExtensionById --- account-api/producer.go | 69 ++++++++++++++++++++++++-- cmd/account_producer_extension_list.go | 16 +++++- go.mod | 1 + go.sum | 2 + 4 files changed, 84 insertions(+), 4 deletions(-) diff --git a/account-api/producer.go b/account-api/producer.go index f7605d4b..b7de3984 100644 --- a/account-api/producer.go +++ b/account-api/producer.go @@ -4,6 +4,10 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/gorilla/schema" + "net/url" + "strconv" + "strings" ) type producerEndpoint struct { @@ -110,8 +114,25 @@ type producer struct { CancelledContract interface{} `json:"cancelledContract"` } -func (e producerEndpoint) Extensions() ([]extension, error) { - r, err := e.c.NewAuthenticatedRequest("GET", fmt.Sprintf("%s/plugins?producerId=%d&limit=100&orderBy=name&orderSequence=asc", ApiUrl, e.GetId()), nil) +type ListExtensionCriteria struct { + Limit int `schema:"limit,omitempty"` + Offset int `schema:"offset,omitempty"` + OrderBy string `schema:"orderBy,omitempty"` + OrderSequence string `schema:"orderSequence,omitempty"` + Search string `schema:"search,omitempty"` +} + +func (e producerEndpoint) Extensions(criteria *ListExtensionCriteria) ([]extension, error) { + encoder := schema.NewEncoder() + form := url.Values{} + form.Set("producerId", strconv.FormatInt(int64(e.GetId()), 10)) + err := encoder.Encode(criteria, form) + + if err != nil { + return nil, fmt.Errorf("list_extensions: %v", err) + } + + r, err := e.c.NewAuthenticatedRequest("GET", fmt.Sprintf("%s/plugins?%s", ApiUrl, form.Encode()), nil) if err != nil { return nil, err } @@ -130,6 +151,48 @@ func (e producerEndpoint) Extensions() ([]extension, error) { return extensions, nil } +func (e producerEndpoint) GetExtensionByName(name string) (*extension, error) { + criteria := ListExtensionCriteria{ + Search: name, + } + + extensions, err := e.Extensions(&criteria) + + if err != nil { + return nil, err + } + + for _, ext := range extensions { + if strings.ToLower(ext.Name) == strings.ToLower(name) { + return e.GetExtensionById(ext.Id) + } + } + + return nil, fmt.Errorf("cannot find extension by name %s", name) +} + +func (e producerEndpoint) GetExtensionById(id int) (*extension, error) { + // Create it + r, err := e.c.NewAuthenticatedRequest("GET", fmt.Sprintf("%s/plugins/%d", ApiUrl, id), nil) + + if err != nil { + return nil, fmt.Errorf("GetExtensionById: %v", err) + } + + body, err := e.c.doRequest(r) + + if err != nil { + return nil, fmt.Errorf("GetExtensionById: %v", err) + } + + var extension extension + if err := json.Unmarshal(body, &extension); err != nil { + return nil, fmt.Errorf("GetExtensionById: %v", err) + } + + return &extension, nil +} + type extension struct { Id int `json:"id"` Producer struct { @@ -266,7 +329,7 @@ type extension struct { IsEnterpriseAccelerator bool `json:"isEnterpriseAccelerator"` IsSW6EnterpriseFeature bool `json:"isSW6EnterpriseFeature"` IsSW6ProfessionalEditionFeature bool `json:"isSW6ProfessionalEditionFeature"` - Binaries string `json:"binaries"` + Binaries interface{} `json:"binaries"` Predecessor interface{} `json:"predecessor"` Successor interface{} `json:"successor"` IsCompatibleWithLatestShopwareVersion bool `json:"isCompatibleWithLatestShopwareVersion"` diff --git a/cmd/account_producer_extension_list.go b/cmd/account_producer_extension_list.go index 57649a6c..5a499b1f 100644 --- a/cmd/account_producer_extension_list.go +++ b/cmd/account_producer_extension_list.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "log" "os" + account_api "shopware-cli/account-api" "strconv" ) @@ -22,7 +23,17 @@ var accountCompanyProducerExtensionListCmd = &cobra.Command{ os.Exit(1) } - extensions, err := p.Extensions() + criteria := account_api.ListExtensionCriteria{ + Limit: 100, + } + + if len(listExtensionSearch) > 0 { + criteria.Search = listExtensionSearch + criteria.OrderBy = "name" + criteria.OrderSequence = "asc" + } + + extensions, err := p.Extensions(&criteria) if err != nil { log.Fatalln(err) @@ -55,6 +66,9 @@ var accountCompanyProducerExtensionListCmd = &cobra.Command{ }, } +var listExtensionSearch string + func init() { accountCompanyProducerExtensionCmd.AddCommand(accountCompanyProducerExtensionListCmd) + accountCompanyProducerExtensionListCmd.Flags().StringVar(&listExtensionSearch, "search", "", "Filter for name") } diff --git a/go.mod b/go.mod index be8eaf5f..b682ff67 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.17 require ( github.com/fatih/color v1.13.0 + github.com/gorilla/schema v1.2.0 github.com/hashicorp/go-version v1.4.0 github.com/manifoldco/promptui v0.9.0 github.com/olekukonko/tablewriter v0.0.5 diff --git a/go.sum b/go.sum index e53c953d..5318cb24 100644 --- a/go.sum +++ b/go.sum @@ -194,6 +194,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= +github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=