fix: address code review findings (C1, I1, I2)
- C1: Include 'unreachable' peers in queueOutboxEvent query to prevent UNIQUE constraint violation when creating placeholders - I1: Add 'rejected' to StatusFilter in FederationPanel so admins can see and manage rejected peers with delete/re-initiate actions - I2: Map ensurePeered 'failed' to 'pending' in peer/ensure response to match spec and client expectations
This commit is contained in:
@@ -517,9 +517,9 @@ export async function federationRoutes(app: FastifyInstance): Promise<void> {
|
||||
case 'rejected':
|
||||
return reply.code(200).send({ peeringStatus: 'rejected', error: result.error });
|
||||
case 'failed':
|
||||
return reply.code(200).send({ peeringStatus: 'failed', error: result.error });
|
||||
return reply.code(200).send({ peeringStatus: 'pending', error: result.error });
|
||||
default:
|
||||
return reply.code(200).send({ peeringStatus: 'failed', error: 'Unknown peering result' });
|
||||
return reply.code(200).send({ peeringStatus: 'pending', error: 'Unknown peering result' });
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -138,7 +138,7 @@ export function queueOutboxEvent(
|
||||
.select()
|
||||
.from(schema.federationPeers)
|
||||
.where(
|
||||
inArray(schema.federationPeers.status, ['active', 'pending']),
|
||||
inArray(schema.federationPeers.status, ['active', 'pending', 'unreachable']),
|
||||
)
|
||||
.all();
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ function peerStatusLabel(status: string): string {
|
||||
|
||||
type PeerView = 'active' | 'revoked';
|
||||
type SortBy = 'name' | 'lastSeen' | 'dateAdded' | 'failures';
|
||||
type StatusFilter = 'active' | 'unreachable' | 'pending';
|
||||
type StatusFilter = 'active' | 'unreachable' | 'pending' | 'rejected';
|
||||
|
||||
// ─── Filter Dropdown ─────────────────────────────────────────────────────────
|
||||
|
||||
@@ -263,7 +263,7 @@ function FilterDropdown({
|
||||
{view === 'active' && (
|
||||
<>
|
||||
<div className="text-[10px] font-semibold text-txt-tertiary uppercase tracking-wider px-2 py-1">Status</div>
|
||||
{(['active', 'unreachable', 'pending'] as StatusFilter[]).map((s) => (
|
||||
{(['active', 'unreachable', 'pending', 'rejected'] as StatusFilter[]).map((s) => (
|
||||
<button
|
||||
key={s}
|
||||
type="button"
|
||||
@@ -392,7 +392,7 @@ function PeerRow({ peer, view, expanded, onToggleExpand, onAction, defaultAutoRo
|
||||
const addToast = useUIStore((s) => s.addToast);
|
||||
|
||||
const name = peer.instanceName || new URL(peer.origin).host;
|
||||
const isRevoked = view === 'revoked';
|
||||
const isRevoked = view === 'revoked' || peer.status === 'rejected';
|
||||
const isDefault = peer.autoRotateIntervalDays === defaultAutoRotateIntervalDays;
|
||||
|
||||
const handleSaveInterval = async () => {
|
||||
@@ -588,7 +588,7 @@ export function FederationPanel() {
|
||||
const [peersLoading, setPeersLoading] = useState(false);
|
||||
const [peersError, setPeersError] = useState('');
|
||||
const [view, setView] = useState<PeerView>('active');
|
||||
const [statusFilter, setStatusFilter] = useState<Set<StatusFilter>>(new Set(['active', 'unreachable', 'pending']));
|
||||
const [statusFilter, setStatusFilter] = useState<Set<StatusFilter>>(new Set(['active', 'unreachable', 'pending', 'rejected']));
|
||||
const [sortBy, setSortBy] = useState<SortBy>('name');
|
||||
const [expandedPeerId, setExpandedPeerId] = useState<string | null>(null);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user