internal/db/dkim.go (view raw)
1package db
2
3import (
4 "context"
5 "database/sql"
6 "strings"
7 "time"
8
9 "postern/internal/model"
10)
11
12// GetDKIMForDomain deterministically returns the first enabled selector for the given domain
13func (db *DB) GetDKIMForDomain(ctx context.Context, domain string) (model.DKIM, error) {
14 row := db.read.QueryRowContext(
15 ctx,
16 `SELECT id, selector, blob_address, key_type FROM dkim WHERE domain = ? AND enabled = 1 ORDER BY selector LIMIT 1`, domain)
17 var d model.DKIM
18 err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType)
19 return d, err
20}
21
22func (db *DB) GetDKIMForSelectorDomain(ctx context.Context, selector, domain string) (model.DKIM, error) {
23 domain = strings.TrimSuffix(domain, ".")
24 row := db.read.QueryRowContext(
25 ctx,
26 `SELECT id, selector, blob_address, key_type, enabled FROM dkim WHERE domain = ? AND selector = ?`, domain, selector)
27 if row.Err() != nil {
28 return model.DKIM{}, row.Err()
29 }
30
31 var d model.DKIM
32 var enabledToggle int
33 err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle)
34 if err != nil {
35 return model.DKIM{}, err
36 }
37 if enabledToggle == 1 {
38 d.Enabled = true
39 }
40 return d, nil
41}
42
43func (db *DB) ListDKIM(ctx context.Context) ([]model.DKIM, error) {
44 rows, err := db.read.QueryContext(
45 ctx,
46 `SELECT id, domain, selector, blob_address, key_type, enabled FROM dkim ORDER BY domain, selector, key_type, enabled DESC`)
47 if err != nil {
48 return nil, err
49 }
50 defer func(rows *sql.Rows) {
51 _ = rows.Close()
52 }(rows)
53
54 out := make([]model.DKIM, 0)
55 for rows.Next() {
56 var d model.DKIM
57 var enabledToggle int
58 err = rows.Scan(&d.ID, &d.Domain, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle)
59 if err != nil {
60 return nil, err
61 }
62 if enabledToggle == 1 {
63 d.Enabled = true
64 }
65 out = append(out, d)
66 }
67 return out, nil
68}
69
70func (db *DB) SetDKIMEnabled(ctx context.Context, selector, domain string, enabled bool) error {
71 enableToggle := 0
72 if enabled {
73 enableToggle = 1
74 }
75 _, err := db.write.ExecContext(
76 ctx,
77 `UPDATE dkim SET enabled = ? WHERE domain = ? AND selector = ?`, enableToggle, domain, selector)
78 return err
79}
80
81func (db *DB) InsertDKIMForDomain(ctx context.Context, d model.DKIM) error {
82 _, err := db.write.ExecContext(
83 ctx, `
84INSERT INTO dkim (domain, selector, blob_address, key_type, created_at, enabled)
85VALUES (?, ?, ?, ?, ?, ?)`, d.Domain, d.Selector, d.BlobAddress, d.KeyType, time.Now().Unix(), d.Enabled)
86 return err
87}
88
89func RemoveDKIM(ctx context.Context, tx *sql.Tx, selector, domain string) error {
90 domain = strings.TrimSuffix(domain, ".")
91 _, err := tx.ExecContext(ctx, `DELETE FROM dkim WHERE domain = ? AND selector = ?`, domain, selector)
92 return err
93}