![]() 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.ca/public_html/scripts/ |
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();