Files
Termix/src/backend/database/routes/delete-user-data.ts
T

113 lines
4.6 KiB
TypeScript
Raw Normal View History

2026-06-04 15:16:53 -04:00
import { authLogger } from "../../utils/logger.js";
import {
+8
2026-07-19 12:29:52 -05:00
createCurrentAlertRepository,
createCurrentApiKeyRepository,
createCurrentAuditLogRepository,
createCurrentC2sTunnelPresetRepository,
createCurrentCommandHistoryRepository,
createCurrentCredentialRepository,
createCurrentDashboardServiceLinkRepository,
createCurrentDismissedAlertRepository,
createCurrentFileManagerBookmarkRepository,
createCurrentHomepageItemRepository,
createCurrentHomepageLayoutRepository,
createCurrentHostHealthRepository,
createCurrentHostFolderRepository,
createCurrentHostMetricsPreferenceRepository,
createCurrentHostRepository,
createCurrentNetworkTopologyRepository,
createCurrentOpksshTokenRepository,
createCurrentOpenTabRepository,
createCurrentRecentActivityRepository,
createCurrentRbacAccessRepository,
createCurrentRoleRepository,
createCurrentSessionRepository,
createCurrentSessionRecordingRepository,
createCurrentSettingsRepository,
createCurrentSharedHostSecretsRepository,
createCurrentSnippetRepository,
createCurrentSshCredentialUsageRepository,
createCurrentTermixIdentityCaRepository,
createCurrentTermixIdentityRepository,
createCurrentTmuxSessionTagRepository,
createCurrentTrustedDeviceRepository,
createCurrentUserPreferenceRepository,
createCurrentUserRepository,
createCurrentTransferRecentRepository,
createCurrentVaultProfileRepository,
createCurrentVaultTokenRepository,
} from "../repositories/factory.js";
2026-06-04 15:16:53 -04:00
export async function deleteUserAndRelatedData(userId: string): Promise<void> {
try {
+8
2026-07-19 12:29:52 -05:00
await createCurrentSharedHostSecretsRepository().deleteByTargetUserId(
userId,
);
2026-06-04 15:16:53 -04:00
+3
2026-08-06 14:41:39 -05:00
// Retained rather than deleted: these outlive the account by design.
// See anonymizeByUserId on each repository.
await createCurrentSessionRecordingRepository().anonymizeByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentRbacAccessRepository().deleteHostAccessForUserReferences(
userId,
);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentSessionRepository().revokeAllForUser(userId);
await createCurrentApiKeyRepository().deleteByUserId(userId);
await createCurrentTrustedDeviceRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentRoleRepository().removeAllRolesFromUser(userId);
await createCurrentAlertRepository().deleteByUserId(userId);
+3
2026-08-06 14:41:39 -05:00
await createCurrentAuditLogRepository().anonymizeByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentSshCredentialUsageRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentFileManagerBookmarkRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentTransferRecentRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentRecentActivityRepository().deleteByUserId(userId);
await createCurrentDismissedAlertRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentSnippetRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentHostFolderRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentCommandHistoryRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentHostHealthRepository().deleteByUserId(userId);
await createCurrentHostMetricsPreferenceRepository().deleteByUserId(userId);
await createCurrentHostRepository().deleteByUserId(userId);
await createCurrentCredentialRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentNetworkTopologyRepository().deleteByUserId(userId);
await createCurrentDashboardServiceLinkRepository().deleteByUserId(userId);
await createCurrentHomepageItemRepository().deleteByUserId(userId);
await createCurrentHomepageLayoutRepository().deleteByUserId(userId);
await createCurrentC2sTunnelPresetRepository().deleteByUserId(userId);
await createCurrentOpksshTokenRepository().deleteByUserId(userId);
await createCurrentVaultTokenRepository().deleteByUserId(userId);
await createCurrentVaultProfileRepository().deleteByUserId(userId);
await createCurrentTermixIdentityCaRepository().deleteByUserId(userId);
await createCurrentTermixIdentityRepository().deleteByUserId(userId);
await createCurrentTmuxSessionTagRepository().deleteByUserId(userId);
await createCurrentOpenTabRepository().deleteByUserId(userId);
await createCurrentUserPreferenceRepository().deleteByUserId(userId);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentSettingsRepository().deleteLike(`user_%_${userId}`);
2026-06-04 15:16:53 -04:00
+8
2026-07-19 12:29:52 -05:00
await createCurrentUserRepository().delete(userId);
2026-06-04 15:16:53 -04:00
authLogger.success("User and all related data deleted successfully", {
operation: "delete_user_and_related_data_complete",
userId,
});
} catch (error) {
authLogger.error("Failed to delete user and related data", error, {
operation: "delete_user_and_related_data_failed",
userId,
});
throw error;
}
}