![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/private_html/scripts/ |
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
// Import the permission functions (simplified version for Node.js)
const ROOM_ACCESS_MATRIX = {
'public': {
'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'LAWYER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'SECRETARY': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'CLERK': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'ASSISTANT': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'USER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false }
},
'legal_support': {
'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'LAWYER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'SECRETARY': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'CLERK': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'ASSISTANT': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
'USER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false }
},
'admin': {
'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
'LAWYER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
'SECRETARY': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
'CLERK': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
'ASSISTANT': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
'USER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false }
}
};
const ROOM_TYPE_MAPPING = {
'public': [
'Général', 'General', 'Announcements',
'E.D. d\'Amos', 'E.D. de Rimouski', 'E.D. de Québec – F', 'E.D. de Québec – M',
'E.D. de Baie-Comeau', 'E.D. de Sept-Îles', 'E.D. de Sherbrooke', 'E.D. de New Carlisle',
'E.D. de Percé', 'E.D. de Havre-Aubert', 'E.D. de Hull', 'E.D. de Saint-Jérôme',
'E.L. de Laval', 'E.D. de Trois-Rivières', 'E.D. de Sorel-Tracy', 'E.D. de Montréal (Bordeaux)',
'E.D. de Rivière-des-Prairies', 'E.D. de Roberval', 'Bordeaux (Montréal)', 'Rivière-des-Prairies (Montréal)',
'Leclerc (Laval)', 'Orsainville (Québec) - Hommes', 'Orsainville (Québec) - Femmes',
'Baie-Comeau', 'Sept-Îles', 'Port-Cartier', 'Sherbrooke', 'Trois-Rivières', 'Saint-Jérôme',
'Hull (Gatineau)', 'Roberval', 'Rimouski', 'Sorel-Tracy', 'Saint-Hyacinthe', 'Amos',
'New Carlisle', 'Percé', 'Havre-Aubert (Îles-de-la-Madeleine)', 'Maison Tanguay (Femmes)',
'Joliette (Femmes Fédéral)', 'Cité-des-Prairies (Jeunes)', 'Archambault (Fédéral)',
'Cowansville (Fédéral)', 'Donnacona (Fédéral)', 'La Macaza (Fédéral)', 'Sainte-Anne-des-Plaines (Fédéral)',
'Aide Juridique Générale', 'Transferts et Transport', 'Visites Familiales', 'Libération Conditionnelle',
'Soins Médicaux', 'Support Communautaire', 'Réintégration Sociale'
],
'legal_support': [
'Legal Support'
],
'admin': [
'Admin', 'System', 'Moderation'
]
};
function getRoomAccessType(roomName) {
const normalizedName = roomName.toLowerCase();
for (const [accessType, roomNames] of Object.entries(ROOM_TYPE_MAPPING)) {
if (roomNames.some(name => normalizedName.includes(name.toLowerCase()))) {
return accessType;
}
}
return 'public';
}
function getChatPermissions(userRole, roomName) {
const accessType = getRoomAccessType(roomName);
const rolePermissions = ROOM_ACCESS_MATRIX[accessType];
if (!rolePermissions) {
return ROOM_ACCESS_MATRIX.public[userRole] ||
{ canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false };
}
return rolePermissions[userRole] ||
{ canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false };
}
async function addUsersToRoleBasedRooms() {
try {
console.log('🔄 Adding users to role-based chat rooms...');
// Get all users and rooms
const [users, rooms] = await Promise.all([
prisma.user.findMany({
select: { id: true, name: true, email: true, role: true }
}),
prisma.chatRoom.findMany({
select: { id: true, name: true }
})
]);
console.log(`Found ${users.length} users and ${rooms.length} rooms`);
let totalAdded = 0;
let totalSkipped = 0;
for (const user of users) {
console.log(`\n👤 Processing user: ${user.name} (${user.role})`);
for (const room of rooms) {
const permissions = getChatPermissions(user.role, room.name);
if (permissions.canJoin) {
// Check if user is already a participant
const existingParticipant = await prisma.chatParticipant.findUnique({
where: {
userId_chatRoomId: {
userId: user.id,
chatRoomId: room.id
}
}
});
if (!existingParticipant) {
// Add user to room
await prisma.chatParticipant.create({
data: {
userId: user.id,
chatRoomId: room.id,
role: user.role === 'SUPERADMIN' || user.role === 'ADMIN' ? 'ADMIN' : 'MEMBER'
}
});
console.log(` ✅ Added to: ${room.name}`);
totalAdded++;
} else {
console.log(` ⏭️ Already in: ${room.name}`);
totalSkipped++;
}
} else {
console.log(` ❌ No access to: ${room.name}`);
}
}
}
console.log(`\n🎉 Complete! Added ${totalAdded} participations, skipped ${totalSkipped} existing ones`);
// Show summary by role
console.log('\n📊 Summary by role:');
const roleCounts = {};
users.forEach(u => {
roleCounts[u.role] = (roleCounts[u.role] || 0) + 1;
});
for (const [role, count] of Object.entries(roleCounts)) {
console.log(` ${role}: ${count} users`);
}
} catch (error) {
console.error('❌ Error:', error);
} finally {
await prisma.$disconnect();
}
}
addUsersToRoleBasedRooms();