fix(cloudflare): clean up pointing member when zone domain is deleted

This commit is contained in:
ryan
2026-08-29 18:32:02 +08:00
parent 81739f9cb4
commit bbd7f72c2d
9 changed files with 104 additions and 5 deletions
+15
View File
@@ -10,8 +10,10 @@ import (
"strings"
"time"
cf "github.com/Rain-kl/Wavelet/internal/apps/openflare/cloudflare"
"github.com/Rain-kl/Wavelet/internal/model"
"github.com/Rain-kl/Wavelet/internal/repository"
"github.com/Rain-kl/Wavelet/pkg/logger"
"golang.org/x/net/publicsuffix"
"gorm.io/gorm"
)
@@ -220,6 +222,19 @@ func DeleteDomain(ctx context.Context, zoneID, id uint) error {
if item.ProxyRouteID != nil {
return errors.New(errDomainBoundToRoute)
}
member, cfErr := repository.GetCFPointingMemberByZoneDomainID(ctx, item.ID)
if cfErr != nil && !errors.Is(cfErr, gorm.ErrRecordNotFound) {
return cfErr
}
if member != nil {
if delErr := cf.DeleteManagedRecord(ctx, member.ID); delErr != nil {
logger.WarnF(ctx, "[Zone] delete managed Cloudflare record failed for domain %s (member_id=%d): %v", item.Domain, member.ID, delErr)
}
if delMemberErr := repository.DeleteCFPointingMember(ctx, member); delMemberErr != nil {
logger.ErrorF(ctx, "[Zone] delete Cloudflare pointing member failed: member_id=%d error=%v", member.ID, delMemberErr)
return delMemberErr
}
}
return repository.DeleteZoneDomain(ctx, item)
}
+17 -1
View File
@@ -22,7 +22,7 @@ func setupZoneDB(t *testing.T) context.Context {
t.Helper()
conn, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true})
require.NoError(t, err)
require.NoError(t, conn.AutoMigrate(&model.Zone{}, &model.ZoneDomain{}, &model.TLSCertificate{}))
require.NoError(t, conn.AutoMigrate(&model.Zone{}, &model.ZoneDomain{}, &model.TLSCertificate{}, &model.CFPointingGroup{}, &model.CFPointingMember{}))
db.SetDB(conn)
t.Cleanup(func() { db.SetDB(nil) })
return context.Background()
@@ -54,6 +54,22 @@ func TestDeleteDomainRejectsBoundRoute(t *testing.T) {
require.NoError(t, DeleteDomain(ctx, zone.ID, item.ID))
}
func TestDeleteDomainCleansUpCloudflareMember(t *testing.T) {
ctx := setupZoneDB(t)
zone, err := Create(ctx, Input{Domain: "example.com"})
require.NoError(t, err)
domain, err := CreateDomain(ctx, zone.ID, DomainInput{Domain: "api.example.com"})
require.NoError(t, err)
member := model.CFPointingMember{GroupID: 1, ZoneDomainID: domain.ID}
require.NoError(t, repository.CreateCFPointingMember(ctx, &member))
require.NoError(t, DeleteDomain(ctx, zone.ID, domain.ID))
_, err = repository.GetCFPointingMemberByZoneDomainID(ctx, domain.ID)
require.Error(t, err)
}
func TestLegacyImportUsesEffectiveTLDPlusOne(t *testing.T) {
root, err := zoneRoot("api.example.co.uk")
require.NoError(t, err)