From f099cf0d6c70e4d8492050c233aba06670a18454 Mon Sep 17 00:00:00 2001 From: Alma Date: Sun, 13 Apr 2025 22:38:19 +0200 Subject: [PATCH] widget news fetch 4 --- app/api/news/route.ts | 46 ++++++++++++++-- components/news.tsx | 121 +++++++++++------------------------------- 2 files changed, 74 insertions(+), 93 deletions(-) diff --git a/app/api/news/route.ts b/app/api/news/route.ts index 97c7a601..5a3cc1c6 100644 --- a/app/api/news/route.ts +++ b/app/api/news/route.ts @@ -1,11 +1,19 @@ import { NextResponse } from 'next/server'; import { Pool } from 'pg'; +// Function to clean database host URL +function cleanDatabaseHost(host: string | undefined): string { + if (!host) { + throw new Error('Database host is not defined'); + } + return host.replace(/^https?:\/\//, ''); +} + // Create a new pool using the environment variables const pool = new Pool({ user: process.env.DB_USER, password: process.env.DB_PASSWORD, - host: process.env.DB_HOST?.replace('@https://', ''), + host: cleanDatabaseHost(process.env.DB_HOST), database: process.env.DB_NAME, ssl: { rejectUnauthorized: false // Required for some cloud databases @@ -14,11 +22,21 @@ const pool = new Pool({ export async function GET() { try { + // Log connection attempt + console.log('Attempting database connection with config:', { + user: process.env.DB_USER, + host: process.env.DB_HOST, + database: process.env.DB_NAME, + hasPassword: !!process.env.DB_PASSWORD + }); + // Connect to the database const client = await pool.connect(); + console.log('Successfully connected to database'); try { // Query the news table for the latest 10 news items + console.log('Executing news query...'); const result = await client.query(` SELECT id, @@ -37,6 +55,8 @@ export async function GET() { LIMIT 10 `); + console.log(`Query completed. Found ${result.rows.length} news items.`); + // Format the response const news = result.rows.map(row => ({ id: row.id, @@ -55,14 +75,34 @@ export async function GET() { })); return NextResponse.json({ news }); + } catch (queryError: any) { + console.error('Query error:', queryError); + return NextResponse.json( + { error: 'Database query failed: ' + (queryError?.message || 'Unknown error') }, + { status: 500 } + ); } finally { // Release the client back to the pool client.release(); + console.log('Database client released'); } - } catch (error) { + } catch (error: any) { console.error('Database connection error:', error); + // Check if error is due to missing configuration + if (!process.env.DB_USER || !process.env.DB_PASSWORD || !process.env.DB_HOST || !process.env.DB_NAME) { + console.error('Missing database configuration:', { + hasUser: !!process.env.DB_USER, + hasPassword: !!process.env.DB_PASSWORD, + hasHost: !!process.env.DB_HOST, + hasDatabase: !!process.env.DB_NAME + }); + return NextResponse.json( + { error: 'Database configuration is incomplete' }, + { status: 500 } + ); + } return NextResponse.json( - { error: 'Failed to fetch news' }, + { error: 'Failed to connect to database: ' + (error?.message || 'Unknown error') }, { status: 500 } ); } diff --git a/components/news.tsx b/components/news.tsx index 164ae4f0..59dfc16f 100644 --- a/components/news.tsx +++ b/components/news.tsx @@ -24,95 +24,54 @@ interface NewsItem { symbol: string | null; } -// Mock data for testing - remove this in production -const MOCK_NEWS = [ - { - id: 1, - title: "New Project Management Features Released", - url: "#", - date: "2024-03-20", - source: "Internal", - description: "New features added to improve project management workflow", - category: "Update", - sentiment: { score: null, label: null }, - symbols: null, - symbol: null - }, - { - id: 2, - title: "Team Meeting Schedule Changes", - url: "#", - date: "2024-03-19", - source: "Internal", - description: "Updates to the team meeting schedule", - category: "Announcement", - sentiment: { score: null, label: null }, - symbols: null, - symbol: null - }, - { - id: 3, - title: "Upcoming Training Sessions", - url: "#", - date: "2024-03-18", - source: "Internal", - description: "Schedule for upcoming training sessions", - category: "Training", - sentiment: { score: null, label: null }, - symbols: null, - symbol: null - } -]; - export function News() { - console.log('News component mounted'); const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [refreshing, setRefreshing] = useState(false); const [dbStatus, setDbStatus] = useState<'connecting' | 'connected' | 'error'>('connecting'); + // Debug info display component + const DebugInfo = () => ( +
+

Status: {dbStatus}

+

Loading: {loading ? 'true' : 'false'}

+

Error: {error || 'none'}

+

News items: {news.length}

+
+ ); + const fetchNews = async (isRefresh = false) => { - console.log('Fetching news...'); if (isRefresh) setRefreshing(true); setLoading(true); setDbStatus('connecting'); try { - console.log('Making API request to /api/news'); - const response = await fetch('/api/news'); - console.log('API response status:', response.status); + const response = await fetch('/api/news', { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + }); if (!response.ok) { - console.log('API request failed'); - throw new Error('Failed to fetch news'); + throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); - console.log('API response data:', data); if (data.error) { - console.log('API returned error:', data.error); throw new Error(data.error); } - // If no news items returned, use mock data for testing - if (!data.news || data.news.length === 0) { - console.log('No news items returned, using mock data'); - setNews(MOCK_NEWS); - } else { - console.log('Setting news items from API'); - setNews(data.news); - } - + setNews(data.news || []); setError(null); setDbStatus('connected'); } catch (err) { - console.error('Error details:', err); - setError('Failed to load news. Please try again later.'); + const errorMessage = err instanceof Error ? err.message : 'Failed to load news'; + setError(errorMessage); setDbStatus('error'); - console.log('Using mock data due to error'); - setNews(MOCK_NEWS); + setNews([]); } finally { setLoading(false); setRefreshing(false); @@ -136,33 +95,7 @@ export function News() { {dbStatus === 'connecting' ? 'Connecting to database...' : 'Loading news...'}

- - - ); - } - - if (error) { - return ( - - - News - - - -
-

{error}

-

- {dbStatus === 'error' ? 'Database connection error' : 'Failed to fetch news'} -

-
+
); @@ -184,7 +117,14 @@ export function News() {
- {news.length === 0 ? ( + {error ? ( +
+

{error}

+

+ {dbStatus === 'error' ? 'Database connection error' : 'Failed to fetch news'} +

+
+ ) : news.length === 0 ? (
No news available
@@ -238,6 +178,7 @@ export function News() { )) )}
+
);