diff --git a/Makefile b/Makefile index 658a677..380e0b8 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,4 @@ run_usersUpdateLoginMethod: - go run cmd/main.go -c usersUpdateLoginMethod \ No newline at end of file + go run cmd/main.go -c usersUpdateLoginMethod +help: + go run cmd/main.go -c help \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index fc16869..643061b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -25,7 +25,8 @@ func main() { config.MustLoad(confPath) if commandName == "" { - l.Log.Fatal().Msg("flag '-c' required") + l.Log.Error().Msg("flag '-c' required") + return } logger.MustInit() @@ -36,12 +37,13 @@ func main() { l.Log.Warn().Err(e.ErrCommandNotFound).Str("command", commandName).Send() l.Log.Info().Msg("selected command - 'help'") if err := command.Scripts["help"].Exec(); err != nil { - l.Log.Fatal().Err(err).Str("command", commandName).Msg("failed to use help command") + l.Log.Error().Err(err).Str("command", commandName).Msg("failed to use help command") + return } return } - l.Log.Info().Msgf("selected command - %s", commandName) + l.Log.Info().Str("selected command", commandName).Send() if err := cmd.Exec(); err != nil { l.Log.Error().Err(err).Str("command", commandName).Msg("failed to execude command") return diff --git a/internal/command/email_pass_to_oidc/dto.go b/internal/command/email_pass_to_oidc/dto.go index d49315a..7d87e18 100644 --- a/internal/command/email_pass_to_oidc/dto.go +++ b/internal/command/email_pass_to_oidc/dto.go @@ -18,15 +18,15 @@ type KeycloakTokenResponse struct { } type LoopUser struct { - Id string `json:"id" db:"id"` - Username string `json:"username" db:"username"` - Password string `json:"password,omitempty" db:"password"` - AuthData *string `json:"auth_data,omitempty" db:"authdata"` - AuthService *string `json:"auth_service" db:"authservice"` - Email string `json:"email" db:"email"` - EmailVerified bool `json:"email_verified,omitempty" db:"emailverified"` - Nickname string `json:"nickname" db:"nickname"` - FirstName string `json:"first_name" db:"firstname"` - LastName string `json:"last_name" db:"lastname"` - Roles string `json:"roles" db:"roles"` + Id string `json:"id" db:"id"` + Username string `json:"username" db:"username"` + Password string `json:"password,omitempty" db:"password"` + AuthData *string `json:"auth_data,omitempty" db:"authdata"` + AuthService *string `json:"auth_service" db:"authservice"` + Email string `json:"email" db:"email"` + EmailVerified bool `json:"email_verified,omitempty" db:"emailverified"` + Nickname string `json:"nickname" db:"nickname"` + FirstName string `json:"first_name" db:"firstname"` + LastName string `json:"last_name" db:"lastname"` + Roles string `json:"roles" db:"roles"` } diff --git a/internal/command/email_pass_to_oidc/exec.go b/internal/command/email_pass_to_oidc/exec.go index 27cc0d4..d60a143 100644 --- a/internal/command/email_pass_to_oidc/exec.go +++ b/internal/command/email_pass_to_oidc/exec.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "net/url" c "scripts/internal/config" l "scripts/pkg/logger" "scripts/pkg/postgres" @@ -13,7 +14,10 @@ import ( const Name = "usersUpdateLoginMethod" func UsersUpdateLoginMethod() error { - postgres.InitDB() + if err := postgres.InitDB(); err != nil { + l.Log.Error().Err(err).Msg("failed to init postgres") + return err + } defer postgres.DB.Close() tokenData, err := keycloakAccessToken() @@ -48,12 +52,19 @@ func UsersUpdateLoginMethod() error { } func keycloakAccessToken() (*KeycloakTokenResponse, error) { - url := fmt.Sprintf("%s/realms/%s/protocol/openid-connect/token", c.Conf.KeycloakSettings.Address, "master") + const path = "/realms/master/protocol/openid-connect/token" + + endpoint, err := url.Parse(c.Conf.KeycloakSettings.Address) + if err != nil { + l.Log.Error().Err(err).Msg("failed to create url") + return nil, err + } + endpoint.Path = path var data bytes.Buffer fmt.Fprintf(&data, "grant_type=password&client_id=admin-cli&username=%s&password=%s", c.Conf.KeycloakSettings.AdminName, c.Conf.KeycloakSettings.AdminPass) - req, err := http.NewRequest("POST", url, &data) + req, err := http.NewRequest("POST", endpoint.String(), &data) if err != nil { l.Log.Error().Err(err).Msg("failed to create http request") return nil, err @@ -100,9 +111,16 @@ func allLoopUsers() (map[string]LoopUser, error) { } func allKeycloakUsers(accessToken string) ([]KeycloakUser, error) { - url := fmt.Sprintf("%s/admin/realms/%s/users", c.Conf.KeycloakSettings.Address, c.Conf.KeycloakSettings.RealmName) + var path = fmt.Sprintf("/admin/realms/%s/users", c.Conf.KeycloakSettings.RealmName) - req, err := http.NewRequest("GET", url, nil) + endpoint, err := url.Parse(c.Conf.KeycloakSettings.Address) + if err != nil { + l.Log.Error().Err(err).Msg("failed to create url") + return nil, err + } + endpoint.Path = path + + req, err := http.NewRequest("GET", endpoint.String(), nil) if err != nil { l.Log.Error().Err(err).Msg("failed to create http request") return nil, err diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 727df8e..e85db9d 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -34,7 +34,7 @@ func MustInit() { if c.Conf.LogSettings.EnableCaller { zCtx = zCtx.Caller() } - + Log = zCtx.Logger() } diff --git a/pkg/postgres/connect.go b/pkg/postgres/connect.go index 530a03c..6db0e50 100644 --- a/pkg/postgres/connect.go +++ b/pkg/postgres/connect.go @@ -2,6 +2,7 @@ package postgres import ( "context" + "fmt" c "scripts/internal/config" l "scripts/pkg/logger" "time" @@ -33,7 +34,7 @@ func WithContext(ctx context.Context) Option { } } -func InitDB(opts ...Option) { +func InitDB(opts ...Option) error { p := &Postgres{ ctx: context.Background(), } @@ -44,7 +45,8 @@ func InitDB(opts ...Option) { db, err := sqlx.ConnectContext(p.ctx, c.Conf.SqlSettings.DriverName, c.Conf.SqlSettings.DataSource) if err != nil { - l.Log.Fatal().Err(err).Msg("failed to connect DB") + l.Log.Error().Err(err).Msg("failed to connect DB") + return fmt.Errorf("failed to connect DB: %w", err) } db.SetMaxIdleConns(c.Conf.SqlSettings.MaxIdleConns) @@ -53,16 +55,19 @@ func InitDB(opts ...Option) { db.SetConnMaxIdleTime(time.Duration(c.Conf.SqlSettings.ConnMaxIdleTimeMilliseconds) * time.Millisecond) if err := db.Ping(); err != nil { - l.Log.Fatal().Err(err).Msg("failed to ping DB") + l.Log.Error().Err(err).Msg("failed to ping DB") + return fmt.Errorf("failed to ping DB: %w", err) } p.conn = db DB = p l.Log.Info().Msg("connect to postgres successfully ") + return nil } func (p *Postgres) Close() { if err := p.Conn().Close(); err != nil { l.Log.Error().Err(err).Msg("failed to close connect DB") + return } }