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/audit-user-profiles.ts
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function auditUserProfiles() {
  console.log('šŸ” COMPREHENSIVE USER PROFILE AUDIT');
  console.log('═══════════════════════════════════════════════════════════════\n');

  try {
    // Get all users with complete profile data
    const users = await prisma.user.findMany({
      include: {
        degrees: {
          include: {
            degree: {
              select: {
                id: true,
                degreeNumber: true,
                name: true,
                title: true,
                track: true,
                lodgeLevel: true,
                symbol: true,
                color: true,
                xpRequired: true,
                isSecret: true
              }
            }
          },
          orderBy: {
            degree: {
              degreeNumber: 'asc'
            }
          }
        },
        lodgeMemberships: {
          include: {
            lodge: {
              select: {
                id: true,
                name: true,
                track: true,
                lodgeLevel: true,
                isSecret: true,
                currentMembers: true,
                maximumMembers: true
              }
            }
          }
        },
        badges: {
          include: {
            badge: true
          }
        },
        lawyerRatings: {
          take: 5,
          orderBy: {
            createdAt: 'desc'
          }
        },
        ratings: {
          take: 5,
          orderBy: {
            createdAt: 'desc'
          }
        }
      }
    });

    console.log(`šŸ“Š AUDIT SUMMARY: Found ${users.length} users\n`);

    // Track audit results
    const auditResults = {
      totalUsers: users.length,
      usersWithLawyerDegrees: 0,
      usersWithClientDegrees: 0,
      usersWithBothTracks: 0,
      usersWithLodgeMemberships: 0,
      usersWithNewXpFields: 0,
      usersWithBadges: 0,
      profileIssues: [] as string[],
      missingFeatures: [] as { user: string; completeness: number; issues: string[] }[],
      recommendations: []
    };

    // Detailed user analysis
    for (const user of users) {
      console.log(`\nšŸ‘¤ USER: ${user.email} (${user.role})`);
      console.log('─'.repeat(60));

      // Check basic profile fields
      console.log(`šŸ“‹ Basic Profile:`);
      console.log(`   • Name: ${user.name || 'Missing'}`);
      console.log(`   • Role: ${user.role}`);
      console.log(`   • Level: ${user.level}`);
      console.log(`   • XP Points: ${user.xpPoints}`);
      console.log(`   • Total Badges: ${user.totalBadges}`);

      // Check new client tracking fields
      console.log(`\nšŸ“ˆ Client Activity Tracking:`);
      console.log(`   • Reviews Written: ${user.reviewsWritten}`);
      console.log(`   • Forum Posts: ${user.forumPosts}`);
      console.log(`   • People Helped: ${user.helpedOthers}`);
      console.log(`   • Observation Hours: ${user.observationHours}`);
      console.log(`   • Reform Proposals: ${user.reformProposals}`);
      console.log(`   • Wisdom Score: ${user.wisdomScore}`);
      console.log(`   • Civic Engagement: ${user.civicEngagement}`);

      // Check if new fields are properly initialized
      const hasNewFields = user.reviewsWritten !== undefined && 
                           user.forumPosts !== undefined && 
                           user.helpedOthers !== undefined &&
                           user.observationHours !== undefined &&
                           user.reformProposals !== undefined &&
                           user.wisdomScore !== undefined &&
                           user.civicEngagement !== undefined;

      if (hasNewFields) {
        auditResults.usersWithNewXpFields++;
      } else {
        auditResults.profileIssues.push(`${user.email}: Missing new client tracking fields`);
      }

      // Check lawyer-specific fields
      if (user.role === 'LAWYER' || user.role === 'ADMIN' || user.role === 'SUPERADMIN') {
        console.log(`\nāš–ļø Lawyer Profile Fields:`);
        console.log(`   • Hourly Rate: ${user.hourlyRate || 'Not set'}`);
        console.log(`   • Pro Bono: ${user.proBono ? 'Yes' : 'No'}`);
        console.log(`   • Boldness Rating: ${user.boldnessRating || 'Not rated'}`);
        console.log(`   • Average Rating: ${user.averageRating || 'Not rated'}`);
        console.log(`   • Total Cases: ${user.totalCases}`);
        console.log(`   • Won Cases: ${user.wonCases}`);
        console.log(`   • Is Verified: ${user.isVerified ? 'Yes' : 'No'}`);
      }

      // Check society degrees
      const lawyerDegrees = user.degrees.filter(d => d.degree.track === 'LAWYER');
      const clientDegrees = user.degrees.filter(d => d.degree.track === 'CLIENT');

      console.log(`\nšŸŽ“ Society Degrees (${user.degrees.length} total):`);
      
      if (lawyerDegrees.length > 0) {
        auditResults.usersWithLawyerDegrees++;
        console.log(`   šŸ‘Øā€āš–ļø LAWYER TRACK (${lawyerDegrees.length} degrees):`);
        lawyerDegrees.forEach(ud => {
          console.log(`      • ${ud.degree.symbol} Degree ${ud.degree.degreeNumber}: ${ud.degree.name}`);
          console.log(`        Title: ${ud.degree.title}`);
          console.log(`        Lodge Level: ${ud.degree.lodgeLevel}`);
          console.log(`        Ceremony: ${ud.ceremonyCompleted ? 'āœ… Completed' : 'ā³ Pending'}`);
        });
      }

      if (clientDegrees.length > 0) {
        auditResults.usersWithClientDegrees++;
        console.log(`   šŸ‘„ CLIENT TRACK (${clientDegrees.length} degrees):`);
        clientDegrees.forEach(ud => {
          console.log(`      • ${ud.degree.symbol} Degree ${ud.degree.degreeNumber}: ${ud.degree.name}`);
          console.log(`        Title: ${ud.degree.title}`);
          console.log(`        Lodge Level: ${ud.degree.lodgeLevel}`);
          console.log(`        Ceremony: ${ud.ceremonyCompleted ? 'āœ… Completed' : 'ā³ Pending'}`);
        });
      }

      if (lawyerDegrees.length > 0 && clientDegrees.length > 0) {
        auditResults.usersWithBothTracks++;
      }

      // Check lodge memberships
      console.log(`\nšŸ›ļø Lodge Memberships (${user.lodgeMemberships.length} total):`);
      if (user.lodgeMemberships.length > 0) {
        auditResults.usersWithLodgeMemberships++;
        user.lodgeMemberships.forEach(lm => {
          console.log(`   • ${lm.lodge.name} (${lm.lodge.track} - ${lm.lodge.lodgeLevel})`);
          console.log(`     Role: ${lm.role} | Active: ${lm.isActive ? 'Yes' : 'No'}`);
          console.log(`     Members: ${lm.lodge.currentMembers}${lm.lodge.maximumMembers ? `/${lm.lodge.maximumMembers}` : ''}`);
        });
      } else {
        auditResults.profileIssues.push(`${user.email}: No lodge memberships found`);
      }

      // Check badges
      console.log(`\nšŸ† Badges (${user.badges.length} earned):`);
      if (user.badges.length > 0) {
        auditResults.usersWithBadges++;
        user.badges.forEach(ub => {
          console.log(`   • ${ub.badge.icon} ${ub.badge.name} (${ub.badge.category})`);
        });
      }

      // Check ratings (for lawyers)
      if (user.role === 'LAWYER') {
        console.log(`\n⭐ Rating Activity:`);
        console.log(`   • Ratings Received: ${user.lawyerRatings.length}`);
        console.log(`   • Ratings Given: ${user.ratings.length}`);
      }

      // Profile completeness assessment
      let completenessScore = 0;
      let maxScore = 10;

      if (user.name) completenessScore++;
      if (user.degrees.length > 0) completenessScore += 2;
      if (user.lodgeMemberships.length > 0) completenessScore += 2;
      if (hasNewFields) completenessScore += 2;
      if (user.xpPoints > 0) completenessScore++;
      if (user.level > 1) completenessScore++;
      if (user.badges.length > 0) completenessScore++;

      const completenessPercentage = Math.round((completenessScore / maxScore) * 100);
      console.log(`\nšŸ“Š Profile Completeness: ${completenessPercentage}% (${completenessScore}/${maxScore})`);

      if (completenessPercentage < 70) {
        auditResults.missingFeatures.push({
          user: user.email,
          completeness: completenessPercentage,
          issues: []
        });
      }
    }

    // Generate audit summary
    console.log('\n\nšŸŽÆ DETAILED AUDIT RESULTS');
    console.log('═══════════════════════════════════════════════════════════════');
    console.log(`šŸ“Š USER STATISTICS:`);
    console.log(`   • Total Users: ${auditResults.totalUsers}`);
    console.log(`   • Users with Lawyer Degrees: ${auditResults.usersWithLawyerDegrees}`);
    console.log(`   • Users with Client Degrees: ${auditResults.usersWithClientDegrees}`);
    console.log(`   • Users with Dual-Track Access: ${auditResults.usersWithBothTracks}`);
    console.log(`   • Users with Lodge Memberships: ${auditResults.usersWithLodgeMemberships}`);
    console.log(`   • Users with New XP Fields: ${auditResults.usersWithNewXpFields}`);
    console.log(`   • Users with Badges: ${auditResults.usersWithBadges}`);

    // Calculate percentages
    const lawyerDegreePercentage = Math.round((auditResults.usersWithLawyerDegrees / auditResults.totalUsers) * 100);
    const clientDegreePercentage = Math.round((auditResults.usersWithClientDegrees / auditResults.totalUsers) * 100);
    const lodgePercentage = Math.round((auditResults.usersWithLodgeMemberships / auditResults.totalUsers) * 100);
    const xpFieldsPercentage = Math.round((auditResults.usersWithNewXpFields / auditResults.totalUsers) * 100);

    console.log(`\nšŸ“ˆ COMPLETION RATES:`);
    console.log(`   • Lawyer Track Coverage: ${lawyerDegreePercentage}%`);
    console.log(`   • Client Track Coverage: ${clientDegreePercentage}%`);
    console.log(`   • Lodge Membership Rate: ${lodgePercentage}%`);
    console.log(`   • New Features Integration: ${xpFieldsPercentage}%`);

    // Issues and recommendations
    if (auditResults.profileIssues.length > 0) {
      console.log(`\nāš ļø PROFILE ISSUES FOUND:`);
      auditResults.profileIssues.forEach(issue => {
        console.log(`   • ${issue}`);
      });
    } else {
      console.log(`\nāœ… NO PROFILE ISSUES FOUND!`);
    }

    // Generate recommendations
    console.log(`\nšŸ’” RECOMMENDATIONS:`);
    
    if (xpFieldsPercentage < 100) {
      console.log(`   • Update remaining ${auditResults.totalUsers - auditResults.usersWithNewXpFields} users with new XP tracking fields`);
    }
    
    if (lodgePercentage < 100) {
      console.log(`   • Assign remaining ${auditResults.totalUsers - auditResults.usersWithLodgeMemberships} users to appropriate lodges`);
    }
    
    if (auditResults.usersWithBadges === 0) {
      console.log(`   • Consider creating and awarding initial badges to users`);
    }

    // Overall health score
    const healthMetrics = [
      lawyerDegreePercentage >= 60 ? 1 : 0,  // Reasonable lawyer coverage
      clientDegreePercentage >= 80 ? 1 : 0,  // High client coverage expected
      lodgePercentage >= 90 ? 1 : 0,         // Most users should have lodge membership
      xpFieldsPercentage >= 95 ? 1 : 0,      // New fields should be nearly universal
      auditResults.profileIssues.length === 0 ? 1 : 0  // No critical issues
    ];
    
    const overallHealth = Math.round((healthMetrics.reduce((a, b) => a + b, 0) / healthMetrics.length) * 100);

    console.log(`\nšŸ„ OVERALL SYSTEM HEALTH: ${overallHealth}%`);
    
    if (overallHealth >= 90) {
      console.log(`šŸŽ‰ EXCELLENT! Your user profiles are fully integrated with the new society features.`);
    } else if (overallHealth >= 75) {
      console.log(`āœ… GOOD! Most features are integrated, minor improvements needed.`);
    } else if (overallHealth >= 50) {
      console.log(`āš ļø NEEDS ATTENTION! Several profile features need updates.`);
    } else {
      console.log(`🚨 CRITICAL! Major profile integration issues detected.`);
    }

    // Final status
    console.log(`\nšŸš€ FINAL AUDIT STATUS:`);
    console.log(`   • Database Schema: ${xpFieldsPercentage >= 95 ? 'āœ… Updated' : 'āš ļø Needs Update'}`);
    console.log(`   • User Assignments: ${lodgePercentage >= 90 ? 'āœ… Complete' : 'āš ļø Incomplete'}`);
    console.log(`   • Society Integration: ${(lawyerDegreePercentage + clientDegreePercentage) >= 140 ? 'āœ… Full Coverage' : 'āš ļø Partial Coverage'}`);
    console.log(`   • Feature Availability: ${auditResults.profileIssues.length === 0 ? 'āœ… All Features Available' : 'āš ļø Some Issues Found'}`);

  } catch (error) {
    console.error('āŒ Audit failed:', error);
    throw error;
  } finally {
    await prisma.$disconnect();
  }
}

auditUserProfiles(); 

CasperSecurity Mini