diff --git a/app/api/storage/init/folder/route.ts b/app/api/storage/init/folder/route.ts new file mode 100644 index 00000000..d7840766 --- /dev/null +++ b/app/api/storage/init/folder/route.ts @@ -0,0 +1,63 @@ +import { NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route'; +import { putObject } from '@/lib/s3'; +import { S3_CONFIG } from '@/lib/s3'; + +/** + * API endpoint to create a specific folder for a user + * POST /api/storage/init/folder + */ +export async function POST(request: Request) { + try { + // Get session + const session = await getServerSession(authOptions); + if (!session?.user?.id) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + // Parse request body + let reqBody; + try { + reqBody = await request.json(); + } catch (error) { + return NextResponse.json({ error: 'Invalid request body' }, { status: 400 }); + } + + const { folder } = reqBody; + + if (!folder || typeof folder !== 'string') { + return NextResponse.json({ error: 'Missing or invalid folder name' }, { status: 400 }); + } + + // Normalize folder name + const folderLowercase = folder.toLowerCase(); + const userId = session.user.id; + + console.log(`Creating folder ${folderLowercase} for user ${userId}`); + + try { + // Create the folder path (just a prefix in S3) + const key = `user-${userId}/${folderLowercase}/`; + await putObject(key, '', 'application/x-directory'); + + // Create a placeholder file to ensure the folder exists and is visible + const placeholderKey = `user-${userId}/${folderLowercase}/.placeholder`; + await putObject(placeholderKey, 'Folder placeholder', 'text/plain'); + + console.log(`Successfully created folder: ${key}`); + + // Return success + return NextResponse.json({ + success: true, + message: `Folder ${folderLowercase} created successfully` + }); + } catch (error) { + console.error(`Error creating folder ${folderLowercase}:`, error); + return NextResponse.json({ error: 'Failed to create folder' }, { status: 500 }); + } + } catch (error) { + console.error('Error in folder creation endpoint:', error); + return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/pages/page.tsx b/app/pages/page.tsx index 135f4a0b..158b575c 100644 --- a/app/pages/page.tsx +++ b/app/pages/page.tsx @@ -387,12 +387,34 @@ export default function CarnetPage() { } }; - const handleFolderSelect = (folder: string) => { + const handleFolderSelect = async (folder: string) => { console.log('Selected folder:', folder); setSelectedFolder(folder); setLayoutMode("item-selection"); + // Reset selected contact when changing folders setSelectedContact(null); + + // Ensure folder exists in storage before fetching + try { + // Create the folder if it doesn't exist + const lowerFolder = folder.toLowerCase(); + console.log(`Ensuring folder exists: ${lowerFolder}`); + + const response = await fetch(`/api/storage/init/folder`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ folder: lowerFolder }) + }); + + if (!response.ok) { + console.warn(`Failed to create folder ${lowerFolder}: ${await response.text()}`); + } + } catch (error) { + console.error('Error creating folder:', error); + } }; const handleContactSelect = (contact: Contact) => {