feat: broadcast member_left and user_updated on admin deletion
This commit is contained in:
@@ -5,7 +5,7 @@ import { authenticate, requireAdmin, hashPassword } from '../utils/auth.js';
|
|||||||
import { getStorageStats, getOrphanedFiles, cleanupStorage, cleanupOldMedia } from '../utils/storageJanitor.js';
|
import { getStorageStats, getOrphanedFiles, cleanupStorage, cleanupOldMedia } from '../utils/storageJanitor.js';
|
||||||
import { getDb, schema } from '../db/index.js';
|
import { getDb, schema } from '../db/index.js';
|
||||||
import { connectionManager } from '../ws/handler.js';
|
import { connectionManager } from '../ws/handler.js';
|
||||||
import { tombstoneUser } from '../utils/userDeletion.js';
|
import { tombstoneUser, collectDeletionBroadcastTargets } from '../utils/userDeletion.js';
|
||||||
import { deleteUploadFile } from '../utils/fileCleanup.js';
|
import { deleteUploadFile } from '../utils/fileCleanup.js';
|
||||||
import { sanitizeUser } from '../utils/sanitize.js';
|
import { sanitizeUser } from '../utils/sanitize.js';
|
||||||
import type { AdminUser, AdminUserListResponse, AdminResetPasswordResponse } from '@backspace/shared';
|
import type { AdminUser, AdminUserListResponse, AdminResetPasswordResponse } from '@backspace/shared';
|
||||||
@@ -297,11 +297,33 @@ export async function adminRoutes(app: FastifyInstance): Promise<void> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Collect broadcast targets BEFORE tombstone deletes DB rows
|
||||||
|
const { memberSpaceIds, targetUserIds } = collectDeletionBroadcastTargets(targetId);
|
||||||
|
|
||||||
const filesToDelete = tombstoneUser(targetId);
|
const filesToDelete = tombstoneUser(targetId);
|
||||||
for (const filename of filesToDelete) {
|
for (const filename of filesToDelete) {
|
||||||
deleteUploadFile(filename);
|
deleteUploadFile(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Broadcast member_left to each space
|
||||||
|
for (const spaceId of memberSpaceIds) {
|
||||||
|
connectionManager.sendToSpace(spaceId, {
|
||||||
|
type: 'member_left',
|
||||||
|
spaceId,
|
||||||
|
userId: targetId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Broadcast user_updated with sanitized deleted user data
|
||||||
|
const deletedRow = getDb().select().from(schema.users).where(eq(schema.users.id, targetId)).get();
|
||||||
|
if (deletedRow) {
|
||||||
|
const deletedUser = sanitizeUser(deletedRow);
|
||||||
|
const userUpdatedEvent = { type: 'user_updated' as const, user: deletedUser };
|
||||||
|
for (const uid of targetUserIds) {
|
||||||
|
connectionManager.sendToUser(uid, userUpdatedEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
connectionManager.forceDisconnectUser(targetId);
|
connectionManager.forceDisconnectUser(targetId);
|
||||||
|
|
||||||
return reply.code(200).send({ success: true });
|
return reply.code(200).send({ success: true });
|
||||||
|
|||||||
Reference in New Issue
Block a user