diff --git a/server/Database.js b/server/Database.js index eb384f25..a260e89f 100644 --- a/server/Database.js +++ b/server/Database.js @@ -766,14 +766,25 @@ class Database { Logger.warn(`Removed ${badSessionsRemoved} sessions that were 3 seconds or less`) } - // Remove mediaProgresses with duplicate mediaItemId (remove the oldest updatedAt) - // const [duplicateMediaProgresses] = await this.sequelize.query(`SELECT id, mediaItemId FROM mediaProgresses WHERE (mediaItemId, userId, updatedAt) IN (SELECT mediaItemId, userId, MIN(updatedAt) FROM mediaProgresses GROUP BY mediaItemId, userId HAVING COUNT(*) > 1)`) - // for (const duplicateMediaProgress of duplicateMediaProgresses) { - // Logger.warn(`Found duplicate mediaProgress for mediaItem "${duplicateMediaProgress.mediaItemId}" - removing it`) - // await this.mediaProgressModel.destroy({ - // where: { id: duplicateMediaProgress.id } - // }) - // } + // Remove mediaProgresses with duplicate mediaItemId (remove the oldest updatedAt or if updatedAt is the same, remove arbitrary one) + const [duplicateMediaProgresses] = await this.sequelize.query(`SELECT mp1.id, mp1.mediaItemId +FROM mediaProgresses mp1 +WHERE EXISTS ( + SELECT 1 + FROM mediaProgresses mp2 + WHERE mp2.mediaItemId = mp1.mediaItemId + AND mp2.userId = mp1.userId + AND ( + mp2.updatedAt > mp1.updatedAt + OR (mp2.updatedAt = mp1.updatedAt AND mp2.id < mp1.id) + ) +)`) + for (const duplicateMediaProgress of duplicateMediaProgresses) { + Logger.warn(`Found duplicate mediaProgress for mediaItem "${duplicateMediaProgress.mediaItemId}" - removing it`) + await this.mediaProgressModel.destroy({ + where: { id: duplicateMediaProgress.id } + }) + } } async createTextSearchQuery(query) {