import "dotenv/config"; import { AppDataSource } from "../src/database/data-source"; import { KeycloakAttributeService } from "../src/services/KeycloakAttributeService"; import * as keycloak from "../src/keycloak/index"; const PROTECTED_USERNAMES = ["super_admin", "admin_issue"]; /** * Main function */ async function main() { const args = process.argv.slice(2); const dryRun = args.includes("--dry-run"); const skipUsernames = [...PROTECTED_USERNAMES]; console.log("=".repeat(60)); console.log("Clear Orphaned Keycloak Users Script"); console.log("=".repeat(60)); console.log(`Mode: ${dryRun ? "DRY-RUN (no changes)" : "LIVE"}`); console.log(`Protected usernames: ${skipUsernames.join(", ")}`); console.log(""); // Initialize database try { await AppDataSource.initialize(); console.log("Database connected"); } catch (error) { console.error("Failed to connect to database:", error); process.exit(1); } // Validate Keycloak connection try { await keycloak.getToken(); console.log("Keycloak connected"); } catch (error) { console.error("Failed to connect to Keycloak:", error); await AppDataSource.destroy(); process.exit(1); } console.log(""); // Run the orphaned user cleanup const service = new KeycloakAttributeService(); const result = await service.clearOrphanedKeycloakUsers(skipUsernames); // Summary console.log(""); console.log("=".repeat(60)); console.log("Summary:"); console.log(` Total users in Keycloak: ${result.totalInKeycloak}`); console.log(` Total users in Database: ${result.totalInDatabase}`); console.log(` Orphaned users: ${result.orphanedCount}`); console.log(` Deleted: ${result.deleted}`); console.log(` Skipped: ${result.skipped}`); console.log(` Failed: ${result.failed}`); console.log("=".repeat(60)); if (result.details.length > 0) { console.log(""); console.log("Details:"); for (const detail of result.details) { const status = detail.action === "deleted" ? "[DELETED]" : detail.action === "skipped" ? "[SKIPPED]" : "[ERROR]"; console.log( ` ${status} ${detail.username} (${detail.keycloakUserId})${detail.error ? ": " + detail.error : ""}`, ); } } // Cleanup await AppDataSource.destroy(); } main().catch(console.error);