package db import ( "context" "database/sql" "strings" "time" "postern/internal/model" ) // GetDKIMForDomain deterministically returns the first enabled selector for the given domain func (db *DB) GetDKIMForDomain(ctx context.Context, domain string) (model.DKIM, error) { row := db.read.QueryRowContext( ctx, `SELECT id, selector, blob_address, key_type FROM dkim WHERE domain = ? AND enabled = 1 ORDER BY selector LIMIT 1`, domain) var d model.DKIM err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType) return d, err } func (db *DB) GetDKIMForSelectorDomain(ctx context.Context, selector, domain string) (model.DKIM, error) { domain = strings.TrimSuffix(domain, ".") row := db.read.QueryRowContext( ctx, `SELECT id, selector, blob_address, key_type, enabled FROM dkim WHERE domain = ? AND selector = ?`, domain, selector) if row.Err() != nil { return model.DKIM{}, row.Err() } var d model.DKIM var enabledToggle int err := row.Scan(&d.ID, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle) if err != nil { return model.DKIM{}, err } if enabledToggle == 1 { d.Enabled = true } return d, nil } func (db *DB) ListDKIM(ctx context.Context) ([]model.DKIM, error) { rows, err := db.read.QueryContext( ctx, `SELECT id, domain, selector, blob_address, key_type, enabled FROM dkim ORDER BY domain, selector, key_type, enabled DESC`) if err != nil { return nil, err } defer func(rows *sql.Rows) { _ = rows.Close() }(rows) out := make([]model.DKIM, 0) for rows.Next() { var d model.DKIM var enabledToggle int err = rows.Scan(&d.ID, &d.Domain, &d.Selector, &d.BlobAddress, &d.KeyType, &enabledToggle) if err != nil { return nil, err } if enabledToggle == 1 { d.Enabled = true } out = append(out, d) } return out, nil } func (db *DB) SetDKIMEnabled(ctx context.Context, selector, domain string, enabled bool) error { enableToggle := 0 if enabled { enableToggle = 1 } _, err := db.write.ExecContext( ctx, `UPDATE dkim SET enabled = ? WHERE domain = ? AND selector = ?`, enableToggle, domain, selector) return err } func (db *DB) InsertDKIMForDomain(ctx context.Context, d model.DKIM) error { _, err := db.write.ExecContext( ctx, ` INSERT INTO dkim (domain, selector, blob_address, key_type, created_at, enabled) VALUES (?, ?, ?, ?, ?, ?)`, d.Domain, d.Selector, d.BlobAddress, d.KeyType, time.Now().Unix(), d.Enabled) return err } func RemoveDKIM(ctx context.Context, tx *sql.Tx, selector, domain string) error { domain = strings.TrimSuffix(domain, ".") _, err := tx.ExecContext(ctx, `DELETE FROM dkim WHERE domain = ? AND selector = ?`, domain, selector) return err }