func()

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...)
}