93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
import { prisma } from './src/config/database';
|
|
import { keycloakClient } from './src/clients/keycloak.client';
|
|
|
|
async function main() {
|
|
const email = 'abdelaziz.azouhri@gmail.com';
|
|
|
|
console.log(`\n=== Deleting user: ${email} ===`);
|
|
|
|
// Find user
|
|
const user = await prisma.user.findUnique({
|
|
where: { email },
|
|
});
|
|
|
|
if (!user) {
|
|
console.log('❌ User not found in database');
|
|
return;
|
|
}
|
|
|
|
console.log('✅ User found in database:', user.id);
|
|
console.log(' Keycloak ID:', user.keycloakId);
|
|
console.log('Deleting user from Keycloak and database...\n');
|
|
|
|
// FIRST: Delete from Keycloak
|
|
if (user.keycloakId) {
|
|
try {
|
|
await keycloakClient.deleteUser(user.keycloakId);
|
|
console.log('✅ Deleted user from Keycloak');
|
|
} catch (error: any) {
|
|
console.log('⚠️ Failed to delete from Keycloak:', error.message);
|
|
console.log(' Continuing with database deletion...');
|
|
}
|
|
} else {
|
|
console.log('⚠️ No Keycloak ID found, skipping Keycloak deletion');
|
|
}
|
|
|
|
console.log('\nDeleting user data from database...');
|
|
|
|
// Delete in order to respect foreign key constraints
|
|
|
|
// 1. Delete email tokens
|
|
const emailTokens = await prisma.emailToken.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${emailTokens.count} email tokens`);
|
|
|
|
// 2. Delete email logs
|
|
const emailLogs = await prisma.emailLog.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${emailLogs.count} email logs`);
|
|
|
|
// 3. Delete sessions
|
|
const sessions = await prisma.session.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${sessions.count} sessions`);
|
|
|
|
// 4. Delete auth events
|
|
const authEvents = await prisma.authEvent.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${authEvents.count} auth events`);
|
|
|
|
// 5. Delete jobs
|
|
const jobs = await prisma.job.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${jobs.count} jobs`);
|
|
|
|
// 6. Delete subscriptions
|
|
const subscriptions = await prisma.subscription.deleteMany({
|
|
where: { userId: user.id },
|
|
});
|
|
console.log(`✅ Deleted ${subscriptions.count} subscriptions`);
|
|
|
|
// 7. Finally, delete the user
|
|
await prisma.user.delete({
|
|
where: { id: user.id },
|
|
});
|
|
console.log(`✅ Deleted user: ${email}`);
|
|
|
|
console.log('\n🎉 User and all related data deleted successfully!');
|
|
}
|
|
|
|
main()
|
|
.catch((e) => {
|
|
console.error('❌ Error:', e);
|
|
process.exit(1);
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|