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/v2/pkg/client/management" "github.com/zitadel/zitadel-go/v2/pkg/client/middleware" pb "github.com/zitadel/zitadel-go/v2/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 ( APIAppFinalizerName = "apiapp.zitadel.topmanage.com/apiapp" ) type wrappedAPIAppFinalizer struct { client.Client APIApp *zitadelv1alpha1.APIApp refresolver *zitadelv1alpha1.RefResolver } func newWrappedAPIAppFinalizer(client client.Client, APIApp *zitadelv1alpha1.APIApp, refresolver *zitadelv1alpha1.RefResolver) zitadel.WrappedFinalizer { return &wrappedAPIAppFinalizer{ Client: client, APIApp: APIApp, refresolver: refresolver, } } func (wf *wrappedAPIAppFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.APIApp, func(APIApp *zitadelv1alpha1.APIApp) { controllerutil.AddFinalizer(APIApp, APIAppFinalizerName) }) } func (wf *wrappedAPIAppFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.APIApp, func(APIApp *zitadelv1alpha1.APIApp) { controllerutil.RemoveFinalizer(wf.APIApp, APIAppFinalizerName) }) } func (wr *wrappedAPIAppFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.APIApp, APIAppFinalizerName) } func (wf *wrappedAPIAppFinalizer) Reconcile(ctx context.Context, ztdClient *management.Client) error { if wf.APIApp.Status.AppId == "" { return nil } org, err := wf.APIApp.Organization(ctx, wf.refresolver) if err != nil { return err } project, err := wf.APIApp.Project(ctx, wf.refresolver) if err != nil { return err } _, err = ztdClient.RemoveApp(middleware.SetOrgID(ctx, org.Status.OrgId), &pb.RemoveAppRequest{ProjectId: project.Status.ProjectId, AppId: wf.APIApp.Status.AppId}) if err != nil { if strings.Contains(err.Error(), "doesn't exist") { return nil } return err } return nil } func (wr *wrappedAPIAppFinalizer) patch(ctx context.Context, APIApp *zitadelv1alpha1.APIApp, patchFn func(*zitadelv1alpha1.APIApp)) error { patch := ctrlClient.MergeFrom(APIApp.DeepCopy()) patchFn(APIApp) if err := wr.Client.Patch(ctx, APIApp, patch); err != nil { return fmt.Errorf("error patching APIApp finalizer: %v", err) } return nil }