mirror of
https://github.com/hanzo-fi/stack.git
synced 2026-10-30 20:34:43 +00:00
85 lines
2.6 KiB
Go
85 lines
2.6 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
sharedapi "github.com/formancehq/stack/libs/go-libs/api"
|
|
"github.com/formancehq/stack/libs/go-libs/auth"
|
|
"github.com/formancehq/stack/libs/go-libs/otlp"
|
|
"github.com/formancehq/stack/libs/go-libs/otlp/otlptraces"
|
|
"github.com/formancehq/stack/libs/go-libs/service"
|
|
wallet "github.com/formancehq/wallets/pkg"
|
|
"github.com/formancehq/wallets/pkg/api"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
"go.uber.org/fx"
|
|
"golang.org/x/oauth2"
|
|
"golang.org/x/oauth2/clientcredentials"
|
|
)
|
|
|
|
const (
|
|
stackClientIDFlag = "stack-client-id"
|
|
stackClientSecretFlag = "stack-client-secret"
|
|
stackURLFlag = "stack-url"
|
|
ledgerNameFlag = "ledger"
|
|
accountPrefixFlag = "account-prefix"
|
|
listenFlag = "listen"
|
|
)
|
|
|
|
func newServeCommand() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "serve",
|
|
Aliases: []string{"server"},
|
|
PreRunE: func(cmd *cobra.Command, args []string) error {
|
|
return bindFlagsToViper(cmd)
|
|
},
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
options := []fx.Option{
|
|
fx.Provide(func() (*http.Client, error) {
|
|
return GetHTTPClient(cmd.Context(), viper.GetString(stackClientIDFlag), viper.GetString(stackClientSecretFlag),
|
|
viper.GetString(stackURLFlag), viper.GetBool(service.DebugFlag))
|
|
}),
|
|
wallet.Module(
|
|
viper.GetString(stackURLFlag),
|
|
viper.GetString(ledgerNameFlag),
|
|
viper.GetString(accountPrefixFlag),
|
|
),
|
|
api.Module(sharedapi.ServiceInfo{
|
|
Version: Version,
|
|
}, viper.GetString(listenFlag)),
|
|
otlptraces.CLITracesModule(viper.GetViper()),
|
|
auth.CLIAuthModule(viper.GetViper()),
|
|
}
|
|
|
|
return service.New(cmd.OutOrStdout(), options...).Run(cmd.Context())
|
|
},
|
|
}
|
|
cmd.Flags().String(stackClientIDFlag, "", "Client ID")
|
|
cmd.Flags().String(stackClientSecretFlag, "", "Client Secret")
|
|
cmd.Flags().String(stackURLFlag, "", "Token URL")
|
|
cmd.Flags().String(ledgerNameFlag, "wallets-002", "Target ledger")
|
|
cmd.Flags().String(accountPrefixFlag, "", "Account prefix flag")
|
|
cmd.Flags().String(listenFlag, ":8080", "Listen address")
|
|
return cmd
|
|
}
|
|
|
|
func GetHTTPClient(ctx context.Context, clientID, clientSecret, stackURL string, debug bool) (*http.Client, error) {
|
|
httpClient := &http.Client{
|
|
Transport: otlp.NewRoundTripper(http.DefaultTransport, debug),
|
|
}
|
|
|
|
if clientID == "" {
|
|
return httpClient, nil
|
|
}
|
|
|
|
clientCredentialsConfig := clientcredentials.Config{
|
|
ClientID: clientID,
|
|
ClientSecret: clientSecret,
|
|
TokenURL: stackURL + "/api/auth/oauth/token",
|
|
Scopes: []string{"openid ledger:read ledger:write"},
|
|
}
|
|
|
|
return clientCredentialsConfig.Client(context.WithValue(ctx, oauth2.HTTPClient, httpClient)), nil
|
|
}
|