import { NextResponse } from 'next/server'; // FastAPI server configuration const API_URL = 'http://172.16.0.104:8000'; // Helper function to clean HTML content function cleanHtmlContent(text: string): string { if (!text) return ''; return text .replace(/<[^>]*>/g, '') // Remove HTML tags .replace(/ /g, ' ') // Replace   with space .replace(/\s+/g, ' ') // Replace multiple spaces with single space .trim(); } // Helper function to format time function formatDateTime(dateStr: string): { displayDate: string, timestamp: string } { try { const date = new Date(dateStr); // Format like "17 avr." to match the Duties widget style const day = date.getDate(); const month = date.toLocaleString('fr-FR', { month: 'short' }) .toLowerCase() .replace('.', ''); // Remove the dot that comes with French locale return { displayDate: `${day} ${month}.`, // Add the dot back for consistent styling timestamp: date.toLocaleString('fr-FR', { day: '2-digit', month: 'short', hour: '2-digit', minute: '2-digit', hour12: false }).replace(',', ' à') }; } catch (error) { return { displayDate: 'N/A', timestamp: 'N/A' }; } } // Helper function to truncate text function truncateText(text: string, maxLength: number): string { if (!text) return ''; const cleaned = cleanHtmlContent(text); if (cleaned.length <= maxLength) return cleaned; const lastSpace = cleaned.lastIndexOf(' ', maxLength); const truncated = cleaned.substring(0, lastSpace > 0 ? lastSpace : maxLength).trim(); return truncated.replace(/[.,!?]$/, '') + '...'; } // Helper function to format category function formatCategory(category: string): string | null { if (!category) return null; // Return null for all categories to remove the labels completely return null; } // Helper function to format source function formatSource(source: string): string { if (!source) return ''; const sourceName = source .replace(/^(https?:\/\/)?(www\.)?/i, '') .split('.')[0] .toLowerCase() .replace(/[^a-z0-9]/g, ' ') .trim(); return sourceName.charAt(0).toUpperCase() + sourceName.slice(1); } interface NewsItem { id: number; title: string; displayDate: string; timestamp: string; source: string; description: string | null; category: string | null; url: string; } export async function GET() { try { console.log('Fetching news from FastAPI server...'); const response = await fetch(`${API_URL}/news?limit=12`, { method: 'GET', headers: { 'Accept': 'application/json', } }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const articles = await response.json(); const formattedNews: NewsItem[] = articles.map((article: any) => { const { displayDate, timestamp } = formatDateTime(article.date); return { id: article.id, title: truncateText(article.title, 100), // Increased length for better titles description: article.description ? truncateText(article.description, 150) : null, // Increased length for better descriptions displayDate, timestamp, source: formatSource(article.source), category: formatCategory(article.category), url: article.url || '#' }; }); console.log(`Successfully fetched ${formattedNews.length} news articles`); return NextResponse.json(formattedNews); } catch (error) { console.error('API error:', { error: error instanceof Error ? error.message : 'Unknown error', server: API_URL }); return NextResponse.json( { error: 'Failed to fetch news', details: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 } ); } }