import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; /** * Gets the base URL for server API requests with proper fallbacks */ function getBaseUrl() { // For server components, we normally would use environment variables // But we need to be careful with how they're accessed // Try to get the API URL from environment variables const apiUrl = process.env.NEXT_PUBLIC_API_URL; // We need to get the host from somewhere to construct the URL // In production, we can rely on the VERCEL_URL or similar if (process.env.VERCEL_URL) { return `https://${process.env.VERCEL_URL}/api`; } // If we have a configured API URL, use that if (apiUrl) { // If it's already an absolute URL, use it if (apiUrl.startsWith('http')) { return apiUrl; } // Otherwise, it's likely a relative path like /api return `http://localhost:3000${apiUrl.startsWith('/') ? apiUrl : `/${apiUrl}`}`; } // Last resort fallback for development return 'http://localhost:3000/api'; } /** * Server-side fetch wrapper with authentication. */ export async function fetchServer( endpoint: string, options: RequestInit = {} ): Promise { const cookieStore = cookies(); const authToken = cookieStore.get('Authorization')?.value; if (!authToken) redirect('/login'); try { const baseUrl = getBaseUrl(); // Ensure endpoint doesn't start with a slash if baseUrl ends with one const normalizedEndpoint = endpoint.startsWith('/') ? endpoint.substring(1) : endpoint; // Ensure baseUrl ends with a slash if it doesn't already const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`; // Combine them to get a complete URL const url = `${normalizedBaseUrl}${normalizedEndpoint}`; console.log(`Server fetch to: ${url}`); const res = await fetch(url, { ...options, headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${authToken}`, ...options.headers, }, cache: 'no-store', }); if (res.status === 401) redirect('/login'); if (!res.ok) throw new Error(`Request failed: ${res.statusText}`); return res.json(); } catch (error) { console.error(`Server request to ${endpoint} failed:`, error); throw error; } }