4.8 KiB
API Response Structure Fix
🚨 Issue Summary
The frontend was not receiving the correct data from backend API endpoints because the backend uses ResponseBuilder.create_success_response() which wraps the actual data in a nested structure, but the frontend API methods were returning the entire response instead of extracting the data.
🔍 Root Cause Analysis
Backend Response Structure
The backend uses ResponseBuilder.create_success_response() which creates responses like:
{
"status": "success",
"message": "Operation completed successfully",
"data": {
"user_id": 1,
"strategy": { ... }, // Actual data is nested here
"completed_at": "...",
"strategy_id": 71
},
"status_code": 200,
"timestamp": "..."
}
Frontend API Issue
The frontend API methods were returning response.data directly, which included the entire response structure instead of just the actual data.
🛠️ Solution Implemented
1. Fixed getLatestGeneratedStrategy
Updated to extract strategy data from nested structure:
// Before: Returning entire response
return response.data;
// After: Extracting strategy data
const result = response.data?.data?.strategy;
return result;
2. Fixed All Strategy-Related API Methods
Updated all strategy-related methods to handle nested response structure:
// Content Strategy APIs
async getStrategies(userId?: number) {
const response = await apiClient.get(`${this.baseURL}/enhanced-strategies`, { params });
return response.data?.data || response.data;
}
// Enhanced Strategy APIs
async getEnhancedStrategies(userId?: number): Promise<any> {
const response = await apiClient.get(`${this.baseURL}/enhanced-strategies`, { params });
return response.data?.data || response.data;
}
// Calendar Event APIs
async getEvents(userId?: number, filters?: any) {
const response = await apiClient.get(`${this.baseURL}/calendar-events/`, { params });
return response.data?.data || response.data;
}
// Gap Analysis APIs
async getGapAnalyses(userId?: number) {
const response = await apiClient.get(`${this.baseURL}/gap-analysis/`, { params });
return response.data?.data || response.data;
}
3. Updated Hook Logic
Updated useStrategyData.ts to handle the corrected data structure:
if (latestStrategyResponse && latestStrategyResponse.strategic_insights) {
// Now receiving the actual strategy data directly
const transformedStrategy = transformPollingStrategyData(latestStrategyResponse);
setStrategyData(transformedStrategy);
}
📊 Expected Results
Before Fix:
- ❌ API Methods: Returning entire response structure
- ❌ Transformation: Receiving wrong data structure
- ❌ Components: Showing "data not available"
- ❌ Data Flow: Broken from API to components
After Fix:
- ✅ API Methods: Extracting actual data from nested structure
- ✅ Transformation: Receiving correct strategy data
- ✅ Components: Displaying rich AI-generated data
- ✅ Data Flow: Complete from API to components
🔧 Files Modified
-
frontend/src/services/contentPlanningApi.ts- Fixed
getLatestGeneratedStrategyto extract strategy data - Updated all strategy-related API methods
- Updated calendar event API methods
- Updated gap analysis API methods
- Updated enhanced strategy API methods
- Updated onboarding data API methods
- Fixed
-
frontend/src/components/ContentPlanningDashboard/components/StrategyIntelligence/hooks/useStrategyData.ts- Updated to handle corrected API response structure
- Simplified logic since API now returns actual data
🎯 Testing
To verify the fix:
- Generate a new strategy using the polling system
- Navigate to the Content Strategy tab
- Check browser console for API response logs
- Verify that all Strategic Intelligence cards display rich data:
- Strategic insights with SWOT analysis
- Competitive analysis with detailed competitors
- Performance predictions with metrics
- Risk assessment with mitigation strategies
- Implementation roadmap with phases
🚀 Impact
This fix resolves the core data flow issue that was preventing the frontend from displaying the rich backend data. All strategy-related functionality should now work correctly, including:
- ✅ Strategy Generation: Complete data flow from backend to frontend
- ✅ Strategy Display: Rich data in all Strategic Intelligence cards
- ✅ Strategy Management: Proper CRUD operations
- ✅ Calendar Integration: Correct data for calendar generation
- ✅ Gap Analysis: Proper data extraction and display
The system now properly handles the backend's nested response structure and extracts the actual data for frontend consumption.