From 2285cf8db877f6e040171e82da0d3d4ee81e9dc3 Mon Sep 17 00:00:00 2001 From: Matthias Drews Date: Wed, 21 May 2025 10:57:10 +0000 Subject: [PATCH] feat: update user without deletion --- mongodb/config.go | 21 ++++++++++++++++----- mongodb/resource_db_user.go | 24 ++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/mongodb/config.go b/mongodb/config.go index 790c109..a64e9e8 100644 --- a/mongodb/config.go +++ b/mongodb/config.go @@ -189,15 +189,26 @@ func (resource Resource) String() string { } func createUser(client *mongo.Client, user DbUser, roles []Role, database string) error { + return writeUser(client, user, roles, database, "createUser") +} + +func updateUser(client *mongo.Client, user DbUser, roles []Role, database string) error { + return writeUser(client, user, roles, database, "updateUser") +} + +func writeUser(client *mongo.Client, user DbUser, roles []Role, database string, command string) error { var result *mongo.SingleResult + var args = bson.D{} + args = append(args, bson.E{Key: command, Value: user.Name}) + if user.Password != "" { + args = append(args, bson.E{Key: "pwd", Value: user.Password}) + } if len(roles) != 0 { - result = client.Database(database).RunCommand(context.Background(), bson.D{{Key: "createUser", Value: user.Name}, - {Key: "pwd", Value: user.Password}, {Key: "roles", Value: roles}}) + args = append(args, bson.E{Key: "roles", Value: roles}) } else { - result = client.Database(database).RunCommand(context.Background(), bson.D{{Key: "createUser", Value: user.Name}, - {Key: "pwd", Value: user.Password}, {Key: "roles", Value: []bson.M{}}}) + args = append(args, bson.E{Key: "roles", Value: []bson.M{}}) } - + result = client.Database(database).RunCommand(context.Background(), args) if result.Err() != nil { return result.Err() } diff --git a/mongodb/resource_db_user.go b/mongodb/resource_db_user.go index f30af11..527461c 100644 --- a/mongodb/resource_db_user.go +++ b/mongodb/resource_db_user.go @@ -99,30 +99,22 @@ func resourceDatabaseUserUpdate(ctx context.Context, data *schema.ResourceData, var database = data.Get("auth_database").(string) var userPassword = data.Get("password").(string) - adminDB := client.Database(database) - - result := adminDB.RunCommand(context.Background(), bson.D{{Key: "dropUser", Value: userName}}) - if result.Err() != nil { - return diag.Errorf("%s", result.Err()) - } var roleList []Role - var user = DbUser{ - Name: userName, - Password: userPassword, - } roles := data.Get("role").(*schema.Set).List() roleMapErr := mapstructure.Decode(roles, &roleList) if roleMapErr != nil { return diag.Errorf("Error decoding map : %s ", roleMapErr) } - err2 := createUser(client, user, roleList, database) - if err2 != nil { - return diag.Errorf("Could not create the user : %s ", err2) + + var user = DbUser{ + Name: userName, + Password: userPassword, } - newId := database + "." + userName - encoded := base64.StdEncoding.EncodeToString([]byte(newId)) - data.SetId(encoded) + err := updateUser(client, user, roleList, database) + if err != nil { + return diag.Errorf("Could not update the user : %s ", err) + } return resourceDatabaseUserRead(ctx, data, i) }