From d8a7fdf1f02f18dae3eb9ebd16fcf4cb3d9a0073 Mon Sep 17 00:00:00 2001 From: averel10 Date: Fri, 13 Mar 2026 09:51:51 +0100 Subject: [PATCH] feat: enhance error handling and status updates in dataset processing --- src/app/actions/upload.ts | 57 ++++++++++++++------ src/components/UploadDatasetEntriesModal.tsx | 14 +++-- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/src/app/actions/upload.ts b/src/app/actions/upload.ts index 04c1bd9..85ce23b 100644 --- a/src/app/actions/upload.ts +++ b/src/app/actions/upload.ts @@ -52,30 +52,46 @@ export async function processDatasetEntries( datasetId: number, tempDir: string ) { - const result = await requireAdmin(); - if (!result.authenticated || !result.admin) { - throw new Error('Unauthorized'); - } - - const datasetDir = join(process.cwd(), 'public', 'datasets', datasetId.toString()); - try { + const result = await requireAdmin(); + if (!result.authenticated || !result.admin) { + return { + success: false, + error: 'Unauthorized', + entriesCreated: 0, + }; + } + + const datasetDir = join(process.cwd(), 'public', 'datasets', datasetId.toString()); + // Validate temp directory exists if (!existsSync(tempDir)) { - throw new Error('Temporary extraction directory not found'); + return { + success: false, + error: 'Temporary extraction directory not found', + entriesCreated: 0, + }; } // Read metadata.csv again const metadataPath = join(tempDir, 'metadata.csv'); if (!existsSync(metadataPath)) { - throw new Error('metadata.csv not found in extracted files'); + return { + success: false, + error: 'metadata.csv not found in extracted files', + entriesCreated: 0, + }; } const metadataContent = await readFile(metadataPath, 'utf-8'); const lines = metadataContent.split('\n').filter(line => line.trim()); if (lines.length < 2) { - throw new Error('metadata.csv is empty or invalid'); + return { + success: false, + error: 'metadata.csv is empty or invalid', + entriesCreated: 0, + }; } // Parse CSV @@ -123,7 +139,11 @@ export async function processDatasetEntries( } if (entries.length === 0) { - throw new Error('No valid audio files found for entries'); + return { + success: false, + error: 'No valid audio files found for entries', + entriesCreated: 0, + }; } // Check for existing entries to avoid duplicates @@ -138,7 +158,11 @@ export async function processDatasetEntries( const newEntries = entries.filter(entry => !existingExternalIds.has(entry.externalId)); if (newEntries.length === 0) { - throw new Error('All entries already exist in the dataset'); + return { + success: false, + error: 'All entries already exist in the dataset', + entriesCreated: 0, + }; } // Insert new entries into database @@ -153,9 +177,12 @@ export async function processDatasetEntries( }; } catch (error) { console.error('Error processing dataset entries:', error); - throw new Error( - error instanceof Error ? error.message : 'Failed to process dataset entries' - ); + const errorMessage = error instanceof Error ? error.message : 'Failed to process dataset entries'; + return { + success: false, + error: errorMessage, + entriesCreated: 0, + }; } finally { // Clean up temp directory try { diff --git a/src/components/UploadDatasetEntriesModal.tsx b/src/components/UploadDatasetEntriesModal.tsx index 888df32..7dc8b24 100644 --- a/src/components/UploadDatasetEntriesModal.tsx +++ b/src/components/UploadDatasetEntriesModal.tsx @@ -59,13 +59,19 @@ export default function UploadDatasetEntriesModal({ // Process the extracted data const processResult = await processDatasetEntries(datasetId, uploadResult.tempDir); - item.status = 'completed'; - item.progress = 100; - item.message = `✓ Processed (${processResult.entriesCreated} entries)`; + if (!processResult.success) { + item.status = 'failed'; + item.progress = 0; + item.message = `✗ ${processResult.error || 'Processing failed'}`; + } else { + item.status = 'completed'; + item.progress = 100; + item.message = `✓ Processed (${processResult.entriesCreated} entries)`; + } } catch (err) { item.status = 'failed'; item.progress = 0; - item.message = err instanceof Error ? err.message : 'Unknown error'; + item.message = `✗ ${err instanceof Error ? err.message : 'Network error'}`; } setUploadQueue([...newQueue]);