takeone/ADMIN_MEMBERS_FIX.md

10 KiB

Admin Members Management - Separate Routes Implementation

Overview

This implementation creates a clean separation between family member management and admin member management by introducing dedicated admin routes. This ensures:

  • /family/* routes are ONLY for actual family members
  • /admin/members/* routes are for admins to manage ALL platform members
  • No confusion between family relationships and admin access

Issues Fixed

1. 404 Error for Non-Family Members (View Profile)

Problem: When clicking on member cards in the admin dashboard (/admin/members), profiles of non-family members returned a 404 error.

Root Cause: The FamilyController@show method required a UserRelationship record between the authenticated user and the member being viewed. Non-family members don't have this relationship, causing firstOrFail() to throw a 404.

Solution: Modified FamilyController@show method to:

  • Check if the authenticated user has the super-admin role
  • Allow super-admins to view any member's profile without requiring a family relationship
  • Create a mock relationship object for admin views to maintain compatibility with the existing view
  • Maintain the existing family relationship check for regular users

2. 404 Error for Non-Family Members (Edit Profile)

Problem: When accessing /family/{id}/edit for non-family members, the page returned a 404 error.

Root Cause: Same as above - the edit method required a family relationship.

Solution: Modified FamilyController@edit method with the same approach as the show method.

3. Update & Delete Permissions

Problem: Super-admins couldn't update or delete non-family members.

Solution:

  • Modified FamilyController@update method to allow super-admins to update any member
  • Modified FamilyController@destroy method to allow super-admins to delete any member
  • Added proper redirects based on user role (admins redirect to admin panel, regular users to family dashboard)
  • Added protection to prevent users from deleting their own account

4. Pixelated Profile Pictures

Problem: Profile pictures in member cards appeared pixelated and low quality.

Solution: Added CSS image rendering optimizations:

  • Added image-rendering: -webkit-optimize-contrast for better image quality
  • Added image-rendering: crisp-edges for sharper rendering
  • Added backface-visibility: hidden to prevent rendering issues
  • Added font smoothing properties for better overall visual quality

New Routes Added

Admin Member Management Routes (routes/web.php)

// All Members Management (Super Admin only)
Route::get('/members/{id}', [PlatformController::class, 'showMember'])->name('platform.members.show');
Route::get('/members/{id}/edit', [PlatformController::class, 'editMember'])->name('platform.members.edit');
Route::put('/members/{id}', [PlatformController::class, 'updateMember'])->name('platform.members.update');
Route::delete('/members/{id}', [PlatformController::class, 'destroyMember'])->name('platform.members.destroy');
Route::post('/members/{id}/upload-picture', [PlatformController::class, 'uploadMemberPicture'])->name('platform.members.upload-picture');
Route::post('/members/{id}/health', [PlatformController::class, 'storeMemberHealth'])->name('platform.members.store-health');
Route::put('/members/{id}/health/{recordId}', [PlatformController::class, 'updateMemberHealth'])->name('platform.members.update-health');
Route::post('/members/{id}/tournament', [PlatformController::class, 'storeMemberTournament'])->name('platform.members.store-tournament');

Family Routes (Unchanged)

Family routes remain restricted to actual family relationships:

Route::get('/family/{id}', [FamilyController::class, 'show'])->name('family.show');
Route::get('/family/{id}/edit', [FamilyController::class, 'edit'])->name('family.edit');
// ... etc

Files Modified

1. routes/web.php

Added: New admin member management routes under /admin/members/* prefix

2. app/Http/Controllers/Admin/PlatformController.php

Added Methods:

  • showMember($id) - Display member profile
  • editMember($id) - Show edit form
  • updateMember(Request $request, $id) - Update member
  • destroyMember($id) - Delete member
  • uploadMemberPicture(Request $request, $id) - Upload profile picture
  • storeMemberHealth(Request $request, $id) - Add health record
  • updateMemberHealth(Request $request, $id, $recordId) - Update health record
  • storeMemberTournament(Request $request, $id) - Add tournament record

All methods create mock relationship objects for view compatibility.

3. app/Http/Controllers/FamilyController.php

Changes in show() method (line 335):

// Check if user is super-admin or viewing their own profile
$isSuperAdmin = $user->hasRole('super-admin');
$isOwnProfile = $user->id == $id;

// Get the member to display
$member = User::findOrFail($id);

// For super-admin or own profile, create a mock relationship
if ($isSuperAdmin || $isOwnProfile) {
    $relationship = (object)[
        'dependent' => $member,
        'relationship_type' => $isOwnProfile ? 'self' : 'admin_view',
        'guardian_user_id' => $user->id,
        'dependent_user_id' => $member->id,
    ];
} else {
    // Regular user - must have family relationship
    $relationship = UserRelationship::where('guardian_user_id', $user->id)
        ->where('dependent_user_id', $id)
        ->with('dependent')
        ->firstOrFail();
}

Changes in edit() method (line 470):

  • Same logic as show() method
  • Creates mock relationship for super-admins
  • Includes is_billing_contact field in mock object

Changes in update() method (line 487):

  • Made relationship_type validation nullable (not required for admin edits)
  • Added super-admin and own profile checks
  • Only updates relationship record if user is not admin and not editing own profile
  • Redirects to admin panel for super-admins, family dashboard for regular users

Changes in destroy() method (line 911):

  • Added super-admin check
  • Added protection against self-deletion
  • Only checks family relationship for non-admin users
  • Redirects to admin panel for super-admins, family dashboard for regular users

Reverted Changes: Removed admin access logic from family controller methods since admin now uses separate routes.

4. resources/views/admin/platform/members.blade.php

Changes:

  1. Updated member card links to use route('admin.platform.members.show') instead of route('family.show')
  2. Added CSS image rendering optimizations for better picture quality

5. resources/views/family/edit.blade.php

Changes: Added conditional routing based on relationship_type:

  • Upload URL: Uses admin route if admin_view, family route otherwise
  • Form action: Uses admin route if admin_view, family route otherwise
  • Cancel button: Redirects to admin panel if admin_view, family dashboard otherwise
  • Delete form: Uses admin route if admin_view, family route otherwise

6. resources/views/family/show.blade.php

Changes: Updated form actions for health and tournament modals to use admin routes when relationship_type === 'admin_view'

Route Structure

Admin Routes (Super Admin Only)

  • View Profile: /admin/members/{id}admin.platform.members.show
  • Edit Profile: /admin/members/{id}/editadmin.platform.members.edit
  • Update Profile: PUT /admin/members/{id}admin.platform.members.update
  • Delete Member: DELETE /admin/members/{id}admin.platform.members.destroy
  • Upload Picture: POST /admin/members/{id}/upload-pictureadmin.platform.members.upload-picture
  • Add Health: POST /admin/members/{id}/healthadmin.platform.members.store-health
  • Update Health: PUT /admin/members/{id}/health/{recordId}admin.platform.members.update-health
  • Add Tournament: POST /admin/members/{id}/tournamentadmin.platform.members.store-tournament

Family Routes (Authenticated Users)

  • View Profile: /family/{id}family.show (requires family relationship)
  • Edit Profile: /family/{id}/editfamily.edit (requires family relationship)
  • Update Profile: PUT /family/{id}family.update (requires family relationship)
  • Delete Member: DELETE /family/{id}family.destroy (requires family relationship)
  • All other family routes remain unchanged

Testing

Admin Access Testing

  1. View Any Member:

    • Log in as super-admin
    • Navigate to /admin/members
    • Click any member card
    • Should load profile at /admin/members/{id}
  2. Edit Any Member:

    • From member profile, click edit
    • Should navigate to /admin/members/{id}/edit
    • Make changes and save
    • Should redirect to /admin/members with success message
  3. Delete Member:

    • From edit page, click "Remove"
    • Confirm deletion
    • Should redirect to /admin/members
    • Verify cannot delete own account
  4. Add Health/Tournament Records:

    • From member profile, use "Add Health Update" or "Add Tournament"
    • Submit forms
    • Should save successfully and reload page

Family Access Testing

  1. View Family Members:

    • Log in as regular user
    • Navigate to /family
    • Click family member card
    • Should load profile at /family/{id}
  2. Cannot Access Non-Family:

    • Try to access /family/{non-family-id}
    • Should return 404 error
  3. Edit Family Members:

    • From family member profile, click edit
    • Should navigate to /family/{id}/edit
    • Make changes and save
    • Should redirect to /family dashboard

Image Quality Testing

  • Check member cards in /admin/members
  • Profile pictures should appear crisp and clear
  • No pixelation on hover or zoom

Security Considerations

  • Super-admin role check ensures only authorized users can view/edit/delete all member profiles
  • Regular users are still restricted to their family members only
  • Self-deletion is prevented for all users
  • All existing authorization checks remain in place

Backward Compatibility

  • All existing functionality for regular users remains unchanged
  • Family relationship checks are still enforced for non-admin users
  • The view templates work seamlessly with both real and mock relationship objects
  • Redirects are context-aware (admin panel vs family dashboard)