func()

in ec/ecresource/organizationresource/update.go [33:101]


func (r *Resource) Update(ctx context.Context, request resource.UpdateRequest, response *resource.UpdateResponse) {
	diagnostics := &response.Diagnostics

	var plan Organization
	var state Organization
	diagnostics.Append(request.Plan.Get(ctx, &plan)...)
	diagnostics.Append(request.State.Get(ctx, &state)...)
	if diagnostics.HasError() {
		return
	}

	organizationID := plan.ID.ValueString()

	planMembers := make(map[string]types.Object)
	diags := plan.Members.ElementsAs(ctx, &planMembers, false)
	if diags.HasError() {
		diagnostics.Append(diags...)
		return
	}
	stateMembers := make(map[string]types.Object)
	diags = state.Members.ElementsAs(ctx, &stateMembers, false)
	if diags.HasError() {
		diagnostics.Append(diags...)
		return
	}

	// Create new members, update changed members
	for email, planMember := range planMembers {
		planMemberModel := toModel(ctx, planMember, diagnostics)
		if diagnostics.HasError() {
			continue
		}

		// create new invitation if member is in plan but not in state
		stateMember, ok := stateMembers[email]
		if !ok {
			r.createInvitation(ctx, email, planMemberModel, organizationID, diagnostics)
		} else {
			// member is in plan and state, update if there is a diff
			if !stateMember.Equal(planMember) {
				stateMemberModel := toModel(ctx, stateMember, diagnostics)
				if diagnostics.HasError() {
					continue
				}
				r.updateMember(ctx, email, stateMemberModel, planMemberModel, organizationID, diagnostics)
			}
		}
	}

	// Delete removed members
	for email, stateMember := range stateMembers {
		_, ok := planMembers[email]
		if !ok {
			// member is in state, but not in plan
			stateMemberModel := toModel(ctx, stateMember, diagnostics)
			if diagnostics.HasError() {
				continue
			}
			r.deleteMember(email, stateMemberModel, organizationID, diagnostics)
		}
	}

	// Re-read the whole org from the API to get the current state
	updatedOrganization := r.readFromApi(ctx, organizationID, diagnostics)
	if diagnostics.HasError() {
		return
	}
	diagnostics.Append(response.State.Set(ctx, *updatedOrganization)...)
}