Files
LambdaMail/services/protocols/internal/infrastructure/postgres/domain_repository.go
T
Lucas RayanandClaude Opus 5 2b369ab373 fix(dns): o botao de reconciliar nao criava registo nenhum
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>
2026-08-23 15:52:27 -03:00

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()
}