diff --git a/provider.go b/provider.go index 78497f9..a269e19 100644 --- a/provider.go +++ b/provider.go @@ -22,6 +22,9 @@ type Provider struct { Context string `json:"context"` Primary string `json:"primary"` HttpClient *http.Client `json:"-"` + // Optional fields to skip zone lookup if already known + Zone *string `json:"origin,omitempty"` + Nameserver *string `json:"nameserver,omitempty"` } // NewWithDefaults is a convenience method to create the provider with sensible defaults. @@ -39,12 +42,12 @@ func NewWithDefaults(username, password string) *Provider { func (p *Provider) GetRecords(ctx context.Context, zone string) ([]libdns.Record, error) { var records []libdns.Record - zoneInfo, err := p.checkZone(ctx, zone) + origin, nameserver, err := p.getZoneInfo(ctx, zone) if err != nil { return nil, err } - result, err := p.getZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, zone) + result, err := p.getZone(ctx, origin, nameserver, zone) if err != nil { return nil, err } @@ -63,12 +66,12 @@ func (p *Provider) GetRecords(ctx context.Context, zone string) ([]libdns.Record // AppendRecords adds records to the zone. It returns the records that were added. func (p *Provider) AppendRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) { - zoneInfo, err := p.checkZone(ctx, zone) + origin, nameserver, err := p.getZoneInfo(ctx, zone) if err != nil { return nil, err } - result, err := p.getZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, zone) + result, err := p.getZone(ctx, origin, nameserver, zone) if err != nil { return nil, err } @@ -81,7 +84,7 @@ func (p *Provider) AppendRecords(ctx context.Context, zone string, records []lib result.Data[0].Records = append(result.Data[0].Records, zoneRecord) } - if err := p.updateZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, result.Data[0]); err != nil { + if err := p.updateZone(ctx, origin, nameserver, result.Data[0]); err != nil { return nil, err } @@ -91,12 +94,12 @@ func (p *Provider) AppendRecords(ctx context.Context, zone string, records []lib // SetRecords sets the records in the zone, either by updating existing records or creating new ones. // It returns the updated records. func (p *Provider) SetRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) { - zoneInfo, err := p.checkZone(ctx, zone) + origin, nameserver, err := p.getZoneInfo(ctx, zone) if err != nil { return nil, err } - result, err := p.getZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, zone) + result, err := p.getZone(ctx, origin, nameserver, zone) if err != nil { return nil, err } @@ -126,7 +129,7 @@ func (p *Provider) SetRecords(ctx context.Context, zone string, records []libdns set = append(set, r) } - if err := p.updateZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, result.Data[0]); err != nil { + if err := p.updateZone(ctx, origin, nameserver, result.Data[0]); err != nil { return nil, err } @@ -135,12 +138,12 @@ func (p *Provider) SetRecords(ctx context.Context, zone string, records []libdns // DeleteRecords deletes the records from the zone. It returns the records that were deleted. func (p *Provider) DeleteRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) { - zoneInfo, err := p.checkZone(ctx, zone) + origin, nameserver, err := p.getZoneInfo(ctx, zone) if err != nil { return nil, err } - result, err := p.getZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, zone) + result, err := p.getZone(ctx, origin, nameserver, zone) if err != nil { return nil, err } @@ -168,7 +171,7 @@ func (p *Provider) DeleteRecords(ctx context.Context, zone string, records []lib deleted = append(deleted, r) } - if err := p.updateZone(ctx, zoneInfo.Origin, zoneInfo.Nameserver, result.Data[0]); err != nil { + if err := p.updateZone(ctx, origin, nameserver, result.Data[0]); err != nil { if _, ok := err.(*AutoDNSError); ok { return nil, err } diff --git a/sdk.go b/sdk.go index 0fe2668..f2cfb4c 100644 --- a/sdk.go +++ b/sdk.go @@ -7,6 +7,24 @@ import ( "strings" ) +// getZoneInfo returns the origin and nameserver needed for API calls. +// If Zone and Nameserver are set on the provider, it uses those. +// Otherwise, it performs a zone lookup via checkZone. +func (p *Provider) getZoneInfo(ctx context.Context, zone string) (origin, nameserver string, err error) { + // Use configured values if both are provided + if p.Zone != nil && p.Nameserver != nil { + return *p.Zone, *p.Nameserver, nil + } + + // Otherwise, perform lookup + zoneInfo, err := p.checkZone(ctx, zone) + if err != nil { + return "", "", err + } + + return zoneInfo.Origin, zoneInfo.Nameserver, nil +} + // checkZone servers as a check if the zone exists and returns the required data // (origin and nameserver to retrieve the actual zone). func (p *Provider) checkZone(ctx context.Context, zone string) (*ResponseSearchItem, error) {