UNPKG

r2drive

Version:

A modern desktop file manager for Cloudflare R2 storage with intuitive drag & drop interface

98 lines (86 loc) 2.84 kB
import { ListObjectsV2Command } from '@aws-sdk/client-s3'; import { getR2Client, getBucketName, hasR2Config } from '@/app/lib/r2-server'; import { NextRequest, NextResponse } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { try { // Verificar que hay configuración antes de intentar conectar if (!hasR2Config()) { return NextResponse.json( { success: false, error: 'No R2 configuration found' }, { status: 500 } ); } const r2Client = getR2Client(); const bucketName = getBucketName(); const searchParams = request.nextUrl.searchParams; const prefix = searchParams.get('prefix') || ''; const delimiter = '/'; // Usar delimitador para simular navegación por carpetas const command = new ListObjectsV2Command({ Bucket: bucketName, Prefix: prefix, Delimiter: delimiter, MaxKeys: 1000, }); const response = await r2Client.send(command); // Procesamos los resultados para tener una estructura más amigable const result = { success: true, prefix: prefix, files: [] as Array<{ key: string; name: string; size: number; lastModified: Date | undefined; isFolder: boolean; }>, folders: [] as Array<{ prefix: string; name: string; }>, parentFolder: prefix.includes('/') ? prefix.split('/').slice(0, -1).join('/') : '', }; // Procesar archivos if (response.Contents) { for (const item of response.Contents) { // Ignorar el archivo que representa al directorio actual if (item.Key === prefix) continue; const name = item.Key?.substring(prefix.length) || ''; // Solo incluir archivos directos (no los que están en subcarpetas) if (!name.includes('/')) { result.files.push({ key: item.Key || '', name, size: item.Size || 0, lastModified: item.LastModified, isFolder: false, }); } } } // Procesar carpetas (CommonPrefixes) if (response.CommonPrefixes) { for (const prefix of response.CommonPrefixes) { const folderPrefix = prefix.Prefix || ''; const folderName = folderPrefix.split('/').filter(Boolean).pop() || ''; result.folders.push({ prefix: folderPrefix, name: folderName, }); } } return NextResponse.json(result); } catch (error) { console.error('Error al listar objetos del bucket:', error); return NextResponse.json( { success: false, error: 'Error al listar objetos del bucket', details: error }, { status: 500 } ); } }