1.7 KB
dns.go
package digitalocean

import (
	"fmt"
	"strings"

	"github.com/digitalocean/godo"
	"github.com/readysite/readysite/pkg/platform"
)

// CreateDNSZone creates a DNS domain
func (b *backend) CreateDNSZone(domain string) (*platform.DNSZone, error) {
	createReq := &godo.DomainCreateRequest{
		Name: domain,
	}

	d, _, err := b.client.Domains.Create(b.ctx, createReq)
	if err != nil {
		return nil, fmt.Errorf("create domain: %w", err)
	}

	return &platform.DNSZone{
		Name: d.Name,
		TTL:  d.TTL,
	}, nil
}

// GetDNSZone retrieves a DNS domain
func (b *backend) GetDNSZone(domain string) (*platform.DNSZone, error) {
	d, _, err := b.client.Domains.Get(b.ctx, domain)
	if err != nil {
		if strings.Contains(err.Error(), "not found") {
			return nil, platform.ErrNotFound
		}
		return nil, fmt.Errorf("get domain: %w", err)
	}

	return &platform.DNSZone{
		Name: d.Name,
		TTL:  d.TTL,
	}, nil
}

// AddDNSRecord adds a DNS record
func (b *backend) AddDNSRecord(zone string, record platform.DNSRecord) error {
	createReq := &godo.DomainRecordEditRequest{
		Type:     record.Type,
		Name:     record.Name,
		Data:     record.Value,
		TTL:      record.TTL,
		Priority: record.Priority,
	}

	_, _, err := b.client.Domains.CreateRecord(b.ctx, zone, createReq)
	if err != nil {
		return fmt.Errorf("create record: %w", err)
	}
	return nil
}

// DeleteDNSRecord removes a DNS record
func (b *backend) DeleteDNSRecord(zone, recordID string) error {
	var id int
	if _, err := fmt.Sscanf(recordID, "%d", &id); err != nil {
		return fmt.Errorf("invalid record ID %q: %w", recordID, err)
	}

	_, err := b.client.Domains.DeleteRecord(b.ctx, zone, id)
	if err != nil {
		return fmt.Errorf("delete record: %w", err)
	}
	return nil
}
← Back