package repository import ( "context" "encoding/json" "errors" "strings" "time" "evobgp/internal/store" "github.com/jackc/pgx/v5" ) func (p *Postgres) GetDomainResolveCache(fqdn string) (*store.DomainResolveCacheEntry, bool, error) { key := strings.ToLower(strings.TrimSpace(fqdn)) if key == "" { return nil, false, nil } ctx := context.Background() var raw []byte var resolvedAt time.Time err := p.pool.QueryRow(ctx, ` SELECT addrs_json, resolved_at FROM domain_resolve_cache WHERE fqdn = $1`, key). Scan(&raw, &resolvedAt) if err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, false, nil } return nil, false, err } var addrs []string if len(raw) > 0 { _ = json.Unmarshal(raw, &addrs) } return &store.DomainResolveCacheEntry{ FQDN: key, Addrs: addrs, ResolvedAt: resolvedAt.UTC(), }, true, nil } func (p *Postgres) SetDomainResolveCache(fqdn string, addrs []string) error { key := strings.ToLower(strings.TrimSpace(fqdn)) if key == "" { return store.ErrInvalidInput } if addrs == nil { addrs = []string{} } raw, err := json.Marshal(addrs) if err != nil { return err } ctx := context.Background() _, err = p.pool.Exec(ctx, ` INSERT INTO domain_resolve_cache (fqdn, addrs_json, resolved_at) VALUES ($1, $2::jsonb, now()) ON CONFLICT (fqdn) DO UPDATE SET addrs_json = EXCLUDED.addrs_json, resolved_at = EXCLUDED.resolved_at`, key, string(raw)) return err }