Skip to content

Latest commit

 

History

History
188 lines (147 loc) · 6.63 KB

File metadata and controls

188 lines (147 loc) · 6.63 KB

Recruiting URL Storage Implementation

Overview

This feature ensures that when a user initializes a season with multiple division selections, subsequent "Refresh Recruit Data" operations will reuse the same URL parameters, maintaining consistency in the data being scraped.

Problem Solved

Previously, when users selected multiple divisions during season initialization (e.g., D-IA + D-II), the refresh operations would only use the team's division, leading to inconsistent data. This implementation stores the user's division preferences and reuses them during refresh operations.

Architecture

Key Components

  1. URL Generation Function: getUrlForSelectedDivisions(selectedDivisions)

    • Creates URLs with multiple divisions: ?divisions=1,2,3&positions=1,2,3,4,5,6,7,8,9,10
    • Sorts divisions for consistent URL generation
    • Handles edge cases (empty array, single division)
  2. Storage Configuration:

    • Uses config key: SEASON_RECRUITING_URL_KEY = 'seasonRecruitingUrl'
    • Stores the base URL (without auto_scrape parameters)
    • Persists across browser sessions
  3. Retrieval Logic:

    • Refresh operations check for stored URL first
    • Falls back to team division if no stored URL exists
    • Comprehensive error handling

Implementation Details

1. Season Initialization Flow

// User selects divisions in modal
const selectedDivisions = ['1', '3']; // D-IA + D-II

// System generates URL
const url = getUrlForSelectedDivisions(selectedDivisions);
// Result: https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=1,3&positions=1,2,3,4,5,6,7,8,9,10

// System stores URL for future use
await recruitStorage.saveConfig(SEASON_RECRUITING_URL_KEY, url);

2. Refresh Operation Flow

// User clicks "Refresh Recruit Data"
if (isRefreshOnly) {
  const storedUrl = await recruitStorage.getConfig(SEASON_RECRUITING_URL_KEY);
  if (storedUrl) {
    // Use stored URL with same divisions as initialization
    url = storedUrl;
    console.log('✓ Using stored recruiting URL for refresh:', url);
  } else {
    // Fallback to team division only
    url = getUrlForDivision(teamInfo?.division);
    console.log('⚠ No stored URL found, using team division fallback');
  }
}

3. Data Cleanup Flow

// When user clears all data
async function clearAllData() {
  // Clear recruits, configs, etc.
  // ...
  
  // Also clear stored recruiting URL
  await recruitStorage.saveConfig(SEASON_RECRUITING_URL_KEY, null);
  console.log('Successfully cleared stored recruiting URL');
}

User Experience

Before Implementation

  1. User initializes season with D-IA + D-II divisions
  2. System scrapes recruits from both divisions
  3. User later clicks "Refresh Recruit Data"
  4. ❌ System only refreshes D-IA recruits (team's division)
  5. ❌ User loses D-II recruits or gets inconsistent data

After Implementation

  1. User initializes season with D-IA + D-II divisions
  2. System scrapes recruits from both divisions
  3. ✅ System stores the multi-division URL
  4. User later clicks "Refresh Recruit Data"
  5. ✅ System refreshes recruits from both D-IA + D-II divisions
  6. ✅ Data remains consistent across refresh operations

Code Changes

Files Modified

  1. background.js:

    • Added SEASON_RECRUITING_URL_KEY constant
    • Modified fetchAndScrapeRecruits handler to store/retrieve URLs
    • Updated clearAllData to clear stored URL
    • Enhanced logging for debugging
  2. sidebar.js (previously implemented):

    • Division checkbox initialization
    • Modal handling for division selection
    • Passing selectedDivisions to background script

Key Functions Added/Modified

  1. getUrlForSelectedDivisions(selectedDivisions):

    function getUrlForSelectedDivisions(selectedDivisions) {
      if (!selectedDivisions || selectedDivisions.length === 0) {
        return 'https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=1&positions=1,2,3,4,5,6,7,8,9,10';
      }
    
      const sortedDivisions = selectedDivisions.sort((a, b) => parseInt(a) - parseInt(b));
      const divisionsParam = sortedDivisions.join(',');
      
      return `https://www.whatifsports.com/gd/recruiting/Advanced.aspx?divisions=${divisionsParam}&positions=1,2,3,4,5,6,7,8,9,10`;
    }
  2. Enhanced fetchAndScrapeRecruits handler:

    • Stores URL during season initialization
    • Retrieves URL during refresh operations
    • Provides fallback behavior

Testing Strategy

Manual Testing Scenarios

  1. Multi-Division Initialization:

    • Initialize season with multiple divisions
    • Verify correct URL is used for scraping
    • Check that URL is stored in config
  2. Refresh with Stored URL:

    • After initialization, perform refresh operation
    • Verify same URL is reused
    • Check console logs for confirmation
  3. Refresh without Stored URL:

    • Clear data or start fresh
    • Perform refresh operation
    • Verify fallback to team division
    • Check warning message in logs
  4. Data Clear Cleanup:

    • Initialize with stored URL
    • Clear all data
    • Verify stored URL is removed

Automated Testing

  • Created test-recruiting-url-storage.html for URL generation logic validation
  • Console-based tests for various division combinations

Logging and Debugging

Console Messages

  • ✓ Stored recruiting URL for future refresh operations: [URL]
  • ✓ Using stored recruiting URL for refresh: [URL]
  • ⚠ No stored URL found, using team division fallback: [DIVISION]
  • Final recruiting URL with parameters: [FULL_URL]

Error Handling

  • Graceful handling of storage failures
  • Automatic fallback to team division on errors
  • Non-blocking error logging

Benefits

  1. Consistency: Refresh operations maintain same division scope as initialization
  2. User Intent Preservation: System remembers user's division preferences
  3. Improved UX: No need to re-select divisions for refresh operations
  4. Reliability: Comprehensive fallback behavior
  5. Maintainability: Clean separation of concerns and error handling

Future Enhancements

  1. UI Indicator: Show which divisions are active in current season
  2. Division Management: Allow users to modify division selection without full re-initialization
  3. URL Validation: Validate stored URLs before use
  4. Analytics: Track division usage patterns
  5. Performance: Cache division-specific recruit counts

Compatibility

  • ✅ Backward Compatible: Works with existing single-division workflows
  • ✅ Forward Compatible: Extensible for future division management features
  • ✅ Cross-Browser: Uses standard web storage APIs
  • ✅ Error Resilient: Graceful degradation on storage failures