teempe icon

PARALLEL_INTEGRATION_PROMPT.MD

teempe | PRO | 08/23/25 11:09:01 AM UTC | 0 ⭐ | 70 👁️ | Never ⏰ | []
text |

17.71 KB

|

None

|

0 👍

/

0 👎

# Parallel Frontend-Backend Integration Execution Prompt
 ## PROJECT CONTEXT
**Project**: Pastebin Viewer Application  
**Current State**: Backend API functional, Frontend displaying mock data  
**Objective**: Complete frontend-backend integration using parallel agent execution  
**Timeline**: 2-3 days maximum  
**Execution Mode**: Parallel with defined synchronization points  
 ## CURRENT SYSTEM STATE
 ### Backend (Kotlin/Spring Boot) - PORT 8080
- ✅ All API endpoints operational
- ✅ Database populated with test data
- ✅ Health checks passing
- ✅ CORS configured
- ✅ Actuator endpoints available
 ### Frontend (React/TypeScript) - PORT 5173
- ❌ Using hardcoded mock data (`mockStats`)
- ✅ Vite proxy configured correctly
- ✅ API service layer exists but unused
- ❌ Pages showing placeholder content
- ✅ Type definitions present
 ## PARALLEL EXECUTION PLAN
 ### PHASE 0: INITIAL VERIFICATION (15 minutes)
**Both Agents Execute Simultaneously**
 #### Backend Agent Tasks:
```bash
# Verify backend is running and healthy
curl http://localhost:8080/actuator/health
curl http://localhost:8080/api/stats
curl http://localhost:8080/api/pastes?page=0&size=10
 # Check database has data
# Log first 5 pastes with classifications
```
 #### Frontend Agent Tasks:
```bash
# Verify frontend dev server is running
curl http://localhost:5173
 # Check current mock data structure
# Document all hardcoded values in use
# List all API endpoints that need connection
```
 **Synchronization Point 0**: Both agents confirm systems are ready
 ---
 ### PHASE 1: FOUNDATION SETUP (30 minutes)
**Parallel Execution with No Dependencies**
 #### Backend Agent Tasks:
1. **Create Integration Test Endpoints**
   - `/api/test/connection` - Simple ping endpoint
   - `/api/test/data-summary` - Returns count of pastes, classifications
   - Document actual API response formats
 2. **Verify API Contracts**
   - Test each endpoint and document exact response structure
   - Create sample responses for frontend reference
   - File: `/backend/docs/API_RESPONSE_SAMPLES.md`
 3. **Add CORS Debug Logging**
   - Enable detailed CORS logging
   - Verify headers are correctly set
 #### Frontend Agent Tasks:
1. **Create React Hooks Infrastructure**
   ```typescript
   // /frontend/src/hooks/useApi.ts
   export const useApi = <T>(
     apiCall: () => Promise<T>,
     deps: any[] = []
   ) => {
     const [data, setData] = useState<T | null>(null);
     const [loading, setLoading] = useState(true);
     const [error, setError] = useState<string | null>(null);
      useEffect(() => {
       const fetchData = async () => {
         try {
           setLoading(true);
           setError(null);
           const result = await apiCall();
           setData(result);
         } catch (err) {
           setError(err.message || 'API call failed');
         } finally {
           setLoading(false);
         }
       };
        fetchData();
     }, deps);
      return { data, loading, error, refetch: fetchData };
   };
   ```
 2. **Create Common Components**
   - `/frontend/src/components/common/LoadingSpinner.tsx` (if not exists)
   - `/frontend/src/components/common/ErrorBoundary.tsx`
   - `/frontend/src/components/common/RetryError.tsx`
 3. **Update Type Definitions**
   - Align with backend response structures
   - Add pagination types
   - Add API error types
 **Synchronization Point 1**: Share API response samples between agents
 ---
 ### PHASE 2: DASHBOARD INTEGRATION (45 minutes)
**Sequential within phase, parallel between agents**
 #### Backend Agent Tasks:
1. **Create Aggregated Stats Endpoint**
   ```kotlin
   @GetMapping("/api/dashboard/stats")
   fun getDashboardStats(): DashboardStats {
     return DashboardStats(
       totalPastes = pasteService.getTotalCount(),
       recentPastes = pasteService.getRecentCount(24.hours),
       classifications = classificationService.getCountByType(),
       systemHealth = healthService.getSystemStatus(),
       lastScrapingTime = scrapingService.getLastRunTime(),
       queueSize = kafkaService?.getQueueSize() ?: 0
     )
   }
   ```
 2. **Add Real-time Metrics**
   - Response time metrics
   - Active connections count
   - Error rate calculation
 #### Frontend Agent Tasks:
1. **Replace Mock Data in App.tsx**
   ```typescript
   // REMOVE: import { mockStats } from '@/services/mockData';
   // ADD:
   import { apiService } from '@/services/api';
   import { useApi } from '@/hooks/useApi';
    function App() {
     const { data: stats, loading, error, refetch } = useApi(
       () => apiService.getDashboardStats(),
       []
     );
      // Auto-refresh every 30 seconds
     useEffect(() => {
       const interval = setInterval(refetch, 30000);
       return () => clearInterval(interval);
     }, [refetch]);
      if (loading) return <LoadingSpinner fullScreen />;
     if (error) return <ErrorMessage message={error} onRetry={refetch} />;
     if (!stats) return <EmptyState message="No data available" />;
      // Rest of component...
   }
   ```
 2. **Update Dashboard Component**
   - Add refresh button
   - Show last updated timestamp
   - Implement skeleton loading for cards
 **Validation Checkpoint**: Dashboard shows real backend data
 ---
 ### PHASE 3: PASTES PAGE IMPLEMENTATION (1 hour)
**Agents work on complementary tasks**
 #### Backend Agent Tasks:
1. **Optimize Paste Endpoints**
   ```kotlin
   @GetMapping("/api/pastes")
   fun getPastes(
     @RequestParam(defaultValue = "0") page: Int,
     @RequestParam(defaultValue = "20") size: Int,
     @RequestParam(required = false) search: String?,
     @RequestParam(required = false) classification: String?,
     @RequestParam(defaultValue = "createdAt,desc") sort: String
   ): Page<PasteDto>
   ```
 2. **Add Paste Details Endpoint**
   ```kotlin
   @GetMapping("/api/pastes/{id}/full")
   fun getPasteWithDetails(@PathVariable id: String): PasteDetailsDto
   ```
 3. **Create Search Suggestions Endpoint**
   ```kotlin
   @GetMapping("/api/pastes/suggestions")
   fun getSearchSuggestions(@RequestParam query: String): List<String>
   ```
 #### Frontend Agent Tasks:
1. **Create Paste List Components**
   ```typescript
   // /frontend/src/components/pastes/PasteList.tsx
   export const PasteList: React.FC = () => {
     const [page, setPage] = useState(0);
     const [filters, setFilters] = useState<PasteFilters>({});
      const { data, loading, error } = useApi(
       () => apiService.getPastes(page, 20, filters),
       [page, filters]
     );
      return (
       <div className="space-y-4">
         <PasteFilters onChange={setFilters} />
         {loading && <LoadingSpinner />}
         {error && <ErrorMessage message={error} />}
         {data && (
           <>
             <div className="grid gap-4">
               {data.content.map(paste => (
                 <PasteCard key={paste.id} paste={paste} />
               ))}
             </div>
             <Pagination
               current={page}
               total={data.totalPages}
               onChange={setPage}
             />
           </>
         )}
       </div>
     );
   };
   ```
 2. **Implement Pastes Page**
   - Replace placeholder content
   - Add paste details modal
   - Implement search functionality
 **Validation Checkpoint**: Pastes page displays paginated data from backend
 ---
 ### PHASE 4: CLASSIFICATIONS PAGE (45 minutes)
**Parallel implementation with shared components**
 #### Backend Agent Tasks:
1. **Create Classification Statistics Endpoint**
   ```kotlin
   @GetMapping("/api/classifications/statistics")
   fun getClassificationStats(): ClassificationStats
    @GetMapping("/api/classifications/timeline")
   fun getClassificationTimeline(
     @RequestParam days: Int = 7
   ): List<TimelineEntry>
   ```
 2. **Add Filtering Capabilities**
   ```kotlin
   @GetMapping("/api/classifications")
   fun getClassifications(
     @RequestParam(required = false) type: ClassificationType?,
     @RequestParam(required = false) minConfidence: Double?,
     @RequestParam(required = false) startDate: LocalDateTime?,
     @RequestParam(required = false) endDate: LocalDateTime?
   ): Page<ClassificationDto>
   ```
 #### Frontend Agent Tasks:
1. **Create Classification Components**
   ```typescript
   // /frontend/src/components/classifications/ClassificationList.tsx
   export const ClassificationList: React.FC = () => {
     const [filters, setFilters] = useState<ClassificationFilters>({
       type: null,
       minConfidence: 0.5,
       dateRange: 'week'
     });
      const { data, loading, error } = useApi(
       () => apiService.getClassifications(filters),
       [filters]
     );
      // Component implementation
   };
   ```
 2. **Add Visualization Components**
   - Classification type distribution chart
   - Confidence score histogram
   - Timeline graph
 **Validation Checkpoint**: Classifications page shows filtered results
 ---
 ### PHASE 5: ERROR HANDLING & RESILIENCE (30 minutes)
**Both agents implement complementary error handling**
 #### Backend Agent Tasks:
1. **Implement Global Exception Handler**
   ```kotlin
   @RestControllerAdvice
   class GlobalExceptionHandler {
     @ExceptionHandler(ResourceNotFoundException::class)
     fun handleNotFound(e: ResourceNotFoundException): ResponseEntity<ApiError> {
       return ResponseEntity.status(404).body(
         ApiError(
           timestamp = Instant.now(),
           status = 404,
           error = "Not Found",
           message = e.message ?: "Resource not found",
           path = request.servletPath
         )
       )
     }
   }
   ```
 2. **Add Circuit Breaker for External Services**
3. **Implement Request Validation**
 #### Frontend Agent Tasks:
1. **Create Toast Notification System**
   ```typescript
   // /frontend/src/contexts/ToastContext.tsx
   export const useToast = () => {
     const show = (message: string, type: 'success' | 'error' | 'info') => {
       // Implementation
     };
      return { show };
   };
   ```
 2. **Add Retry Logic to API Service**
   ```typescript
   const retryWithBackoff = async <T>(
     fn: () => Promise<T>,
     maxRetries = 3
   ): Promise<T> => {
     for (let i = 0; i < maxRetries; i++) {
       try {
         return await fn();
       } catch (error) {
         if (i === maxRetries - 1) throw error;
         await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
       }
     }
     throw new Error('Max retries exceeded');
   };
   ```
 3. **Implement Offline Detection**
 **Validation Checkpoint**: Error scenarios handled gracefully
 ---
 ### PHASE 6: REAL-TIME UPDATES (30 minutes)
**Optional - Implement if time permits**
 #### Backend Agent Tasks:
1. **Add SSE Endpoint for Live Updates**
   ```kotlin
   @GetMapping("/api/stream/updates", produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
   fun streamUpdates(): Flux<ServerSentEvent<UpdateEvent>>
   ```
 2. **Implement Change Detection Service**
 #### Frontend Agent Tasks:
1. **Create SSE Hook**
   ```typescript
   export const useServerSentEvents = (url: string) => {
     const [events, setEvents] = useState<any[]>([]);
      useEffect(() => {
       const eventSource = new EventSource(url);
        eventSource.onmessage = (event) => {
         const data = JSON.parse(event.data);
         setEvents(prev => [...prev, data]);
       };
        return () => eventSource.close();
     }, [url]);
      return events;
   };
   ```
 2. **Add Live Update Indicators**
   - New paste notifications
   - Classification completion alerts
 ---
 ### PHASE 7: TESTING & VALIDATION (45 minutes)
**Both agents run comprehensive tests**
 #### Backend Agent Tasks:
1. **Integration Test Suite**
   ```kotlin
   @Test
   fun `should return dashboard stats`() {
     val stats = restTemplate.getForObject(
       "http://localhost:8080/api/dashboard/stats",
       DashboardStats::class.java
     )
      assertThat(stats).isNotNull
     assertThat(stats.totalPastes).isGreaterThan(0)
   }
   ```
 2. **Load Testing**
   ```bash
   # Using Apache Bench
   ab -n 1000 -c 10 http://localhost:8080/api/pastes
   ```
 #### Frontend Agent Tasks:
1. **Component Tests**
   ```typescript
   describe('PasteList', () => {
     it('should fetch and display pastes', async () => {
       render(<PasteList />);
        await waitFor(() => {
         expect(screen.getByText(/paste title/i)).toBeInTheDocument();
       });
     });
      it('should handle API errors', async () => {
       // Mock API error
       apiService.getPastes = jest.fn().mockRejectedValue(new Error('API Error'));
        render(<PasteList />);
        await waitFor(() => {
         expect(screen.getByText(/API Error/i)).toBeInTheDocument();
       });
     });
   });
   ```
 2. **E2E Test Scenarios**
   - User journey from dashboard to paste details
   - Filter and search functionality
   - Error recovery flows
 ---
 ## ERROR HANDLING STRATEGIES
 ### Backend Agent Error Handling:
1. **Database Connection Lost**: Implement retry with exponential backoff
2. **Kafka Unavailable**: Fallback to direct database writes
3. **External API Timeout**: Circuit breaker pattern
4. **Out of Memory**: Implement request throttling
 ### Frontend Agent Error Handling:
1. **Network Failure**: Show offline banner, queue actions
2. **401 Unauthorized**: Redirect to login (if auth implemented)
3. **500 Server Error**: Show friendly error with retry
4. **Timeout**: Show timeout message with retry option
 ## ROLLBACK PROCEDURES
 ### If Integration Fails:
1. **Frontend Rollback**:
   ```bash
   # Revert to mock data
   git checkout -- frontend/src/App.tsx
   npm run dev
   ```
 2. **Backend Rollback**:
   ```bash
   # Revert to previous version
   git checkout -- backend/src/main/kotlin/
   ./gradlew bootRun
   ```
 ## SUCCESS CRITERIA
 ### Must Have (Critical):
- [ ] Dashboard displays real backend data
- [ ] Pastes list loads with pagination
- [ ] Classifications page shows data
- [ ] No console errors in production mode
- [ ] API error handling works
 ### Should Have (Important):
- [ ] Auto-refresh on dashboard
- [ ] Search functionality works
- [ ] Filters work correctly
- [ ] Loading states for all async operations
- [ ] Toast notifications for actions
 ### Nice to Have (Optional):
- [ ] Real-time updates via SSE/WebSocket
- [ ] Offline mode support
- [ ] Advanced search with suggestions
- [ ] Export functionality
- [ ] Keyboard shortcuts
 ## VALIDATION COMMANDS
 ### Backend Validation:
```bash
# Health check
curl http://localhost:8080/actuator/health
 # Stats endpoint
curl http://localhost:8080/api/dashboard/stats | jq .
 # Pastes with pagination
curl "http://localhost:8080/api/pastes?page=0&size=5" | jq .
 # Classifications
curl http://localhost:8080/api/classifications | jq .
```
 ### Frontend Validation:
```bash
# Build check
cd frontend && npm run build
 # Type check
npm run type-check
 # Test suite
npm test
 # Lint check
npm run lint
```
 ### Integration Validation:
```bash
# Check proxy is working
curl http://localhost:5173/api/health
 # Check CORS headers
curl -H "Origin: http://localhost:5173" \
     -I http://localhost:8080/api/pastes
 # Monitor network tab in browser DevTools
# Should see API calls to /api/* endpoints
```
 ## COMMON ISSUES & SOLUTIONS
 ### Issue: CORS Errors
**Solution**: Ensure backend has proper CORS configuration:
```kotlin
@CrossOrigin(origins = ["http://localhost:5173"])
```
 ### Issue: Type Mismatches
**Solution**: Generate types from backend OpenAPI spec or manually align
 ### Issue: Proxy Not Working
**Solution**: Verify vite.config.ts proxy configuration:
```typescript
proxy: {
  '/api': {
    target: 'http://localhost:8080',
    changeOrigin: true,
    secure: false
  }
}
```
 ### Issue: Data Not Updating
**Solution**: Check React dependency arrays in useEffect hooks
 ### Issue: Memory Leaks
**Solution**: Clean up intervals/subscriptions in useEffect cleanup
 ## EXECUTION NOTES
 1. **Communication Protocol**:
   - Agents should log progress every 15 minutes
   - Use clear markers for synchronization points
   - Document any blockers immediately
 2. **File Organization**:
   - Backend changes: `/backend/src/main/kotlin/`
   - Frontend changes: `/frontend/src/`
   - Shared docs: `/docs/integration/`
 3. **Testing Protocol**:
   - Test each phase before moving to next
   - Keep both systems running during integration
   - Use browser DevTools Network tab to monitor API calls
 4. **Performance Targets**:
   - API response time < 200ms (P95)
   - Frontend initial load < 2 seconds
   - Smooth scrolling with 100+ items
 ## FINAL CHECKLIST
 ### Before Starting:
- [ ] Backend running on port 8080
- [ ] Frontend running on port 5173
- [ ] Database has test data
- [ ] All dependencies installed
 ### After Completion:
- [ ] All mock data removed
- [ ] All API endpoints connected
- [ ] Error handling implemented
- [ ] Loading states implemented
- [ ] Tests passing
- [ ] No console errors
- [ ] Documentation updated
 ## AGENT COORDINATION MARKERS
 Use these markers in your responses for clarity:
 ```
[BACKEND-AGENT: PHASE_1_START]
[FRONTEND-AGENT: PHASE_1_START]
[SYNC_POINT_1: READY]
[VALIDATION: DASHBOARD_CONNECTED]
[BLOCKER: <description>]
[COMPLETE: PHASE_3]
```
 ---
 **Execute this plan systematically. Prioritize working features over perfect code. Focus on getting the integration working end-to-end first, then optimize.**

Comments