From fe3a7abf324b9542c55a462da11159eda1afb5c7 Mon Sep 17 00:00:00 2001 From: Geert Rademakes Date: Wed, 13 Aug 2025 16:48:34 +0200 Subject: [PATCH] fix(backend): avoid duplicate key errors during complex matching by upserting MusicFile by s3Key --- .../src/services/backgroundJobService.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/backend/src/services/backgroundJobService.ts b/packages/backend/src/services/backgroundJobService.ts index 3535b20..77a419e 100644 --- a/packages/backend/src/services/backgroundJobService.ts +++ b/packages/backend/src/services/backgroundJobService.ts @@ -361,16 +361,17 @@ class BackgroundJobService { const fileBuffer = await s3Service.getFileContent(s3File.key); const metadata = await audioMetadataService.extractMetadata(fileBuffer, filename); - const musicFile = new MusicFile({ - originalName: filename, - s3Key: s3File.key, - s3Url: `${process.env.S3_ENDPOINT}/${process.env.S3_BUCKET_NAME}/${s3File.key}`, - contentType: guessContentType(filename), - size: s3File.size, - ...metadata, - }); - - processedFiles.push(musicFile); + // Reuse existing MusicFile document if present to avoid duplicate key errors + let musicFile = await MusicFile.findOne({ s3Key: s3File.key }); + if (!musicFile) { + musicFile = new MusicFile({ s3Key: s3File.key }); + } + musicFile.originalName = filename; + musicFile.s3Key = s3File.key; + musicFile.s3Url = `${process.env.S3_ENDPOINT}/${process.env.S3_BUCKET_NAME}/${s3File.key}`; + musicFile.contentType = guessContentType(filename); + musicFile.size = s3File.size; + Object.assign(musicFile, metadata); // Try complex matching const matchResult = await songMatchingService.matchMusicFileToSongs(musicFile, { @@ -402,7 +403,7 @@ class BackgroundJobService { stillUnmatched++; } - // Save immediately for real-time availability + // Save immediately for real-time availability (create or update) await musicFile.save(); processedFiles.push(musicFile);