From ff1b5244e63792ed3dd7acb2b5ba665b1db2d25f Mon Sep 17 00:00:00 2001 From: alma Date: Tue, 6 May 2025 21:03:39 +0200 Subject: [PATCH] missions mission pages --- app/api/centrale/image/[...path]/route.ts | 70 +++++++++++++++++++++++ app/centrale/page.tsx | 8 ++- components/sidebar.tsx | 2 +- 3 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 app/api/centrale/image/[...path]/route.ts diff --git a/app/api/centrale/image/[...path]/route.ts b/app/api/centrale/image/[...path]/route.ts new file mode 100644 index 00000000..80c0f861 --- /dev/null +++ b/app/api/centrale/image/[...path]/route.ts @@ -0,0 +1,70 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/app/api/auth/options'; +import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; +import { S3_CONFIG } from '@/lib/s3'; + +// Initialize S3 client +const s3Client = new S3Client({ + region: S3_CONFIG.region, + endpoint: S3_CONFIG.endpoint, + credentials: { + accessKeyId: S3_CONFIG.accessKey || '', + secretAccessKey: S3_CONFIG.secretKey || '' + }, + forcePathStyle: true // Required for MinIO +}); + +// This endpoint serves mission images from Minio using the server's credentials +export async function GET(request: NextRequest, { params }: { params: { path: string[] } }) { + try { + // Check if path is provided + if (!params.path || params.path.length === 0) { + console.error('Missing path parameter'); + return new NextResponse('Path is required', { status: 400 }); + } + + // Reconstruct the full path from path segments + const filePath = params.path.join('/'); + console.log('Fetching centrale image:', filePath); + console.log('S3 bucket being used:', S3_CONFIG.bucket); + + // Create S3 command to get the object + const command = new GetObjectCommand({ + Bucket: S3_CONFIG.bucket, // Use the pages bucket + Key: filePath, + }); + + // Get the object from S3/Minio + console.log('Sending S3 request...'); + const response = await s3Client.send(command); + console.log('S3 response received'); + + if (!response.Body) { + console.error('File not found in Minio:', filePath); + return new NextResponse('File not found', { status: 404 }); + } + + // Log success information + console.log('File found, content type:', response.ContentType); + console.log('File size:', response.ContentLength, 'bytes'); + + // Get the readable web stream directly + const stream = response.Body.transformToWebStream(); + + // Determine content type + const contentType = response.ContentType || 'application/octet-stream'; + + // Create and return a new response with the file stream + return new NextResponse(stream as ReadableStream, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=31536000', // Cache for 1 year + }, + }); + } catch (error) { + console.error('Error serving centrale image:', error); + console.error('Error details:', JSON.stringify(error, null, 2)); + return new NextResponse('Internal Server Error', { status: 500 }); + } +} \ No newline at end of file diff --git a/app/centrale/page.tsx b/app/centrale/page.tsx index 13e6dc12..46bf6b3c 100644 --- a/app/centrale/page.tsx +++ b/app/centrale/page.tsx @@ -224,14 +224,16 @@ export default function CentralePage() {
{mission.logo ? ( {mission.name} { - console.log("Logo failed to load:", mission.logo); - console.log("Full URL attempted:", mission.logo); + console.error("Logo failed to load:", mission.logo); + console.error("Full URL attempted:", window.location.origin + mission.logo); + // If the image fails to load, show the fallback (e.currentTarget as HTMLImageElement).style.display = 'none'; + // Show the fallback div const fallbackDiv = e.currentTarget.parentElement?.querySelector('.logo-fallback'); if (fallbackDiv) { diff --git a/components/sidebar.tsx b/components/sidebar.tsx index 4a3d86d3..27b1cfbe 100644 --- a/components/sidebar.tsx +++ b/components/sidebar.tsx @@ -146,7 +146,7 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) { iframe: process.env.NEXT_PUBLIC_IFRAME_PAROLE_URL, }, { - title: "Centrale", + title: "Mes Missions", icon: Kanban, href: "/centrale", iframe: process.env.NEXT_PUBLIC_IFRAME_MISSIONSBOARD_URL,