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