goshort/cmd/shared/shared.go

88 lines
3.0 KiB
Go
Raw Permalink Normal View History

2023-08-17 14:14:59 -03:00
package shared
import (
"context"
"flag"
"fmt"
"os"
2023-08-17 14:14:59 -03:00
"strings"
"git.maronato.dev/maronato/goshort/internal/config"
2023-08-17 19:55:08 -03:00
"git.maronato.dev/maronato/goshort/internal/storage"
2023-08-22 00:48:12 -03:00
sqlitestorage "git.maronato.dev/maronato/goshort/internal/storage/sqlite"
2023-08-17 14:14:59 -03:00
"github.com/peterbourgon/ff/v3"
)
type Command struct {
// cfg is the command config populated by Parse.
cfg *config.Config
// exec is the command execution function.
exec func(context.Context, *config.Config) error
}
func NewCommand(cfg *config.Config, exec func(context.Context, *config.Config) error) *Command {
return &Command{
cfg: cfg,
exec: exec,
}
}
func (c *Command) Exec(ctx context.Context, _ []string) error {
return c.exec(ctx, c.cfg)
}
func NewSharedCmdOptions() []ff.Option {
return []ff.Option{
ff.WithEnvVarPrefix("GOSHORT"),
}
}
func RegisterBaseFlags(fs *flag.FlagSet, cfg *config.Config) {
2023-09-06 18:43:56 -03:00
fs.BoolVar(&cfg.Quiet, "quiet", config.DefaultQuiet, "enable quiet mode")
// Verbose flag that accepts multiple values
fs.IntVar((*int)(&cfg.Verbose), "verbose", int(config.DefaultVerbose), "set verbosity level")
2023-08-26 11:47:46 -03:00
defaultHost := config.DefaultHost
if os.Getenv("ENV_DOCKER") == "true" {
2023-08-24 22:03:58 -03:00
// This is a QOL hack to allow docker to bind the port without manually specifying the host
defaultHost = "0.0.0.0"
}
2023-08-26 11:47:46 -03:00
fs.StringVar(&cfg.Host, "host", defaultHost, "host to listen on")
2023-08-17 14:14:59 -03:00
fs.StringVar(&cfg.Port, "port", config.DefaultPort, "port to listen on")
}
func RegisterServerFlags(fs *flag.FlagSet, cfg *config.Config) {
2023-08-26 11:47:46 -03:00
fs.BoolVar(
&cfg.DisableRegistration,
"disable-registration",
config.DefaultDisableRegistration,
"wether or not registration is disabled",
)
dbTypeString := fmt.Sprintf("type of database to use [%s]", strings.Join(config.GetDBTypeList(), ", "))
2023-08-17 14:14:59 -03:00
fs.StringVar(&cfg.DBType, "db-type", config.DefaultDBType, dbTypeString)
2023-08-26 11:47:46 -03:00
2023-08-17 14:14:59 -03:00
fs.StringVar(&cfg.DBURL, "db", config.DefaultDBURL, "database connection string or sqlite db path")
fs.DurationVar(&cfg.SessionDuration, "session-duration", config.DefaultSessionDuration, "session duration")
2024-03-09 06:44:22 -03:00
fs.BoolVar(&cfg.DisableCredentialsLogin, "disable-credentials-login", config.DefaultDisableCredentialsLogin, "disable credentials login")
fs.StringVar(&cfg.OIDCIssuerURL, "oidc-issuer-url", "", "OIDC issuer URL")
fs.StringVar(&cfg.OIDCClientID, "oidc-client-id", "", "OIDC client ID")
fs.StringVar(&cfg.OIDCClientSecret, "oidc-client-secret", "", "OIDC client secret")
fs.StringVar(&cfg.OIDCRedirectURL, "oidc-redirect-url", "", "OIDC redirect URL")
2024-03-09 07:42:36 -03:00
fs.StringVar(&cfg.OIDCIssuerName, "oidc-issuer-name", config.DefaultOIDCIssuerName, "OIDC issuer name")
2023-08-17 14:14:59 -03:00
}
2023-08-17 19:55:08 -03:00
2023-08-26 11:47:46 -03:00
// InitStorage initializes the storage depending on the config.
func InitStorage(ctx context.Context, cfg *config.Config) storage.Storage { //nolint:ireturn // This function may return multiple types
2023-08-17 19:55:08 -03:00
switch cfg.DBType {
case config.DBTypeMemory:
2023-08-26 11:47:46 -03:00
return sqlitestorage.NewSQLiteStorage(ctx, cfg)
2023-08-22 00:48:12 -03:00
case config.DBTypeSQLite:
2023-08-26 11:47:46 -03:00
return sqlitestorage.NewSQLiteStorage(ctx, cfg)
2023-08-17 19:55:08 -03:00
default:
panic("database type not implemented!")
}
}