Files
mailgoserver/internal/db/crud_dkim.go
T
2026-08-12 12:56:22 +01:00

87 lines
2.9 KiB
Go

package db
type DKIMKeyWithDomain struct {
DKIMKey
DomainName string
}
func (d *DB) ListActiveDKIMKeysWithDomain() ([]DKIMKeyWithDomain, error) {
rows, err := d.Query(`SELECT k.id, k.domain_id, k.selector, k.private_key, k.public_key, k.is_active, k.created_at, k.replaced_at, dm.domain_name
FROM esrv_dkim_keys k JOIN esrv_domains dm ON dm.id = k.domain_id WHERE k.is_active = 1 ORDER BY dm.domain_name`)
if err != nil {
return nil, err
}
defer rows.Close()
return scanDKIMKeysWithDomain(rows)
}
func (d *DB) ListInactiveDKIMKeysWithDomain() ([]DKIMKeyWithDomain, error) {
rows, err := d.Query(`SELECT k.id, k.domain_id, k.selector, k.private_key, k.public_key, k.is_active, k.created_at, k.replaced_at, dm.domain_name
FROM esrv_dkim_keys k JOIN esrv_domains dm ON dm.id = k.domain_id WHERE k.is_active = 0
ORDER BY dm.domain_name, (k.replaced_at IS NULL), k.replaced_at DESC, k.created_at DESC`)
if err != nil {
return nil, err
}
defer rows.Close()
return scanDKIMKeysWithDomain(rows)
}
func scanDKIMKeysWithDomain(rows interface {
Next() bool
Scan(...any) error
Err() error
}) ([]DKIMKeyWithDomain, error) {
var out []DKIMKeyWithDomain
for rows.Next() {
var k DKIMKeyWithDomain
var createdAt string
var replacedAt *string
if err := rows.Scan(&k.ID, &k.DomainID, &k.Selector, &k.PrivateKey, &k.PublicKey, &k.IsActive, &createdAt, &replacedAt, &k.DomainName); err != nil {
return nil, err
}
k.CreatedAt, _ = parseTime(createdAt)
if replacedAt != nil {
t, _ := parseTime(*replacedAt)
k.ReplacedAt = &t
}
out = append(out, k)
}
return out, rows.Err()
}
func (d *DB) CountActiveDKIMKeys() (int, error) {
var n int
err := d.QueryRow(`SELECT COUNT(*) FROM esrv_dkim_keys WHERE is_active = 1`).Scan(&n)
return n, err
}
func (d *DB) DeactivateActiveDKIMKeysForDomain(domainID int64, replacedAt any) error {
_, err := d.Exec(`UPDATE esrv_dkim_keys SET is_active = 0, replaced_at = ? WHERE domain_id = ? AND is_active = 1`, replacedAt, domainID)
return err
}
func (d *DB) SetDKIMKeyActive(id int64, active bool, replacedAt any) error {
if active {
_, err := d.Exec(`UPDATE esrv_dkim_keys SET is_active = 1, replaced_at = NULL WHERE id = ?`, id)
return err
}
_, err := d.Exec(`UPDATE esrv_dkim_keys SET is_active = 0, replaced_at = ? WHERE id = ?`, replacedAt, id)
return err
}
func (d *DB) UpdateDKIMKeySelector(id int64, selector string) error {
_, err := d.Exec(`UPDATE esrv_dkim_keys SET selector = ? WHERE id = ?`, selector, id)
return err
}
func (d *DB) SelectorExistsForDomain(domainID int64, selector string, excludeID int64) (bool, error) {
var n int
err := d.QueryRow(`SELECT COUNT(*) FROM esrv_dkim_keys WHERE domain_id = ? AND selector = ? AND is_active = 1 AND id != ?`, domainID, selector, excludeID).Scan(&n)
return n > 0, err
}
func (d *DB) RemoveDKIMKey(id int64) error {
_, err := d.Exec(`DELETE FROM esrv_dkim_keys WHERE id = ?`, id)
return err
}