package controller import ( "strings" zitadelv1alpha1 "bitbucket.org/topmanage-software-engineering/zitadel-k8s-operator/src/api/v1alpha1" "bitbucket.org/topmanage-software-engineering/zitadel-k8s-operator/src/pkg/controller/zitadel" "context" "fmt" "github.com/zitadel/zitadel-go/v3/pkg/client/management" "github.com/zitadel/zitadel-go/v3/pkg/client/middleware" pb "github.com/zitadel/zitadel-go/v3/pkg/client/zitadel/management" "sigs.k8s.io/controller-runtime/pkg/client" ctrlClient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) const ( organizationFinalizerName = "organization.zitadel.topmanage.com/organization" ) type wrappedOrganizationFinalizer struct { client.Client organization *zitadelv1alpha1.Organization } func newWrappedOrganizationFinalizer(client client.Client, organization *zitadelv1alpha1.Organization) zitadel.WrappedFinalizer { return &wrappedOrganizationFinalizer{ Client: client, organization: organization, } } func (wf *wrappedOrganizationFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.organization, func(organization *zitadelv1alpha1.Organization) { controllerutil.AddFinalizer(organization, organizationFinalizerName) }) } func (wf *wrappedOrganizationFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.organization, func(organization *zitadelv1alpha1.Organization) { controllerutil.RemoveFinalizer(wf.organization, organizationFinalizerName) }) } func (wr *wrappedOrganizationFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.organization, organizationFinalizerName) } func (wf *wrappedOrganizationFinalizer) Reconcile(ctx context.Context, ztdClient *management.Client) error { if wf.organization.Status.OrgId == "" { return nil } { _, err := ztdClient.GetMyOrg(middleware.SetOrgID(ctx, wf.organization.Status.OrgId), &pb.GetMyOrgRequest{}) if err != nil { if strings.Contains(err.Error(), `Organisation doesn't exist`) { return nil } return err } } _, err := ztdClient.RemoveOrg(middleware.SetOrgID(ctx, wf.organization.Status.OrgId), &pb.RemoveOrgRequest{}) if err != nil { return err } return nil } func (wr *wrappedOrganizationFinalizer) patch(ctx context.Context, organization *zitadelv1alpha1.Organization, patchFn func(*zitadelv1alpha1.Organization)) error { patch := ctrlClient.MergeFrom(organization.DeepCopy()) patchFn(organization) if err := wr.Client.Patch(ctx, organization, patch); err != nil { return fmt.Errorf("error patching Organization finalizer: %v", err) } return nil }