package controller import ( "strings" zitadelv1alpha1 "gitea.corredorconect.com/software-engineering/zitadel-resources-operator/api/v1alpha1" "gitea.corredorconect.com/software-engineering/zitadel-resources-operator/pkg/controller/core" "context" "fmt" clientv2 "github.com/zitadel/zitadel-go/v3/pkg/client" "github.com/zitadel/zitadel-go/v3/pkg/client/zitadel/application/v2" "sigs.k8s.io/controller-runtime/pkg/client" ctrlClient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) const ( OIDCAppFinalizerName = "oidcapp.zitadel.topmanage.com/oidcapp" ) type wrappedOIDCAppFinalizer struct { client.Client OIDCApp *zitadelv1alpha1.OIDCApp refresolver *zitadelv1alpha1.RefResolver } func newWrappedOIDCAppFinalizer(client client.Client, OIDCApp *zitadelv1alpha1.OIDCApp, refresolver *zitadelv1alpha1.RefResolver) core.WrappedCoreFinalizer { return &wrappedOIDCAppFinalizer{ Client: client, OIDCApp: OIDCApp, refresolver: refresolver, } } func (wf *wrappedOIDCAppFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.OIDCApp, func(OIDCApp *zitadelv1alpha1.OIDCApp) { controllerutil.AddFinalizer(OIDCApp, OIDCAppFinalizerName) }) } func (wf *wrappedOIDCAppFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.OIDCApp, func(OIDCApp *zitadelv1alpha1.OIDCApp) { controllerutil.RemoveFinalizer(wf.OIDCApp, OIDCAppFinalizerName) }) } func (wr *wrappedOIDCAppFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.OIDCApp, OIDCAppFinalizerName) } func (wf *wrappedOIDCAppFinalizer) Reconcile(ctx context.Context, ztdClient *clientv2.Client) error { if wf.OIDCApp.Status.AppId != nil { projectRef, err := wf.OIDCApp.Project(ctx, wf.refresolver) if err != nil { return err } _, err = ztdClient.ApplicationServiceV2().DeleteApplication(ctx, &application.DeleteApplicationRequest{ ApplicationId: *wf.OIDCApp.Status.AppId, ProjectId: projectRef.ID, }) if err != nil { if strings.Contains(err.Error(), "doesn't exist") { return nil } return err } } return nil } func (wr *wrappedOIDCAppFinalizer) patch(ctx context.Context, OIDCApp *zitadelv1alpha1.OIDCApp, patchFn func(*zitadelv1alpha1.OIDCApp)) error { patch := ctrlClient.MergeFrom(OIDCApp.DeepCopy()) patchFn(OIDCApp) if err := wr.Client.Patch(ctx, OIDCApp, patch); err != nil { return fmt.Errorf("error patching OIDCApp finalizer: %v", err) } return nil }