package controller import ( "strings" zitadelv1alpha1 "github.com/HaimKortovich/zitadel-k8s-operator/api/v1alpha1" "github.com/HaimKortovich/zitadel-k8s-operator/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 ( actionFinalizerName = "action.zitadel.topmanage.com/action" ) type wrappedActionFinalizer struct { client.Client action *zitadelv1alpha1.Action refresolver *zitadelv1alpha1.RefResolver } func newWrappedActionFinalizer(client client.Client, action *zitadelv1alpha1.Action, refresolver *zitadelv1alpha1.RefResolver) zitadel.WrappedFinalizer { return &wrappedActionFinalizer{ Client: client, action: action, refresolver: refresolver, } } func (wf *wrappedActionFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.action, func(action *zitadelv1alpha1.Action) { controllerutil.AddFinalizer(action, actionFinalizerName) }) } func (wf *wrappedActionFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.action, func(action *zitadelv1alpha1.Action) { controllerutil.RemoveFinalizer(wf.action, actionFinalizerName) }) } func (wr *wrappedActionFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.action, actionFinalizerName) } func (wf *wrappedActionFinalizer) Reconcile(ctx context.Context, ztdClient *management.Client) error { if wf.action.Status.ActionId == "" { return nil } org, err := wf.refresolver.OrganizationRef(ctx, &wf.action.Spec.OrganizationRef, wf.action.Namespace) if err != nil { return err } { _, err := ztdClient.GetAction(middleware.SetOrgID(ctx, org.Status.OrgId), &pb.GetActionRequest{Id: wf.action.Status.ActionId}) if err != nil { if strings.Contains(err.Error(), `not found`) { return nil } return err } } _, err = ztdClient.DeleteAction(middleware.SetOrgID(ctx, org.Status.OrgId), &pb.DeleteActionRequest{Id: wf.action.Status.ActionId}) if err != nil { return err } return nil } func (wr *wrappedActionFinalizer) patch(ctx context.Context, action *zitadelv1alpha1.Action, patchFn func(*zitadelv1alpha1.Action)) error { patch := ctrlClient.MergeFrom(action.DeepCopy()) patchFn(action) if err := wr.Client.Patch(ctx, action, patch); err != nil { return fmt.Errorf("error patching Action finalizer: %v", err) } return nil }