diff --git a/components/EOISection.vue b/components/EOISection.vue index 1ba46e2..cea40e9 100644 --- a/components/EOISection.vue +++ b/components/EOISection.vue @@ -392,6 +392,9 @@ const uploadEOI = async (file: File) => { const response = await $fetch<{ success: boolean; document: any; message: string }>('/api/eoi/upload-document', { method: 'POST', + headers: { + 'x-tag': '094ut234' + }, query: { interestId: props.interest.Id.toString() }, diff --git a/server/api/files/delete.ts b/server/api/files/delete.ts index 7274acf..b37f1ef 100644 --- a/server/api/files/delete.ts +++ b/server/api/files/delete.ts @@ -6,6 +6,13 @@ export default defineEventHandler(async (event) => { const { fileName, isFolder, bucket } = body; const targetBucket = bucket || 'client-portal'; + console.log('[delete] Delete request:', { + fileName, + isFolder, + bucket, + targetBucket + }); + if (!fileName) { throw createError({ statusCode: 400, @@ -61,7 +68,18 @@ export default defineEventHandler(async (event) => { }); } else { // Delete single file + console.log(`[delete] Attempting to delete file '${fileName}' from bucket '${targetBucket}'`); + + // First check if the file exists + try { + const stat = await client.statObject(targetBucket, fileName); + console.log('[delete] File exists in bucket:', stat); + } catch (err: any) { + console.error(`[delete] File '${fileName}' not found in bucket '${targetBucket}':`, err.message); + } + await client.removeObject(targetBucket, fileName); + console.log(`[delete] Successfully deleted '${fileName}' from '${targetBucket}'`); } } diff --git a/server/api/files/list-with-attachments.ts b/server/api/files/list-with-attachments.ts index 9942b14..c0c96b3 100644 --- a/server/api/files/list-with-attachments.ts +++ b/server/api/files/list-with-attachments.ts @@ -57,7 +57,9 @@ export default defineEventHandler(async (event) => { if (prefix === 'Email Attachments/') { allFiles = formattedAttachmentFiles.map((file: any) => ({ ...file, - name: file.name.replace(attachmentFolder + '/', '') + displayName: file.name.replace(attachmentFolder + '/', ''), + // Keep the full path in 'name' for operations like delete + name: file.name })); } } catch (error) { diff --git a/server/api/files/test-list-bucket.ts b/server/api/files/test-list-bucket.ts new file mode 100644 index 0000000..53a923f --- /dev/null +++ b/server/api/files/test-list-bucket.ts @@ -0,0 +1,55 @@ +export default defineEventHandler(async (event) => { + try { + const { bucket, prefix } = getQuery(event); + + if (!bucket) { + return { + success: false, + error: 'Missing bucket parameter' + }; + } + + console.log('[test-list-bucket] Listing files:', { + bucket: bucket as string, + prefix: prefix as string || '' + }); + + // Import MinIO client + const { getMinioClient } = await import('~/server/utils/minio'); + const client = getMinioClient(); + + const files: any[] = []; + + await new Promise((resolve, reject) => { + const stream = client.listObjectsV2(bucket as string, prefix as string || '', true); + + stream.on('data', (obj) => { + if (obj && obj.name) { + files.push({ + name: obj.name, + size: obj.size, + lastModified: obj.lastModified + }); + } + }); + + stream.on('error', reject); + stream.on('end', resolve); + }); + + return { + success: true, + bucket: bucket as string, + prefix: prefix as string || '', + count: files.length, + files: files + }; + } catch (error: any) { + console.error('[test-list-bucket] Error:', error); + return { + success: false, + error: 'Failed to list bucket', + details: error.message + }; + } +});