1package dns
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/cloudflare/cloudflare-go"
8 "tangled.org/core/appview/config"
9)
10
11type Record struct {
12 Type string
13 Name string
14 Content string
15 TTL int
16 Proxied bool
17}
18
19type Cloudflare struct {
20 api *cloudflare.API
21 zone string
22}
23
24func NewCloudflare(c *config.Config) (*Cloudflare, error) {
25 apiToken := c.Cloudflare.ApiToken
26 api, err := cloudflare.NewWithAPIToken(apiToken)
27 if err != nil {
28 return nil, err
29 }
30 return &Cloudflare{api: api, zone: c.Cloudflare.ZoneId}, nil
31}
32
33func (cf *Cloudflare) CreateDNSRecord(ctx context.Context, record Record) error {
34 _, err := cf.api.CreateDNSRecord(ctx, cloudflare.ZoneIdentifier(cf.zone), cloudflare.CreateDNSRecordParams{
35 Type: record.Type,
36 Name: record.Name,
37 Content: record.Content,
38 TTL: record.TTL,
39 Proxied: &record.Proxied,
40 })
41 if err != nil {
42 return fmt.Errorf("failed to create DNS record: %w", err)
43 }
44 return nil
45}
46
47func (cf *Cloudflare) DeleteDNSRecord(ctx context.Context, recordID string) error {
48 err := cf.api.DeleteDNSRecord(ctx, cloudflare.ZoneIdentifier(cf.zone), recordID)
49 if err != nil {
50 return fmt.Errorf("failed to delete DNS record: %w", err)
51 }
52 return nil
53}