diff --git a/apps/api-service/src/services/MinioStorageService.ts b/apps/api-service/src/services/MinioStorageService.ts index 78a0ae2..979cbd0 100644 --- a/apps/api-service/src/services/MinioStorageService.ts +++ b/apps/api-service/src/services/MinioStorageService.ts @@ -427,26 +427,43 @@ export class MinioStorageService implements StorageService { const files: FileMetadata[] = []; + console.log(`[MinIO listFiles] Starting list for prefix: ${searchPrefix}`); + const startTime = Date.now(); + return new Promise((resolve, reject) => { const stream = this.client.listObjects(this.bucketName, searchPrefix, true); - stream.on('data', async (obj) => { + let dataCount = 0; + + stream.on('data', (obj) => { if (!obj.name || !obj.size) return; + dataCount++; + try { const pathParts = obj.name.split('/'); const filename = pathParts[pathParts.length - 1]; if (!filename) return; - const metadata = await this.client.statObject(this.bucketName, obj.name); + // Infer content type from file extension (more efficient than statObject) + const ext = filename.toLowerCase().split('.').pop(); + const contentType = + { + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + webp: 'image/webp', + svg: 'image/svg+xml', + }[ext || ''] || 'application/octet-stream'; files.push({ filename, size: obj.size, - contentType: metadata.metaData?.['content-type'] || 'application/octet-stream', + contentType, lastModified: obj.lastModified || new Date(), - etag: metadata.etag, + etag: obj.etag, path: obj.name, }); } catch (error) { @@ -454,9 +471,17 @@ export class MinioStorageService implements StorageService { } }); - stream.on('end', () => resolve(files)); + stream.on('end', () => { + const elapsed = Date.now() - startTime; + console.log( + `[MinIO listFiles] Stream ended. Processed ${dataCount} objects, collected ${files.length} files in ${elapsed}ms`, + ); + resolve(files); + }); + stream.on('error', (error) => { - console.error('[MinIO listFiles] Stream error:', error); + const elapsed = Date.now() - startTime; + console.error(`[MinIO listFiles] Stream error after ${elapsed}ms:`, error); reject(error); }); });