feat(server): wire onPeerDeactivated at admin revoke/reset sites
Admin-revoke endpoint (DELETE /api/federation/peers/:id): fires onPeerDeactivated(id, 'admin_revoked') after the status write to 'revoked', evicting any in-flight federated calls for the now-revoked peer. Admin-reset endpoint (POST /api/federation/peers/:id/reset): hook SKIPPED. The reset endpoint is guarded to only run when status is already 'needs_attention' (active peers are rejected at the boundary with a 400). Because the peer was already deactivated before reset is called, onPeerDeactivated was already fired at the active→needs_attention transition. The reset deletes the row entirely rather than writing a new status; it does not represent a transition OUT OF active, so wiring it here would be a semantic error — double-evicting an already-deactivated peer.
This commit is contained in:
@@ -18,7 +18,7 @@ import { sanitizeUser } from '../utils/sanitize.js';
|
|||||||
import { deleteAttachmentFiles, deleteUploadFile } from '../utils/fileCleanup.js';
|
import { deleteAttachmentFiles, deleteUploadFile } from '../utils/fileCleanup.js';
|
||||||
import { tombstoneUser, collectDeletionBroadcastTargets, collectProfileBroadcastTargetIds } from '../utils/userDeletion.js';
|
import { tombstoneUser, collectDeletionBroadcastTargets, collectProfileBroadcastTargetIds } from '../utils/userDeletion.js';
|
||||||
import { computeFederatedId, getDmParticipants, sendCallRelay } from '../utils/federationOutbox.js';
|
import { computeFederatedId, getDmParticipants, sendCallRelay } from '../utils/federationOutbox.js';
|
||||||
import { onPeerActivated } from '../utils/federationPeerActivation.js';
|
import { onPeerActivated, onPeerDeactivated } from '../utils/federationPeerActivation.js';
|
||||||
import { getDmMessageWithUser } from './dm.js';
|
import { getDmMessageWithUser } from './dm.js';
|
||||||
import type { FederationRelayRequest, FederationRelayResponse, FederationRelayEvent, FederationRelayAttachment, FederationSyncRequest, FederationSyncResponse, DmMessageWithUser, DmChannel, FederationRelayProfileSnapshot, FederationIdentityDeleteS2SRequest, FederationProfileUpdatePayload, ServerEvent } from '@backspace/shared';
|
import type { FederationRelayRequest, FederationRelayResponse, FederationRelayEvent, FederationRelayAttachment, FederationSyncRequest, FederationSyncResponse, DmMessageWithUser, DmChannel, FederationRelayProfileSnapshot, FederationIdentityDeleteS2SRequest, FederationProfileUpdatePayload, ServerEvent } from '@backspace/shared';
|
||||||
|
|
||||||
@@ -883,6 +883,10 @@ export async function federationRoutes(app: FastifyInstance): Promise<void> {
|
|||||||
.where(eq(schema.federationPeers.id, id))
|
.where(eq(schema.federationPeers.id, id))
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
|
onPeerDeactivated(id, 'admin_revoked').catch(err =>
|
||||||
|
console.error('[federation] onPeerDeactivated from admin revoke failed:', err),
|
||||||
|
);
|
||||||
|
|
||||||
// Delete all outbox entries for this peer
|
// Delete all outbox entries for this peer
|
||||||
db.delete(schema.federationOutbox)
|
db.delete(schema.federationOutbox)
|
||||||
.where(eq(schema.federationOutbox.peerId, id))
|
.where(eq(schema.federationOutbox.peerId, id))
|
||||||
|
|||||||
Reference in New Issue
Block a user