From 7fb7c1db5543fbffbaade55eb7b10b5fbbbe228c Mon Sep 17 00:00:00 2001 From: Paul Nicolas Date: Tue, 28 Nov 2023 16:57:39 +0100 Subject: [PATCH] feat(fctl): fix with new payments version (#922) --- .../connectors/install/bankingcircle.go | 29 ++++++- .../connectors/install/currencycloud.go | 15 +++- .../payments/connectors/install/mangopay.go | 15 +++- .../cmd/payments/connectors/install/modulr.go | 15 +++- .../payments/connectors/install/moneycorp.go | 15 +++- .../cmd/payments/connectors/install/stripe.go | 30 +++++-- .../cmd/payments/connectors/install/wise.go | 16 +++- .../fctl/cmd/payments/connectors/uninstall.go | 83 +++++++++++++------ 8 files changed, 171 insertions(+), 47 deletions(-) diff --git a/components/fctl/cmd/payments/connectors/install/bankingcircle.go b/components/fctl/cmd/payments/connectors/install/bankingcircle.go index ccb0253994..aef5ccf4c4 100644 --- a/components/fctl/cmd/payments/connectors/install/bankingcircle.go +++ b/components/fctl/cmd/payments/connectors/install/bankingcircle.go @@ -15,6 +15,7 @@ import ( type PaymentsConnectorsBankingCircleStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsBankingCircleController struct { store *PaymentsConnectorsBankingCircleStore @@ -24,6 +25,8 @@ type PaymentsConnectorsBankingCircleController struct { defaultAuthorizationEndpoint string pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } var _ fctl.Controller[*PaymentsConnectorsBankingCircleStore] = (*PaymentsConnectorsBankingCircleController)(nil) @@ -43,17 +46,20 @@ func NewPaymentsConnectorsBankingCircleController() *PaymentsConnectorsBankingCi defaultAuthorizationEndpoint: "https://authorizationsandbox.bankingcircleconnect.com", pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "bankingcircle", } } func NewBankingCircleCommand() *cobra.Command { c := NewPaymentsConnectorsBankingCircleController() - return fctl.NewCommand(internal.BankingCircleConnector+" ", + return fctl.NewCommand(internal.BankingCircleConnector+" ", fctl.WithShortDescription("Install a Banking Circle connector"), - fctl.WithArgs(cobra.ExactArgs(2)), + fctl.WithArgs(cobra.ExactArgs(4)), fctl.WithStringFlag(c.endpointFlag, c.defaultEndpoint, "API endpoint"), fctl.WithStringFlag(c.authorizationEndpointFlag, c.defaultAuthorizationEndpoint, "Authorization endpoint"), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsBankingCircleStore](c), ) } @@ -73,12 +79,24 @@ func (c *PaymentsConnectorsBankingCircleController) Run(cmd *cobra.Command, args return nil, err } + cert, err := fctl.ReadFile(cmd, soc.Stack, args[2]) + if err != nil { + return nil, err + } + + certKey, err := fctl.ReadFile(cmd, soc.Stack, args[3]) + if err != nil { + return nil, err + } + request := operations.InstallConnectorRequest{ Connector: shared.ConnectorBankingCircle, ConnectorConfig: shared.ConnectorConfig{ BankingCircleConfig: &shared.BankingCircleConfig{ Username: args[0], Password: args[1], + UserCertificate: cert, + UserCertificateKey: certKey, Endpoint: fctl.GetString(cmd, c.endpointFlag), AuthorizationEndpoint: fctl.GetString(cmd, c.authorizationEndpointFlag), PollingPeriod: fctl.Ptr(fctl.GetString(cmd, c.pollingPeriodFlag)), @@ -97,12 +115,15 @@ func (c *PaymentsConnectorsBankingCircleController) Run(cmd *cobra.Command, args c.store.Success = true c.store.ConnectorName = internal.BankingCircleConnector + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } + return c, nil } func (c *PaymentsConnectorsBankingCircleController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector '%s' installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/currencycloud.go b/components/fctl/cmd/payments/connectors/install/currencycloud.go index 0159bd5a39..2048295f21 100644 --- a/components/fctl/cmd/payments/connectors/install/currencycloud.go +++ b/components/fctl/cmd/payments/connectors/install/currencycloud.go @@ -15,6 +15,7 @@ import ( type PaymentsConnectorsCurrencyCloudStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsCurrencyCloudController struct { store *PaymentsConnectorsCurrencyCloudStore @@ -22,6 +23,8 @@ type PaymentsConnectorsCurrencyCloudController struct { defaultEndpoint string pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } var _ fctl.Controller[*PaymentsConnectorsCurrencyCloudStore] = (*PaymentsConnectorsCurrencyCloudController)(nil) @@ -39,6 +42,8 @@ func NewPaymentsConnectorsCurrencyCloudController() *PaymentsConnectorsCurrencyC defaultEndpoint: "https://devapi.currencycloud.com", pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "currencycloud", } } @@ -49,6 +54,7 @@ func NewCurrencyCloudCommand() *cobra.Command { fctl.WithArgs(cobra.ExactArgs(2)), fctl.WithStringFlag(c.endpointFlag, c.defaultEndpoint, "API endpoint"), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsCurrencyCloudStore](c), ) } @@ -58,7 +64,6 @@ func (c *PaymentsConnectorsCurrencyCloudController) GetStore() *PaymentsConnecto } func (c *PaymentsConnectorsCurrencyCloudController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { - soc, err := fctl.GetStackOrganizationConfigApprobation(cmd, "You are about to install connector '%s'", internal.CurrencyCloudConnector) if err != nil { return nil, fctl.ErrMissingApproval @@ -77,6 +82,7 @@ func (c *PaymentsConnectorsCurrencyCloudController) Run(cmd *cobra.Command, args response, err := paymentsClient.Payments.InstallConnector(cmd.Context(), operations.InstallConnectorRequest{ ConnectorConfig: shared.ConnectorConfig{ CurrencyCloudConfig: &shared.CurrencyCloudConfig{ + Name: fctl.GetString(cmd, c.nameFlag), APIKey: args[1], LoginID: args[0], Endpoint: endpoint, @@ -96,12 +102,15 @@ func (c *PaymentsConnectorsCurrencyCloudController) Run(cmd *cobra.Command, args c.store.Success = true c.store.ConnectorName = internal.CurrencyCloudConnector + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } + return c, nil } func (c *PaymentsConnectorsCurrencyCloudController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector '%s' installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/mangopay.go b/components/fctl/cmd/payments/connectors/install/mangopay.go index aa23c4fcd2..2071ce1b17 100644 --- a/components/fctl/cmd/payments/connectors/install/mangopay.go +++ b/components/fctl/cmd/payments/connectors/install/mangopay.go @@ -15,6 +15,7 @@ import ( type PaymentsConnectorsMangoPayStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsMangoPayController struct { store *PaymentsConnectorsMangoPayStore @@ -22,6 +23,8 @@ type PaymentsConnectorsMangoPayController struct { defaultEndpoint string pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } func NewDefaultPaymentsConnectorsMangoPayStore() *PaymentsConnectorsMangoPayStore { @@ -37,6 +40,8 @@ func NewPaymentsConnectorsMangoPayController() *PaymentsConnectorsMangoPayContro defaultEndpoint: "https://api.sandbox.mangopay.com", pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "mangopay", } } @@ -47,6 +52,7 @@ func NewMangoPayCommand() *cobra.Command { fctl.WithArgs(cobra.ExactArgs(2)), fctl.WithStringFlag(c.endpointFlag, c.defaultEndpoint, "API endpoint"), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsMangoPayStore](c), ) } @@ -88,6 +94,7 @@ func (c *PaymentsConnectorsMangoPayController) Run(cmd *cobra.Command, args []st APIKey: args[1], Endpoint: fctl.GetString(cmd, c.endpointFlag), PollingPeriod: fctl.Ptr(fctl.GetString(cmd, c.pollingPeriodFlag)), + Name: fctl.GetString(cmd, c.nameFlag), }, }, } @@ -101,13 +108,17 @@ func (c *PaymentsConnectorsMangoPayController) Run(cmd *cobra.Command, args []st } c.store.Success = true + c.store.ConnectorName = internal.MangoPayConnector + + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } return c, nil } func (c *PaymentsConnectorsMangoPayController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector %s installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector %s installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/modulr.go b/components/fctl/cmd/payments/connectors/install/modulr.go index 8e5b6d97d8..f387724853 100644 --- a/components/fctl/cmd/payments/connectors/install/modulr.go +++ b/components/fctl/cmd/payments/connectors/install/modulr.go @@ -15,13 +15,17 @@ import ( type PaymentsConnectorsModulrStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } + type PaymentsConnectorsModulrController struct { store *PaymentsConnectorsModulrStore endpointFlag string defaultEndpoint string pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } var _ fctl.Controller[*PaymentsConnectorsModulrStore] = (*PaymentsConnectorsModulrController)(nil) @@ -39,6 +43,8 @@ func NewPaymentsConnectorsModulrController() *PaymentsConnectorsModulrController defaultEndpoint: "https://api-sandbox.modulrfinance.com", pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "modulr", } } @@ -49,6 +55,7 @@ func NewModulrCommand() *cobra.Command { fctl.WithArgs(cobra.ExactArgs(2)), fctl.WithStringFlag(c.endpointFlag, c.defaultEndpoint, "API endpoint"), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsModulrStore](c), ) } @@ -76,6 +83,7 @@ func (c *PaymentsConnectorsModulrController) Run(cmd *cobra.Command, args []stri response, err := paymentsClient.Payments.InstallConnector(cmd.Context(), operations.InstallConnectorRequest{ ConnectorConfig: shared.ConnectorConfig{ ModulrConfig: &shared.ModulrConfig{ + Name: fctl.GetString(cmd, c.nameFlag), APIKey: args[0], APISecret: args[1], Endpoint: endpoint, @@ -95,12 +103,15 @@ func (c *PaymentsConnectorsModulrController) Run(cmd *cobra.Command, args []stri c.store.Success = true c.store.ConnectorName = internal.ModulrConnector + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } + return c, nil } func (c *PaymentsConnectorsModulrController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector '%s' installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/moneycorp.go b/components/fctl/cmd/payments/connectors/install/moneycorp.go index 9585c0ad5d..3da03ce842 100644 --- a/components/fctl/cmd/payments/connectors/install/moneycorp.go +++ b/components/fctl/cmd/payments/connectors/install/moneycorp.go @@ -15,6 +15,7 @@ import ( type PaymentsConnectorsMoneycorpStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsMoneycorpController struct { store *PaymentsConnectorsMoneycorpStore @@ -22,6 +23,8 @@ type PaymentsConnectorsMoneycorpController struct { defaultEndpoint string pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } func NewDefaultPaymentsConnectorsMoneycorpStore() *PaymentsConnectorsMoneycorpStore { @@ -37,6 +40,8 @@ func NewPaymentsConnectorsMoneycorpController() *PaymentsConnectorsMoneycorpCont defaultEndpoint: "https://sandbox-corpapi.moneycorp.com", pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "moneycorp", } } func NewMoneycorpCommand() *cobra.Command { @@ -47,6 +52,7 @@ func NewMoneycorpCommand() *cobra.Command { fctl.WithArgs(cobra.ExactArgs(2)), fctl.WithStringFlag(c.endpointFlag, c.defaultEndpoint, "API endpoint"), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsMoneycorpStore](c), ) } @@ -84,6 +90,7 @@ func (c *PaymentsConnectorsMoneycorpController) Run(cmd *cobra.Command, args []s Connector: shared.ConnectorMoneycorp, ConnectorConfig: shared.ConnectorConfig{ MoneycorpConfig: &shared.MoneycorpConfig{ + Name: fctl.GetString(cmd, c.nameFlag), ClientID: args[0], APIKey: args[1], Endpoint: fctl.GetString(cmd, c.endpointFlag), @@ -103,13 +110,17 @@ func (c *PaymentsConnectorsMoneycorpController) Run(cmd *cobra.Command, args []s pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector installed!") c.store.Success = true + c.store.ConnectorName = internal.MoneycorpConnector + + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } return c, nil } func (c *PaymentsConnectorsMoneycorpController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector %s installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector %s installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/stripe.go b/components/fctl/cmd/payments/connectors/install/stripe.go index d428bc9390..99d4a979f0 100644 --- a/components/fctl/cmd/payments/connectors/install/stripe.go +++ b/components/fctl/cmd/payments/connectors/install/stripe.go @@ -15,10 +15,15 @@ import ( type PaymentsConnectorsStripeStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsStripeController struct { - store *PaymentsConnectorsStripeStore - stripeApiKeyFlag string + store *PaymentsConnectorsStripeStore + stripeApiKeyFlag string + pollingPeriodFlag string + defaultpollingPeriod string + nameFlag string + defaultName string } var _ fctl.Controller[*PaymentsConnectorsStripeStore] = (*PaymentsConnectorsStripeController)(nil) @@ -31,8 +36,12 @@ func NewDefaultPaymentsConnectorsStripeStore() *PaymentsConnectorsStripeStore { func NewPaymentsConnectorsStripeController() *PaymentsConnectorsStripeController { return &PaymentsConnectorsStripeController{ - store: NewDefaultPaymentsConnectorsStripeStore(), - stripeApiKeyFlag: "api-key", + store: NewDefaultPaymentsConnectorsStripeStore(), + stripeApiKeyFlag: "api-key", + pollingPeriodFlag: "polling-period", + defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "stripe", } } @@ -43,6 +52,8 @@ func NewStripeCommand() *cobra.Command { fctl.WithConfirmFlag(), fctl.WithArgs(cobra.ExactArgs(1)), fctl.WithStringFlag(c.stripeApiKeyFlag, "", "Stripe API key"), + fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsStripeStore](c), ) } @@ -65,7 +76,9 @@ func (c *PaymentsConnectorsStripeController) Run(cmd *cobra.Command, args []stri response, err := paymentsClient.Payments.InstallConnector(cmd.Context(), operations.InstallConnectorRequest{ ConnectorConfig: shared.ConnectorConfig{ StripeConfig: &shared.StripeConfig{ - APIKey: args[0], + Name: fctl.GetString(cmd, c.nameFlag), + APIKey: args[0], + PollingPeriod: fctl.Ptr(fctl.GetString(cmd, c.pollingPeriodFlag)), }, }, Connector: shared.ConnectorStripe, @@ -81,12 +94,15 @@ func (c *PaymentsConnectorsStripeController) Run(cmd *cobra.Command, args []stri c.store.Success = true c.store.ConnectorName = internal.StripeConnector + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } + return c, nil } func (c *PaymentsConnectorsStripeController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector '%s' installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/install/wise.go b/components/fctl/cmd/payments/connectors/install/wise.go index 4085060fff..f11ee95f10 100644 --- a/components/fctl/cmd/payments/connectors/install/wise.go +++ b/components/fctl/cmd/payments/connectors/install/wise.go @@ -15,11 +15,14 @@ import ( type PaymentsConnectorsWiseStore struct { Success bool `json:"success"` ConnectorName string `json:"connectorName"` + ConnectorID string `json:"connectorId"` } type PaymentsConnectorsWiseController struct { store *PaymentsConnectorsWiseStore pollingPeriodFlag string defaultpollingPeriod string + nameFlag string + defaultName string } var _ fctl.Controller[*PaymentsConnectorsWiseStore] = (*PaymentsConnectorsWiseController)(nil) @@ -35,6 +38,8 @@ func NewPaymentsConnectorsWiseController() *PaymentsConnectorsWiseController { store: NewDefaultPaymentsConnectorsWiseStore(), pollingPeriodFlag: "polling-period", defaultpollingPeriod: "2m", + nameFlag: "name", + defaultName: "wise", } } @@ -44,6 +49,7 @@ func NewWiseCommand() *cobra.Command { fctl.WithShortDescription("Install a Wise connector"), fctl.WithArgs(cobra.ExactArgs(1)), fctl.WithStringFlag(c.pollingPeriodFlag, c.defaultpollingPeriod, "Polling duration"), + fctl.WithStringFlag(c.nameFlag, c.defaultName, "Connector name"), fctl.WithController[*PaymentsConnectorsWiseStore](c), ) } @@ -66,7 +72,8 @@ func (c *PaymentsConnectorsWiseController) Run(cmd *cobra.Command, args []string response, err := paymentsClient.Payments.InstallConnector(cmd.Context(), operations.InstallConnectorRequest{ ConnectorConfig: shared.ConnectorConfig{ WiseConfig: &shared.WiseConfig{ - APIKey: args[1], + Name: fctl.GetString(cmd, c.nameFlag), + APIKey: args[0], PollingPeriod: fctl.Ptr(fctl.GetString(cmd, c.pollingPeriodFlag)), }, }, @@ -83,12 +90,15 @@ func (c *PaymentsConnectorsWiseController) Run(cmd *cobra.Command, args []string c.store.Success = true c.store.ConnectorName = internal.WiseConnector + if response.ConnectorResponse != nil { + c.store.ConnectorID = response.ConnectorResponse.Data.ConnectorID + } + return c, nil } func (c *PaymentsConnectorsWiseController) Render(cmd *cobra.Command, args []string) error { - - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' installed!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("%s: connector '%s' installed!", c.store.ConnectorName, c.store.ConnectorID) return nil } diff --git a/components/fctl/cmd/payments/connectors/uninstall.go b/components/fctl/cmd/payments/connectors/uninstall.go index 6277c7f6ff..18af35bca1 100644 --- a/components/fctl/cmd/payments/connectors/uninstall.go +++ b/components/fctl/cmd/payments/connectors/uninstall.go @@ -16,36 +16,43 @@ var ( ) type PaymentsConnectorsUninstallStore struct { - Success bool `json:"success"` - ConnectorName string `json:"connectorName"` + Success bool `json:"success"` + Connector string `json:"connector"` } type PaymentsConnectorsUninstallController struct { - store *PaymentsConnectorsUninstallStore + store *PaymentsConnectorsUninstallStore + providerFlag string + connectorIDFlag string } var _ fctl.Controller[*PaymentsConnectorsUninstallStore] = (*PaymentsConnectorsUninstallController)(nil) func NewDefaultPaymentsConnectorsUninstallStore() *PaymentsConnectorsUninstallStore { return &PaymentsConnectorsUninstallStore{ - Success: false, - ConnectorName: "", + Success: false, + Connector: "", } } func NewPaymentsConnectorsUninstallController() *PaymentsConnectorsUninstallController { return &PaymentsConnectorsUninstallController{ - store: NewDefaultPaymentsConnectorsUninstallStore(), + store: NewDefaultPaymentsConnectorsUninstallStore(), + providerFlag: "provider", + connectorIDFlag: "connectorid", } } func NewUninstallCommand() *cobra.Command { - return fctl.NewCommand("uninstall ", + c := NewPaymentsConnectorsUninstallController() + return fctl.NewCommand("uninstall", fctl.WithAliases("uninstall", "u", "un"), fctl.WithConfirmFlag(), - fctl.WithArgs(cobra.ExactArgs(1)), + fctl.WithArgs(cobra.ExactArgs(0)), fctl.WithValidArgs(internal.AllConnectors...), + fctl.WithStringFlag(c.providerFlag, "", "Provider name"), + fctl.WithStringFlag(c.connectorIDFlag, "", "Connector ID"), fctl.WithShortDescription("Uninstall a connector"), - fctl.WithController[*PaymentsConnectorsUninstallStore](NewPaymentsConnectorsUninstallController()), + fctl.WithController[*PaymentsConnectorsUninstallStore](c), ) } @@ -69,34 +76,62 @@ func (c *PaymentsConnectorsUninstallController) Run(cmd *cobra.Command, args []s return nil, err } - if !fctl.CheckStackApprobation(cmd, stack, "You are about to uninstall connector '%s'", args[0]) { - return nil, fctl.ErrMissingApproval - } - client, err := fctl.NewStackClient(cmd, cfg, stack) if err != nil { return nil, err } - response, err := client.Payments.UninstallConnector(cmd.Context(), operations.UninstallConnectorRequest{ - Connector: shared.Connector(args[0]), - }) - if err != nil { - return nil, err - } - - if response.StatusCode >= 300 { - return nil, fmt.Errorf("unexpected status code: %d", response.StatusCode) + provider := fctl.GetString(cmd, c.providerFlag) + connectorID := fctl.GetString(cmd, c.connectorIDFlag) + switch { + case provider != "" && connectorID != "": + if !fctl.CheckStackApprobation(cmd, stack, "You are about to uninstall connector '%s' from provider '%s'", connectorID, provider) { + return nil, fctl.ErrMissingApproval + } + + response, err := client.Payments.UninstallConnectorV1(cmd.Context(), operations.UninstallConnectorV1Request{ + ConnectorID: connectorID, + Connector: shared.Connector(provider), + }) + if err != nil { + return nil, err + } + + if response.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", response.StatusCode) + } + + c.store.Connector = connectorID + case provider == "" && connectorID == "": + return nil, fmt.Errorf("must use either --provider and --connector-id") + case connectorID != "": + return nil, fmt.Errorf("must use --provider when using --connector-id") + case provider != "": + if !fctl.CheckStackApprobation(cmd, stack, "You are about to uninstall connector '%s'", provider) { + return nil, fctl.ErrMissingApproval + } + + response, err := client.Payments.UninstallConnector(cmd.Context(), operations.UninstallConnectorRequest{ + Connector: shared.Connector(provider), + }) + if err != nil { + return nil, err + } + + if response.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", response.StatusCode) + } + + c.store.Connector = provider } c.store.Success = true - c.store.ConnectorName = args[0] return c, nil } // TODO: This need to use the ui.NewListModel func (c *PaymentsConnectorsUninstallController) Render(cmd *cobra.Command, args []string) error { - pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' uninstalled!", c.store.ConnectorName) + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Connector '%s' uninstalled!", c.store.Connector) return nil }