freealberta/map/instruct/SHIFT_PERFORMANCE_FIX.md

3.1 KiB
Raw Blame History

Shift Management Performance Fix

Problems Identified

1. Backend Performance Issue (Major)

  • Problem: In shiftsController.getAllAdmin(), the system was making a separate API call to get ALL signups for EVERY shift
  • Impact: With 50 shifts, this meant 50+ database calls, each fetching all signup records
  • Example: Loading 50 shifts with 1000+ signups = 50 API calls × 1000+ records = 50,000+ record reads

2. Frontend Excessive Refreshing

  • Problem: Every volunteer add/remove triggered a full admin shifts reload
  • Impact: Cascade of expensive API calls and unnecessary DOM updates
  • Chain Reaction: Add user → refresh shift data → reload ALL admin shifts → re-render entire list

3. JavaScript Errors

  • Problem: Race conditions and null reference errors due to multiple rapid API calls
  • Impact: Console errors and potential UI instability

Solutions Implemented

1. Backend Optimization

// BEFORE: N queries (one per shift)
for (const shift of shifts.list || []) {
    const signups = await nocodbService.getAllPaginated(shiftSignupsSheetId);
    // Filter for this shift...
}

// AFTER: 1 query total
const allSignups = await nocodbService.getAllPaginated(shiftSignupsSheetId);
const signupsByShift = {}; // Group by shift ID
// Assign to shifts efficiently

2. Frontend Smart Updates

// BEFORE: Full refresh every time
await refreshCurrentShiftData(); // Fetches ALL shifts
displayAdminShifts(data.shifts); // Re-renders entire list

// AFTER: Targeted updates
await refreshCurrentShiftData(); // Still fetches data but...
updateShiftInList(updatedShift); // Only updates the specific shift in DOM

3. Error Prevention

  • Added null checks for currentShiftData.ID
  • Better error handling with try/catch blocks
  • Prevented refresh cascades on modal close

Performance Improvements

Database Calls Reduced

  • Before: 50+ API calls for 50 shifts
  • After: 1 API call total
  • Improvement: ~5000% reduction in database calls

Load Time Expected

  • Before: 6-11 seconds (as seen in logs)
  • After: ~1-2 seconds expected
  • Improvement: ~75% faster load times

UI Responsiveness

  • Eliminated multiple DOM re-renders
  • Reduced server load during volunteer management
  • Fixed JavaScript errors causing console spam

Testing Recommendations

  1. Load Test: Load the Shift Management admin panel with many shifts
  2. Volunteer Management: Add/remove volunteers and verify updates are fast
  3. Console Check: Verify no more null ID errors in browser console
  4. Server Logs: Should see only one "Fetched X total records" per admin shifts load

Files Modified

  1. app/controllers/shiftsController.js - Backend optimization
  2. app/public/js/admin.js - Frontend smart updates and error handling

Monitoring

Watch server logs for:

[info]: Loading all signups once for performance optimization...
[info]: Loaded X total signups from database
[info]: Processed signups for X shifts

Instead of multiple:

[info]: Fetched 50 total records from table XXXXX (repeated many times)