T.ME/BIBIL_0DAY
CasperSecurity


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.quebec/public_html/scripts/cleanup-fake-data.js
/**
 * CLEANUP FAKE DATA SCRIPT
 * ========================
 * 
 * Purpose: Remove all fake/demo data from the legal platform database while preserving:
 * - Superadmin user
 * - dannywperez@msn.com user profile
 * - Bordeaux legal case
 * 
 * What it does:
 * 1. Identifies and deletes 29 fake users and all their related data
 * 2. Creates Justin Wee profile with proper ADW Avocats information
 * 3. Creates ADW Avocats business profile
 * 4. Creates 10 team members from ADW Avocats website
 * 5. Creates 57 chat rooms
 * 
 * Usage:
 * node scripts/cleanup-fake-data.js
 * 
 * Dependencies:
 * - Prisma client
 * - Database connection
 * 
 * IMPORTANT: This script permanently deletes data. Run with caution!
 * 
 * Created: 2024-01-27
 * Last Updated: 2024-01-27
 */

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

async function cleanupFakeData() {
  console.log('🧹 Starting cleanup of fake data...\n');

  try {
    // Keep these emails - superadmin and dannywperez@msn.com
    const keepEmails = [
      'superadmin@lmep.ca',
      'dannywperez@msn.com'
    ];

    // Get all users except the ones we want to keep
    const usersToDelete = await prisma.user.findMany({
      where: {
        email: {
          notIn: keepEmails
        }
      },
      select: {
        id: true,
        email: true,
        name: true,
        role: true
      }
    });

    console.log(`Found ${usersToDelete.length} users to delete:`);
    usersToDelete.forEach(user => {
      console.log(`  - ${user.name} (${user.email}) - ${user.role}`);
    });

    if (usersToDelete.length === 0) {
      console.log('No fake users found to delete.');
      return;
    }

    // Delete all related data first (due to foreign key constraints)
    const userIdsToDelete = usersToDelete.map(user => user.id);

    console.log('\n🗑️ Deleting related data...');

    // Delete all records referencing users to be deleted
    await prisma.impersonationSession.deleteMany({ where: { impersonatedUserId: { in: userIdsToDelete } } });
    await prisma.impersonationSession.deleteMany({ where: { originalUserId: { in: userIdsToDelete } } });
    await prisma.lawyerRating.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.lawyerRating.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.transaction.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.financialSummary.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.courseEnrollment.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.mentorSession.deleteMany({ where: { mentorId: { in: userIdsToDelete } } });
    await prisma.mentorSession.deleteMany({ where: { menteeId: { in: userIdsToDelete } } });
    await prisma.userDegree.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.lodgeMembership.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.caseAssignment.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.caseAssignment.deleteMany({ where: { assignedBy: { in: userIdsToDelete } } });
    await prisma.clientLawyerRelationship.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.clientLawyerRelationship.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.clientTestimonial.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.clientTestimonial.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.clientPortal.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.analyticsTracking.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.notification.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.calendarEvent.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.calendarEvent.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.task.deleteMany({ where: { assignedTo: { in: userIdsToDelete } } });
    await prisma.task.deleteMany({ where: { assignedBy: { in: userIdsToDelete } } });
    await prisma.payment.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.paymentRefund.deleteMany({ where: { requestedBy: { in: userIdsToDelete } } });
    await prisma.paymentRefund.deleteMany({ where: { approvedBy: { in: userIdsToDelete } } });
    await prisma.escrowAccount.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.documentCollaboration.deleteMany({ where: { createdBy: { in: userIdsToDelete } } });
    await prisma.documentCollaboration.deleteMany({ where: { assignedTo: { in: userIdsToDelete } } });
    await prisma.caseSupport.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.caseOffer.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.caseOffer.deleteMany({ where: { receiverId: { in: userIdsToDelete } } });
    await prisma.caseOffer.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.consultationBooking.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.consultationBooking.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    await prisma.userBadge.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.userAchievement.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.userSubscription.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.userProfile.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.businessProfile.deleteMany({ where: { ownerId: { in: userIdsToDelete } } });
    await prisma.chatParticipant.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.typingStatus.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.directMessage.deleteMany({ where: { senderId: { in: userIdsToDelete } } });
    await prisma.directMessage.deleteMany({ where: { recipientId: { in: userIdsToDelete } } });
    await prisma.documentVersion.deleteMany({ where: { createdById: { in: userIdsToDelete } } });
    await prisma.documentComment.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.documentPermission.deleteMany({ where: { grantedById: { in: userIdsToDelete } } });
    await prisma.documentPermission.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.calendarEvent.deleteMany({ where: { createdBy: { in: userIdsToDelete } } });
    await prisma.caseUpdate.deleteMany({ where: { createdBy: { in: userIdsToDelete } } });
    await prisma.registration.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.registration.deleteMany({ where: { createdBy: { in: userIdsToDelete } } });
    await prisma.statusNote.deleteMany({ where: { adminId: { in: userIdsToDelete } } });
    await prisma.statusNote.deleteMany({ where: { registrationId: { in: userIdsToDelete } } });
    await prisma.themeProfile.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.session.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.message.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.privateMessage.deleteMany({ where: { senderId: { in: userIdsToDelete } } });
    await prisma.privateChat.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.chatRoom.deleteMany({ where: { createdById: { in: userIdsToDelete } } });
    
    // Add missing deletions
    await prisma.document.deleteMany({ where: { userId: { in: userIdsToDelete } } });
    await prisma.retainerAgreement.deleteMany({ where: { lawyerId: { in: userIdsToDelete } } });
    await prisma.retainerAgreement.deleteMany({ where: { clientId: { in: userIdsToDelete } } });
    
    console.log('✅ Deleted all records referencing users to be deleted');

    // Get all case IDs to be deleted (not Bordeaux)
    const casesToDelete = await prisma.legalCase.findMany({
      where: {
        AND: [
          {
            OR: [
              { primaryLawyerId: { in: userIdsToDelete } },
              { assistantLawyerId: { in: userIdsToDelete } },
              { secretaryId: { in: userIdsToDelete } },
              { createdBy: { in: userIdsToDelete } }
            ]
          },
          {
            NOT: {
              title: { contains: 'Bordeaux' }
            }
          }
        ]
      },
      select: { id: true }
    });
    const caseIdsToDelete = casesToDelete.map(c => c.id);

    // Delete legal cases except Bordeaux case
    await prisma.legalCase.deleteMany({
      where: {
        id: { in: caseIdsToDelete }
      }
    });
    console.log('✅ Deleted legal cases (kept Bordeaux case)');

    // Finally delete the users one by one to identify any remaining constraints
    console.log('\n🗑️ Deleting users one by one...');
    for (const userId of userIdsToDelete) {
      try {
        await prisma.user.delete({
          where: { id: userId }
        });
        console.log(`✅ Deleted user: ${userId}`);
      } catch (error) {
        console.log(`❌ Failed to delete user ${userId}: ${error.message}`);
        // Continue with other users
      }
    }
    console.log('✅ User deletion completed');

    console.log('\n🎉 Fake data cleanup completed!');

    // Now create Justin's profile with proper ADW Avocats information
    console.log('\n👨‍💼 Setting up Justin Wee profile...');

    const justinWee = await prisma.user.create({
      data: {
        email: 'justin.wee@adwavocats.com',
        name: 'Justin Wee',
        password: '$2a$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj/RK.s5u.Ge', // demo123
        role: 'LAWYER',
        username: 'justin-wee',
        title: 'Avocat associé',
        specialization: 'Défense des victimes d\'abus d\'autorité, Violences policières, Actions collectives',
        bio: 'Admis au Barreau en 2016, Me Wee a d\'abord exercé en droit criminel et pénal. Aujourd\'hui, sa pratique se concentre sur la défense des victimes d\'abus d\'autorité, dans des dossiers qui lui ont permis de plaider devant tous les tribunaux du Québec. Il a aussi donné plusieurs conférences traitant de la confidentialité dans le contexte des violences sexuelles. Depuis 2018, il siège au conseil d\'administration du CRIPHASE, un organisme qui vient en aide aux hommes victimes d\'agressions sexuelles.',
        yearsOfExperience: 8,
        education: 'Barreau du Québec (2016)',
        certifications: 'Membre du CRIPHASE',
        officeLocation: '3565, rue Berri, suite 240, Montréal (Québec) H2L 4G3',
        workPhone: '(514) 527-8903',
        websiteUrl: 'https://www.adwavocats.com',
        linkedinUrl: 'https://www.adwavocats.com/a-propos/',
        hourlyRate: 350.0,
        proBono: true,
        boldnessRating: 4.8,
        transparencyRating: 4.9,
        averageRating: 4.85,
        totalCases: 45,
        wonCases: 38,
        lostCases: 7,
        isVerified: true,
        isProfilePublic: true,
        xpPoints: 2800,
        level: 9,
        totalBadges: 12,
        theme: 'light',
        language: 'fr',
        notifications: true,
        isActive: true,
        status: 'ACTIVE'
      }
    });

    console.log('✅ Created Justin Wee profile');

    // Create ADW Avocats business profile
    const adwBusinessProfile = await prisma.businessProfile.create({
      data: {
        businessName: 'ADW Avocats',
        businessType: 'Law Firm',
        industry: 'Legal Services',
        description: 'Nous vous accompagnons face aux litiges civils, aux violences policières, aux agressions sexuelles et aux actions collectives. Notre mission est de redonner un sentiment de justice et d\'aider notre clientèle à reprendre le contrôle face à des situations difficiles.',
        website: 'https://www.adwavocats.com',
        phone: '(514) 527-8903',
        email: 'adw@adwavocats.com',
        address: '3565, rue Berri, suite 240, Montréal (Québec) H2L 4G3',
        employeeCount: '8-15',
        annualRevenue: '$1M-$5M',
        isPublic: true,
        isVerified: true,
        verificationStatus: 'VERIFIED',
        ownerId: justinWee.id
      }
    });

    console.log('✅ Created ADW Avocats business profile');

    // Create ADW Avocats team members based on the website
    const adwTeamMembers = [
      {
        name: 'Alain Arsenault',
        email: 'alain.arsenault@adwavocats.com',
        title: 'Avocat associé',
        specialization: 'Actions collectives, Violences sexuelles, Droits civils',
        bio: 'En 1982, membre de la Ligue des droits et libertés, il a joué un rôle clé dans l\'Enquête sur la discrimination raciale dans l\'industrie du taxi à Montréal. Il a également milité pour l\'abolition du délai de prescription en matière d\'agression sexuelle, abrogé en 2019. Depuis, les actions collectives contre les institutions religieuses permettent aux victimes de retrouver leur dignité et de légitimer leur récit.',
        yearsOfExperience: 42,
        isVerified: true
      },
      {
        name: 'Virginie Dufresne-Lemire',
        email: 'virginie.dufresne-lemire@adwavocats.com',
        title: 'Avocate associée',
        specialization: 'Droit civil, Vulgarisation juridique',
        bio: 'Avant d\'être admise au Barreau en 2014, elle a obtenu des baccalauréats en communication et en droit. En plus de représenter sa clientèle dans des poursuites civiles et autres recours, elle œuvre activement à la vulgarisation des enjeux juridiques complexes à travers les médias. Elle s\'efforce de rendre le système judiciaire plus accessible et compréhensible pour sa clientèle et le grand public.',
        yearsOfExperience: 10,
        isVerified: true
      },
      {
        name: 'Jérôme Aucoin',
        email: 'jerome.aucoin@adwavocats.com',
        title: 'Avocat',
        specialization: 'Relations internationales, Droit international',
        bio: 'Avant de devenir avocat en 2023, Me Aucoin a travaillé comme étudiant en droit et stagiaire au cabinet. Il est également titulaire d\'un baccalauréat en relations internationales et droit international de l\'UQAM et d\'une maîtrise en pensée politique à l\'université d\'Ottawa. Il s\'est impliqué bénévolement par le passé comme intervenant en prévention du suicide sur une ligne d\'appel.',
        yearsOfExperience: 1,
        isVerified: true
      },
      {
        name: 'Audrey Labrecque',
        email: 'audrey.labrecque@adwavocats.com',
        title: 'Avocate',
        specialization: 'Psychologie, Études sur le genre, Justice sociale',
        bio: 'Me Labrecque a été admise au Barreau en 2023. Elle a rejoint notre équipe en tant qu\'étudiante en droit avant d\'effectuer son stage en tant qu\'auxiliaire juridique auprès d\'un juge de la Cour fédérale en 2023. Avant d\'entamer ses études en droit, elle a obtenu un baccalauréat en arts de l\'Université McGill, avec une majeure en psychologie et une mineure en études sur le genre, la sexualité, le féminisme et la justice sociale.',
        yearsOfExperience: 1,
        isVerified: true
      },
      {
        name: 'Ivan Lazarov',
        email: 'ivan.lazarov@adwavocats.com',
        title: 'Avocat',
        specialization: 'Actions collectives, Droit de la famille',
        bio: 'Membre du Barreau depuis 2017, Me Lazarov a commencé sa pratique en droit de la famille et en protection de la jeunesse. Il a également été enquêteur auprès de l\'Ombudsman de l\'Ontario. Il se concentre dans les dossiers d\'actions collectives au sein de notre cabinet.',
        yearsOfExperience: 7,
        isVerified: true
      },
      {
        name: 'Yalda Machouf Khadir',
        email: 'yalda.machouf-khadir@adwavocats.com',
        title: 'Avocate',
        specialization: 'Droit civil, Droit social et du travail',
        bio: 'Me Yalda Machouf-Khadir a entamé son parcours universitaire par un certificat en droit social et du travail à l\'UQAM, avant de compléter son baccalauréat en droit. Membre du Barreau depuis 2019, elle a réorienté sa pratique en 2022 pour se concentrer sur les dossiers civils au sein de notre cabinet. En parallèle de sa carrière, Me Machouf-Khadir s\'implique activement dans sa communauté iranienne.',
        yearsOfExperience: 5,
        isVerified: true
      },
      {
        name: 'Olivia Malenfant',
        email: 'olivia.malenfant@adwavocats.com',
        title: 'Avocate',
        specialization: 'Relations internationales, Droits humains',
        bio: 'Me Malenfant a rejoint notre cabinet en tant qu\'étudiante avant d\'y faire son stage. Titulaire d\'un baccalauréat en relations internationales et droit international, ainsi que d\'un baccalauréat en droit de l\'UQAM, elle est membre du Barreau depuis 2023. En plus des champs de pratique du cabinet, Me Malenfant apporte son expertise à des OBNL.',
        yearsOfExperience: 1,
        isVerified: true
      },
      {
        name: 'Imane Melab',
        email: 'imane.melab@adwavocats.com',
        title: 'Avocate',
        specialization: 'Droit administratif, Droit de l\'emploi',
        bio: 'Avocate depuis 2021, Me Melab détient un baccalauréat en droit de l\'UQAM pendant lequel elle s\'est vu décerner la bourse Juanita Westmorland Traoré pour son implication bénévole à des fins de promotion de la justice sociale au bénéfice des populations défavorisées et racisées. En plus des champs de pratique du cabinet, elle a également acquis une solide expérience en droit administratif et de l\'emploi.',
        yearsOfExperience: 3,
        isVerified: true
      },
      {
        name: 'Justine Monty',
        email: 'justine.monty@adwavocats.com',
        title: 'Avocate',
        specialization: 'Sciences politiques, Études féministes',
        bio: 'Avocate depuis 2023, Me Monty a d\'abord obtenu un baccalauréat en sciences politiques et en études féministes à l\'Université McGill. Elle a ensuite poursuivi ses études à l\'Université de Montréal, où elle a obtenu un baccalauréat en droit. Elle a rejoint le cabinet pour y effectuer son stage du Barreau et fait partie de notre équipe depuis.',
        yearsOfExperience: 1,
        isVerified: true
      },
      {
        name: 'M\'Mah Nora Touré',
        email: 'mmah.nora.toure@adwavocats.com',
        title: 'Avocate',
        specialization: 'Common Law, Droits et libertés',
        bio: 'Avocate depuis 2021, Me Touré est titulaire d\'un baccalauréat en droit et poursuit actuellement un programme de Juris Doctor – Common Law nord-américaine. En 2019, elle a effectué un premier stage au sein de l\'Association du Barreau Canadien avant de rejoindre notre cabinet pour son stage du Barreau. En dehors de sa pratique, Me Touré s\'engage activement au sein de la Ligue des Droits et Libertés.',
        yearsOfExperience: 3,
        isVerified: true
      }
    ];

    const createdTeamMembers = [];
    for (const member of adwTeamMembers) {
      const teamMember = await prisma.user.create({
        data: {
          email: member.email,
          name: member.name,
          password: '$2a$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj/RK.s5u.Ge', // demo123
          role: 'LAWYER',
          username: member.name.toLowerCase().replace(' ', '-').replace("'", ''),
          title: member.title,
          specialization: member.specialization,
          bio: member.bio,
          yearsOfExperience: member.yearsOfExperience,
          isVerified: member.isVerified,
          isProfilePublic: true,
          hourlyRate: 200 + (member.yearsOfExperience * 20) + Math.floor(Math.random() * 100),
          totalCases: member.yearsOfExperience * 10 + Math.floor(Math.random() * 50),
          wonCases: Math.floor((member.yearsOfExperience * 10 + Math.floor(Math.random() * 50)) * 0.8),
          lostCases: Math.floor((member.yearsOfExperience * 10 + Math.floor(Math.random() * 50)) * 0.2),
          averageRating: 4.0 + (Math.random() * 0.8),
          xpPoints: member.yearsOfExperience * 200 + Math.floor(Math.random() * 500),
          level: Math.floor(member.yearsOfExperience / 2) + Math.floor(Math.random() * 10) + 3,
          totalBadges: Math.floor(member.yearsOfExperience / 2) + Math.floor(Math.random() * 8),
          theme: 'light',
          language: 'fr',
          notifications: true,
          isActive: true,
          status: 'ACTIVE',
          workPhone: '(514) 527-8903',
          officeLocation: '3565, rue Berri, suite 240, Montréal (Québec) H2L 4G3',
          websiteUrl: 'https://www.adwavocats.com'
        }
      });
      createdTeamMembers.push(teamMember);
      console.log(`✅ Created ${member.name} (${member.title})`);
    }

    // Add team members to ADW Avocats business profile
    await prisma.businessProfile.update({
      where: { id: adwBusinessProfile.id },
      data: {
        members: {
          connect: createdTeamMembers.map(member => ({ id: member.id }))
        }
      }
    });

    console.log(`✅ Added ${createdTeamMembers.length} team members to ADW Avocats`);

    // Create 57 chat rooms
    console.log('\n💬 Creating 57 chat rooms...');
    const chatRooms = [];
    for (let i = 1; i <= 57; i++) {
      const chatRoom = await prisma.chatRoom.create({
        data: {
          name: `Room ${i}`,
          description: `Chat room ${i}`,
          type: "PUBLIC",
          createdById: justinWee.id
        }
      });
      chatRooms.push(chatRoom);
    }
    console.log(`✅ Created ${chatRooms.length} chat rooms`);

    // Display summary
    const totalUsers = await prisma.user.count();
    const totalLawyers = await prisma.user.count({ where: { role: 'LAWYER' } });
    const totalBusinessProfiles = await prisma.businessProfile.count();
    const totalChatRooms = await prisma.chatRoom.count();

    console.log('\n📊 Summary after cleanup:');
    console.log(`   Total Users: ${totalUsers}`);
    console.log(`   Lawyers: ${totalLawyers}`);
    console.log(`   Business Profiles: ${totalBusinessProfiles}`);
    console.log(`   Chat Rooms: ${totalChatRooms}`);
    console.log('\n✅ Cleanup and setup completed successfully!');

  } catch (error) {
    console.error('Error during cleanup:', error);
  } finally {
    await prisma.$disconnect();
  }
}

cleanupFakeData(); 

CasperSecurity Mini