From d7c2edb1dfa31d7f8f0d432b8f38378b0123e456 Mon Sep 17 00:00:00 2001 From: nexxo Date: Sat, 25 Jul 2026 13:08:13 +0200 Subject: [PATCH] fix(engine-b): idempotent local DNS record (firstOrCreate on record_id) Co-Authored-By: Claude Opus 4.8 --- .../Steps/Customer/ConfigureDnsAndTls.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Provisioning/Steps/Customer/ConfigureDnsAndTls.php b/app/Provisioning/Steps/Customer/ConfigureDnsAndTls.php index f64d4d0..f60d699 100644 --- a/app/Provisioning/Steps/Customer/ConfigureDnsAndTls.php +++ b/app/Provisioning/Steps/Customer/ConfigureDnsAndTls.php @@ -31,13 +31,14 @@ class ConfigureDnsAndTls extends CustomerStep $host = $instance->host; $fqdn = $instance->subdomain.'.'.config('provisioning.dns.zone'); - // DNS — persist the record id [E] before anything downstream. + // DNS — provider upsert is idempotent; the local row uses firstOrCreate on + // the record id and is written BEFORE the breadcrumb (the short-circuit guard). if (! $this->hasResource($run, 'dns_record_id')) { $recordId = $this->dns->upsertRecord($fqdn, 'A', $host->public_ip); - $instance->dnsRecords()->create([ - 'provider' => 'hetzner', 'record_id' => $recordId, - 'fqdn' => $fqdn, 'type' => 'A', 'value' => $host->public_ip, - ]); + $instance->dnsRecords()->firstOrCreate( + ['record_id' => $recordId], + ['provider' => 'hetzner', 'fqdn' => $fqdn, 'type' => 'A', 'value' => $host->public_ip], + ); $this->recordResource($run, $host, 'dns_record_id', $recordId); }