![]() 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/public_html/scripts/ |
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
async function setupDetentionFacilityChats() {
console.log('🏢 Setting up official detention establishment group chats...\n');
try {
// Find admin user to be the creator
const adminUser = await prisma.user.findFirst({
where: { role: 'ADMIN' }
});
if (!adminUser) {
console.log('❌ No admin user found. Please create an admin user first.');
return;
}
// Official Quebec Detention Facilities
const detentionFacilities = [
// Montreal Region
{
name: 'Bordeaux (Montréal)',
description: 'Établissement de détention de Bordeaux - Montréal',
facility: 'Bordeaux',
region: 'Montréal',
type: 'DETENTION_CENTER'
},
{
name: 'Rivière-des-Prairies (Montréal)',
description: 'Centre de détention Rivière-des-Prairies - Montréal',
facility: 'Rivière-des-Prairies',
region: 'Montréal',
type: 'DETENTION_CENTER'
},
{
name: 'Leclerc (Laval)',
description: 'Institut Leclerc - Laval',
facility: 'Leclerc',
region: 'Laval',
type: 'FEDERAL_PENITENTIARY'
},
// Quebec City Region
{
name: 'Orsainville (Québec)',
description: 'Établissement de détention de Québec - Orsainville',
facility: 'Orsainville',
region: 'Québec',
type: 'DETENTION_CENTER'
},
{
name: 'Port-Cartier',
description: 'Établissement de Port-Cartier',
facility: 'Port-Cartier',
region: 'Côte-Nord',
type: 'FEDERAL_PENITENTIARY'
},
// Other Major Facilities
{
name: 'Sherbrooke',
description: 'Établissement de détention de Sherbrooke',
facility: 'Sherbrooke',
region: 'Estrie',
type: 'DETENTION_CENTER'
},
{
name: 'Trois-Rivières',
description: 'Établissement de détention de Trois-Rivières',
facility: 'Trois-Rivières',
region: 'Mauricie',
type: 'DETENTION_CENTER'
},
{
name: 'Saint-Jérôme',
description: 'Établissement de détention de Saint-Jérôme',
facility: 'Saint-Jérôme',
region: 'Laurentides',
type: 'DETENTION_CENTER'
},
{
name: 'Hull (Gatineau)',
description: 'Établissement de détention de Hull - Gatineau',
facility: 'Hull',
region: 'Outaouais',
type: 'DETENTION_CENTER'
},
{
name: 'Roberval',
description: 'Établissement de détention de Roberval',
facility: 'Roberval',
region: 'Saguenay-Lac-Saint-Jean',
type: 'DETENTION_CENTER'
},
{
name: 'Rimouski',
description: 'Établissement de détention de Rimouski',
facility: 'Rimouski',
region: 'Bas-Saint-Laurent',
type: 'DETENTION_CENTER'
},
{
name: 'Sorel',
description: 'Établissement de détention de Sorel',
facility: 'Sorel',
region: 'Montérégie',
type: 'DETENTION_CENTER'
},
{
name: 'Saint-Hyacinthe',
description: 'Établissement de détention de Saint-Hyacinthe',
facility: 'Saint-Hyacinthe',
region: 'Montérégie',
type: 'DETENTION_CENTER'
},
{
name: 'Baie-Comeau',
description: 'Établissement de détention de Baie-Comeau',
facility: 'Baie-Comeau',
region: 'Côte-Nord',
type: 'DETENTION_CENTER'
},
{
name: 'Sept-Îles',
description: 'Établissement de détention de Sept-Îles',
facility: 'Sept-Îles',
region: 'Côte-Nord',
type: 'DETENTION_CENTER'
},
// Women's Facilities
{
name: 'Maison Tanguay (Femmes)',
description: 'Maison Tanguay - Établissement pour femmes',
facility: 'Maison Tanguay',
region: 'Montréal',
type: 'WOMENS_FACILITY'
},
{
name: 'Joliette (Femmes Fédéral)',
description: 'Établissement Joliette pour femmes - Fédéral',
facility: 'Joliette',
region: 'Lanaudière',
type: 'FEDERAL_WOMENS'
},
// Youth Facilities
{
name: 'Cité-des-Prairies (Jeunes)',
description: 'Centre jeunesse Cité-des-Prairies',
facility: 'Cité-des-Prairies',
region: 'Montréal',
type: 'YOUTH_CENTER'
}
];
// General support rooms
const supportRooms = [
{
name: 'Aide Juridique Générale',
description: 'Questions juridiques générales et aide légale',
type: 'GROUP',
isPublic: true,
category: 'LEGAL_SUPPORT'
},
{
name: 'Transferts et Transport',
description: 'Informations sur les transferts entre établissements',
type: 'GROUP',
isPublic: true,
category: 'LOGISTICS'
},
{
name: 'Visites Familiales',
description: 'Coordination des visites familiales',
type: 'GROUP',
isPublic: true,
category: 'FAMILY'
},
{
name: 'Libération Conditionnelle',
description: 'Discussions sur la libération conditionnelle',
type: 'GROUP',
isPublic: true,
category: 'RELEASE'
},
{
name: 'Soins Médicaux',
description: 'Questions médicales et soins de santé',
type: 'GROUP',
isPublic: true,
category: 'MEDICAL'
}
];
let createdCount = 0;
let skippedCount = 0;
// Create detention facility rooms
console.log('🏢 Creating detention facility chat rooms...');
for (const facility of detentionFacilities) {
const existingRoom = await prisma.chatRoom.findFirst({
where: { name: facility.name }
});
if (existingRoom) {
console.log(`⏭️ Room "${facility.name}" already exists`);
skippedCount++;
continue;
}
const newRoom = await prisma.chatRoom.create({
data: {
name: facility.name,
description: facility.description,
type: 'GROUP',
isPublic: true,
createdBy: { connect: { id: adminUser.id } },
participants: {
create: {
userId: adminUser.id,
role: 'ADMIN'
}
}
}
});
console.log(`✅ Created "${facility.name}" - ${facility.region}`);
createdCount++;
}
// Create support rooms
console.log('\n🆘 Creating support chat rooms...');
for (const room of supportRooms) {
const existingRoom = await prisma.chatRoom.findFirst({
where: { name: room.name }
});
if (existingRoom) {
console.log(`⏭️ Room "${room.name}" already exists`);
skippedCount++;
continue;
}
const newRoom = await prisma.chatRoom.create({
data: {
name: room.name,
description: room.description,
type: room.type,
isPublic: room.isPublic,
createdBy: { connect: { id: adminUser.id } },
participants: {
create: {
userId: adminUser.id,
role: 'ADMIN'
}
}
}
});
console.log(`✅ Created support room "${room.name}"`);
createdCount++;
}
// Add all users to public rooms
console.log('\n👥 Adding users to public rooms...');
const allUsers = await prisma.user.findMany();
const publicRooms = await prisma.chatRoom.findMany({
where: { isPublic: true },
include: { participants: true }
});
for (const room of publicRooms) {
for (const user of allUsers) {
const isParticipant = room.participants.some(p => p.userId === user.id);
if (!isParticipant) {
await prisma.chatParticipant.create({
data: {
userId: user.id,
chatRoomId: room.id,
role: user.role === 'ADMIN' ? 'ADMIN' : 'MEMBER'
}
});
}
}
}
// Summary
const totalRooms = await prisma.chatRoom.count();
const totalParticipants = await prisma.chatParticipant.count();
console.log('\n📊 SUMMARY:');
console.log(` ✅ Created: ${createdCount} new rooms`);
console.log(` ⏭️ Skipped: ${skippedCount} existing rooms`);
console.log(` 💬 Total chat rooms: ${totalRooms}`);
console.log(` 👥 Total participants: ${totalParticipants}`);
console.log('\n🏢 DETENTION FACILITIES COVERED:');
console.log(' 📍 Montreal Region: Bordeaux, Rivière-des-Prairies, Leclerc');
console.log(' 📍 Quebec Region: Orsainville, Port-Cartier');
console.log(' 📍 Other Regions: Sherbrooke, Trois-Rivières, Saint-Jérôme, Hull');
console.log(' 📍 Remote Areas: Roberval, Rimouski, Baie-Comeau, Sept-Îles');
console.log(' 📍 Women\'s: Maison Tanguay, Joliette Federal');
console.log(' 📍 Youth: Cité-des-Prairies');
console.log('\n🆘 SUPPORT SERVICES:');
console.log(' ⚖️ Legal Aid, Family Visits, Medical Care');
console.log(' 🚐 Transfers, Conditional Release');
console.log('\n✨ All Quebec detention establishments now have dedicated chat rooms!');
} catch (error) {
console.error('❌ Error setting up detention facility chats:', error);
} finally {
await prisma.$disconnect();
}
}
setupDetentionFacilityChats();