O painel listava os registos em falta e oferecia um botao para os criar, mas esse botao chegava a um endpoint que so escrevia uma linha de auditoria e respondia "REQUESTED". Nunca tocou no DNS. Quem tinha o token da Cloudflare era o servico de protocolos, e a unica coisa capaz de o usar corria num temporizador -- para um dominio so, o de MAIL_DOMAIN. Por isso um dominio adicionado pela consola, como o cienciaembarcada.com.br, nunca era reconciliado: os registos nao apareciam e o unico sintoma visivel era a consola dizer que faltavam, para sempre. - POST /api/v1/admin/dns/reconcile publica os registos de um dominio, agora, e devolve o que foi criado, corrigido e o que ficou em conflito - o temporizador passa a percorrer todos os dominios ativos - conflitos sao reportados, nao resolvidos: um registo do mesmo tipo e nome com outro valor pode ser correio da zona ou um servico de que ninguem se lembra, e nao e deste servidor decidir sobrepo-lo - o erro do fornecedor fica no log, nao na resposta: pode nomear a conta ou a zona Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
// DomainRepository lists the domains this server is responsible for.
|
|
type DomainRepository struct {
|
|
pool *pgxpool.Pool
|
|
}
|
|
|
|
func NewDomainRepository(pool *pgxpool.Pool) *DomainRepository {
|
|
return &DomainRepository{pool: pool}
|
|
}
|
|
|
|
// ActiveDomainNames returns every active domain.
|
|
//
|
|
// The DNS reconciler used to run against MAIL_DOMAIN alone, so a domain added
|
|
// through the console was never reconciled: its records simply never appeared,
|
|
// and the only visible symptom was the console reporting them missing forever.
|
|
func (r *DomainRepository) ActiveDomainNames(ctx context.Context) ([]string, error) {
|
|
rows, err := r.pool.Query(ctx, `
|
|
SELECT name FROM domains WHERE is_active ORDER BY name
|
|
`)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("list active domains: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
out := []string{}
|
|
for rows.Next() {
|
|
var name string
|
|
if err := rows.Scan(&name); err != nil {
|
|
return nil, err
|
|
}
|
|
out = append(out, name)
|
|
}
|
|
return out, rows.Err()
|
|
}
|