diff --git a/inspect_current_state.py b/inspect_current_state.py new file mode 100644 index 0000000..51c73ec --- /dev/null +++ b/inspect_current_state.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +""" +Inspect current database state to understand the duplicate key issue +""" +import os +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker +from dotenv import load_dotenv + +load_dotenv() + +# Use dev server database +DATABASE_URL = "postgresql://postgres:RchhcpaUKZuZuMOvB5kwCP1weLBnAG6tNMXE5FHdk8AwCvolBMALYFVYRM7WCl9x@10.9.23.11:5001/membership_demo" + +engine = create_engine(DATABASE_URL) +Session = sessionmaker(bind=engine) +db = Session() + +print("=" * 80) +print("DATABASE STATE INSPECTION") +print("=" * 80) + +# Check current counts +result = db.execute(text("SELECT COUNT(*) FROM permissions")) +perm_count = result.scalar() +print(f"\nTotal permissions: {perm_count}") + +result = db.execute(text("SELECT COUNT(*) FROM role_permissions")) +rp_count = result.scalar() +print(f"Total role_permissions: {rp_count}") + +if rp_count > 0: + print("\n" + "=" * 80) + print("CURRENT ROLE-PERMISSION MAPPINGS (grouped by role)") + print("=" * 80) + + result = db.execute(text(""" + SELECT + rp.role, + r.name as role_name, + COUNT(*) as permission_count + FROM role_permissions rp + LEFT JOIN roles r ON rp.role_id = r.id + GROUP BY rp.role, r.name + ORDER BY rp.role + """)) + + for row in result.fetchall(): + print(f" {row[0]:15} ({row[1]:20}): {row[2]} permissions") + + print("\n" + "=" * 80) + print("CHECKING FOR DUPLICATES") + print("=" * 80) + + # Check if there are actual duplicates + result = db.execute(text(""" + SELECT role, permission_id, COUNT(*) as count + FROM role_permissions + GROUP BY role, permission_id + HAVING COUNT(*) > 1 + """)) + + duplicates = result.fetchall() + if duplicates: + print(f"\n⚠️ Found {len(duplicates)} duplicate (role, permission_id) pairs:") + for dup in duplicates[:10]: # Show first 10 + print(f" role={dup[0]}, permission_id={dup[1]}, count={dup[2]}") + else: + print("\n✓ No duplicate (role, permission_id) pairs found") + + print("\n" + "=" * 80) + print("CHECKING SPECIFIC ADMIN PERMISSIONS") + print("=" * 80) + + # Check how many admin permissions exist + result = db.execute(text(""" + SELECT COUNT(*) + FROM role_permissions + WHERE role = 'admin' + """)) + admin_count = result.scalar() + print(f"\nAdmin has {admin_count} permission assignments") + + # Check if the specific permission mentioned in error exists + result = db.execute(text(""" + SELECT rp.id, rp.role, p.code, p.name + FROM role_permissions rp + JOIN permissions p ON rp.permission_id = p.id + WHERE rp.role = 'admin' + ORDER BY p.code + LIMIT 20 + """)) + + print("\nFirst 20 admin permissions:") + for row in result.fetchall(): + print(f" {row[1]:10} -> {row[2]:30} ({row[3]})") + +db.close()