package controller import ( 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 ( flowFinalizerName = "flow.zitadel.topmanage.com/flow" ) type wrappedFlowFinalizer struct { client.Client flow *zitadelv1alpha1.Flow refresolver *zitadelv1alpha1.RefResolver } func newWrappedFlowFinalizer(client client.Client, flow *zitadelv1alpha1.Flow, refresolver *zitadelv1alpha1.RefResolver) zitadel.WrappedFinalizer { return &wrappedFlowFinalizer{ Client: client, flow: flow, refresolver: refresolver, } } func (wf *wrappedFlowFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.flow, func(flow *zitadelv1alpha1.Flow) { controllerutil.AddFinalizer(flow, flowFinalizerName) }) } func (wf *wrappedFlowFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.flow, func(flow *zitadelv1alpha1.Flow) { controllerutil.RemoveFinalizer(wf.flow, flowFinalizerName) }) } func (wr *wrappedFlowFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.flow, flowFinalizerName) } func (wf *wrappedFlowFinalizer) Reconcile(ctx context.Context, ztdClient *management.Client) error { org, err := wf.refresolver.OrganizationRef(ctx, &wf.flow.Spec.OrganizationRef, wf.flow.Namespace) if err != nil { return err } _, err = ztdClient.ClearFlow(middleware.SetOrgID(ctx, org.Status.OrgId), &pb.ClearFlowRequest{ Type: wf.flow.Spec.FlowType, }) if err != nil { return err } return nil } func (wr *wrappedFlowFinalizer) patch(ctx context.Context, flow *zitadelv1alpha1.Flow, patchFn func(*zitadelv1alpha1.Flow)) error { patch := ctrlClient.MergeFrom(flow.DeepCopy()) patchFn(flow) if err := wr.Client.Patch(ctx, flow, patch); err != nil { return fmt.Errorf("error patching Flow finalizer: %v", err) } return nil }