From 619ad0b32077d3a58b238b273a7c7cd67ee57c54 Mon Sep 17 00:00:00 2001 From: twotalesanimation <80506065+twotalesanimation@users.noreply.github.com> Date: Fri, 5 Dec 2025 11:22:38 +0200 Subject: [PATCH] debug: add comprehensive logging to membership linking feature - Added detailed error logging to link_membership_user processor - Added error handling for database operations in processor - Added comprehensive logging to linkSecondaryUserToMembership function - Logs now show: CSRF validation, database operations, link creation, permission grants - Improved error messages for debugging --- run_migrations.php | 107 +++++ src/config/functions.php | 30 +- src/pages/memberships/membership_details.php | 467 ++++++++++--------- src/processors/link_membership_user.php | 47 +- 4 files changed, 414 insertions(+), 237 deletions(-) create mode 100644 run_migrations.php diff --git a/run_migrations.php b/run_migrations.php new file mode 100644 index 00000000..c14a4db9 --- /dev/null +++ b/run_migrations.php @@ -0,0 +1,107 @@ +query("SHOW TABLES LIKE 'membership_links'"); +if ($checkTable->num_rows > 0) { + echo "✓ membership_links table already exists\n"; +} else { + echo "Creating membership_links table...\n"; + + $createLink = $conn->query(" + CREATE TABLE IF NOT EXISTS `membership_links` ( + `link_id` INT AUTO_INCREMENT PRIMARY KEY, + `primary_user_id` INT NOT NULL, + `secondary_user_id` INT NOT NULL, + `relationship` VARCHAR(50) NOT NULL DEFAULT 'spouse', + `linked_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT `fk_membership_links_primary` FOREIGN KEY (`primary_user_id`) + REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_membership_links_secondary` FOREIGN KEY (`secondary_user_id`) + REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, + + INDEX `idx_primary_user` (`primary_user_id`), + INDEX `idx_secondary_user` (`secondary_user_id`), + + UNIQUE KEY `unique_link` (`primary_user_id`, `secondary_user_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci + "); + + if ($createLink) { + echo "✓ membership_links table created successfully\n"; + } else { + echo "✗ Error creating membership_links table: " . $conn->error . "\n"; + } +} + +// Check if membership_permissions table exists +$checkTable = $conn->query("SHOW TABLES LIKE 'membership_permissions'"); +if ($checkTable->num_rows > 0) { + echo "✓ membership_permissions table already exists\n"; +} else { + echo "Creating membership_permissions table...\n"; + + $createPerm = $conn->query(" + CREATE TABLE IF NOT EXISTS `membership_permissions` ( + `permission_id` INT AUTO_INCREMENT PRIMARY KEY, + `link_id` INT NOT NULL, + `permission_name` VARCHAR(100) NOT NULL, + `granted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT `fk_membership_permissions_link` FOREIGN KEY (`link_id`) + REFERENCES `membership_links`(`link_id`) ON DELETE CASCADE ON UPDATE CASCADE, + + INDEX `idx_link` (`link_id`), + + UNIQUE KEY `unique_permission` (`link_id`, `permission_name`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci + "); + + if ($createPerm) { + echo "✓ membership_permissions table created successfully\n"; + } else { + echo "✗ Error creating membership_permissions table: " . $conn->error . "\n"; + } +} + +// Create or replace the view +echo "\nCreating linked_membership_users view...\n"; +$createView = $conn->query(" + CREATE OR REPLACE VIEW `linked_membership_users` AS + SELECT + primary_user_id, + secondary_user_id, + relationship, + linked_at + FROM membership_links + UNION ALL + SELECT + primary_user_id, + primary_user_id as secondary_user_id, + 'primary' as relationship, + linked_at + FROM membership_links +"); + +if ($createView) { + echo "✓ View created successfully\n"; +} else { + echo "✗ Error creating view: " . $conn->error . "\n"; +} + +$conn->close(); +echo "\n✓ Migration completed successfully!\n"; +?> diff --git a/src/config/functions.php b/src/config/functions.php index 60157785..679ebc99 100644 --- a/src/config/functions.php +++ b/src/config/functions.php @@ -2924,17 +2924,25 @@ function linkSecondaryUserToMembership($primary_user_id, $secondary_user_id, $re $conn = openDatabaseConnection(); if ($conn === null) { + error_log("linkSecondaryUserToMembership: Database connection failed"); return ['success' => false, 'message' => 'Database connection failed']; } + error_log("linkSecondaryUserToMembership: primary=$primary_user_id, secondary=$secondary_user_id, relationship=$relationship"); + // Validation: primary and secondary user IDs must be different if ($primary_user_id === $secondary_user_id) { + error_log("linkSecondaryUserToMembership: Cannot link user to themselves"); return ['success' => false, 'message' => 'Cannot link user to themselves']; } // Validation: primary user must have active membership - if (!getUserMemberStatus($primary_user_id)) { + $memberStatus = getUserMemberStatus($primary_user_id); + error_log("linkSecondaryUserToMembership: Primary user member status = " . ($memberStatus ? 'true' : 'false')); + + if (!$memberStatus) { $conn->close(); + error_log("linkSecondaryUserToMembership: Primary user does not have active membership"); return ['success' => false, 'message' => 'Primary user does not have active membership']; } @@ -2947,6 +2955,7 @@ function linkSecondaryUserToMembership($primary_user_id, $secondary_user_id, $re if ($userResult->num_rows === 0) { $conn->close(); + error_log("linkSecondaryUserToMembership: Secondary user does not exist"); return ['success' => false, 'message' => 'Secondary user does not exist']; } @@ -2959,12 +2968,14 @@ function linkSecondaryUserToMembership($primary_user_id, $secondary_user_id, $re if ($existingResult->num_rows > 0) { $conn->close(); + error_log("linkSecondaryUserToMembership: Users are already linked"); return ['success' => false, 'message' => 'Users are already linked']; } try { // Start transaction $conn->begin_transaction(); + error_log("linkSecondaryUserToMembership: Starting transaction"); // Insert link $insertLink = $conn->prepare(" @@ -2972,8 +2983,13 @@ function linkSecondaryUserToMembership($primary_user_id, $secondary_user_id, $re VALUES (?, ?, ?, NOW(), NOW()) "); $insertLink->bind_param("iis", $primary_user_id, $secondary_user_id, $relationship); - $insertLink->execute(); + + if (!$insertLink->execute()) { + throw new Exception("Failed to insert link: " . $insertLink->error); + } + $linkId = $conn->insert_id; + error_log("linkSecondaryUserToMembership: Link created with ID = $linkId"); $insertLink->close(); // Grant default permissions to secondary user @@ -2991,17 +3007,24 @@ function linkSecondaryUserToMembership($primary_user_id, $secondary_user_id, $re VALUES (?, ?, NOW()) "); $insertPerm->bind_param("is", $linkId, $permission); - $insertPerm->execute(); + + if (!$insertPerm->execute()) { + throw new Exception("Failed to insert permission: " . $insertPerm->error); + } + + error_log("linkSecondaryUserToMembership: Permission '$permission' granted"); $insertPerm->close(); } // Commit transaction $conn->commit(); + error_log("linkSecondaryUserToMembership: Transaction committed successfully"); $conn->close(); return ['success' => true, 'message' => 'User successfully linked to membership', 'link_id' => $linkId]; } catch (Exception $e) { + error_log("linkSecondaryUserToMembership: Exception - " . $e->getMessage()); $conn->rollback(); $conn->close(); return ['success' => false, 'message' => 'Failed to create link: ' . $e->getMessage()]; @@ -3157,3 +3180,4 @@ function unlinkSecondaryUser($link_id, $primary_user_id) return ['success' => false, 'message' => 'Failed to remove link: ' . $e->getMessage()]; } } + diff --git a/src/pages/memberships/membership_details.php b/src/pages/memberships/membership_details.php index 85544346..8cc8b853 100644 --- a/src/pages/memberships/membership_details.php +++ b/src/pages/memberships/membership_details.php @@ -217,8 +217,237 @@ if (empty($application['id_number'])) { } ?> + +
Link additional family members or partners to your membership to give them access to member benefits.
@@ -238,7 +467,7 @@ if (empty($application['id_number'])) {- • + •