87 lines
2.9 KiB
Go
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
|
|
}
|