in teamcity/user_role_assignment.go [95:205]
func (r *userRoleAssignmentResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
var plan userRoleAssignmentResourceModel
diags := req.Plan.Get(ctx, &plan)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
// Validate that either user_id or username is specified
if plan.UserId.IsNull() && plan.Username.IsNull() {
resp.Diagnostics.AddError(
"Invalid configuration",
"Either 'user_id' or 'username' must be specified",
)
return
}
// Get user to obtain ID if username was provided
var user *client.User
var err error
var userId string
if !plan.Username.IsNull() {
user, err = r.client.GetUserByName(plan.Username.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Error getting user",
err.Error(),
)
return
}
if user == nil {
resp.Diagnostics.AddError(
"User not found",
"User with username '"+plan.Username.ValueString()+"' not found",
)
return
}
userId = strconv.FormatInt(*user.Id, 10)
} else {
userId = plan.UserId.ValueString()
// Verify user exists
user, err = r.client.GetUser(userId)
if err != nil {
resp.Diagnostics.AddError(
"Error getting user",
err.Error(),
)
return
}
if user == nil {
resp.Diagnostics.AddError(
"User not found",
"User with ID '"+userId+"' not found",
)
return
}
}
// Determine scope
scope := "g" // default to global
if !plan.Scope.IsNull() {
scope = plan.Scope.ValueString()
}
// Build updated user with new role
updatedUser := client.User{
Id: user.Id,
Username: user.Username,
}
// Copy existing roles and add new one
updatedUser.Roles = &client.RoleAssignments{
RoleAssignment: []client.RoleAssignment{},
}
// Copy existing roles
if user.Roles != nil {
for _, role := range user.Roles.RoleAssignment {
updatedUser.Roles.RoleAssignment = append(updatedUser.Roles.RoleAssignment, role)
}
}
// Add new role
updatedUser.Roles.RoleAssignment = append(updatedUser.Roles.RoleAssignment, client.RoleAssignment{
Id: plan.RoleId.ValueString(),
Scope: scope,
})
// Update user
_, err = r.client.SetUser(updatedUser)
if err != nil {
resp.Diagnostics.AddError(
"Error assigning role to user",
err.Error(),
)
return
}
// Set state
state := userRoleAssignmentResourceModel{
Id: types.StringValue(fmt.Sprintf("%s_%s_%s", userId, plan.RoleId.ValueString(), scope)),
UserId: types.StringValue(userId),
Username: types.StringValue(user.Username),
RoleId: plan.RoleId,
Scope: types.StringValue(scope),
}
diags = resp.State.Set(ctx, state)
resp.Diagnostics.Append(diags...)
}