package main import ( "context" "flag" "log" "time" "entgo.io/ent/dialect" "git.gorlug.de/code/ersteller/starter/ent" "git.gorlug.de/code/ersteller/starter/ent/user" "git.gorlug.de/code/ersteller/starter/env" "golang.org/x/crypto/bcrypt" ) // This CLI creates a new user with email and password, or changes an existing user's password. func main() { email := flag.String("email", "", "User email (required)") password := flag.String("password", "", "User password (required)") changePassword := flag.Bool("change-password", false, "Change password for existing user") flag.Parse() if *email == "" || *password == "" { log.Fatal("Both -email and -password flags are required") } environment := env.LoadEnvironment() // Open mediator database client dbClient, err := ent.Open(dialect.SQLite, environment.DatabaseUrl, ent.Log(log.Println), ent.Debug()) if err != nil { log.Fatalf("failed opening mediator DB: %v", err) } defer dbClient.Close() ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Hash the password hashedPassword, err := bcrypt.GenerateFromPassword([]byte(*password), bcrypt.DefaultCost) if err != nil { log.Fatalf("failed to hash password: %v", err) } if *changePassword { // Change password for existing user u, err := dbClient.User. Query(). Where(user.EmailEQ(*email)). Only(ctx) if err != nil { log.Fatalf("failed to find user with email %s: %v", *email, err) } u, err = u. Update(). SetPasswordHash(string(hashedPassword)). Save(ctx) if err != nil { log.Fatalf("failed to update password: %v", err) } log.Printf("Successfully changed password for user: ID=%d, Email=%s\n", u.ID, u.Email) } else { // Create the user u, err := dbClient.User. Create(). SetEmail(*email). SetPasswordHash(string(hashedPassword)). Save(ctx) if err != nil { log.Fatalf("failed to create user: %v", err) } log.Printf("Successfully created user: ID=%d, Email=%s\n", u.ID, u.Email) } }