From 05fe76a202e574299fac15fe28990291129adce0 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Wed, 19 Aug 2026 00:09:47 +0000 Subject: [PATCH] refactor: db retention cleanup for transform data --- .../drizzle/repositories/PlayRepository.ts | 31 +++++++++---------- .../scrobblers/AbstractScrobbleClient.ts | 4 +-- src/backend/sources/AbstractSource.ts | 4 +-- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/backend/common/database/drizzle/repositories/PlayRepository.ts b/src/backend/common/database/drizzle/repositories/PlayRepository.ts index f312cb11..460276b9 100644 --- a/src/backend/common/database/drizzle/repositories/PlayRepository.ts +++ b/src/backend/common/database/drizzle/repositories/PlayRepository.ts @@ -437,28 +437,28 @@ export class DrizzlePlayRepository extends DrizzleBaseRepository<'plays'> { summaryDelStates.push(`No '${retentionType}' Plays older than ${shortTodayAwareFormat(date)}`); } else { for(const id of ids) { - let compactedPlay: PlayObject; if(compactTypes.includes('input')) { await this.db.update(playInputs).set({ data: {removedReason: 'Removed by compaction'} }).where(eq(playInputs.playId, id)); } if(compactTypes.includes('transform')) { - const playRow = await this.db.query.plays.findFirst({where: {id: id}}); - if(playRow === undefined) { - // uhh shouldn't be - loggerCom.warn(`No Play found with ID ${id}, but it should have been...`); - continue; - } - - compactedPlay = playRow.play; - if(compactedPlay.lifecycle !== undefined) { - compactedPlay.lifecycle = compactedPlay.lifecycle.map(x => { - if(x.inputs == undefined) { + const events = await this.db.query.playEvents.findMany({where: {playId: id}}); + for(const ev of events) { + if(ev.eventName === 'transform') { + const transformEvent = ev as PlayEventTransform; + let compactedInput = false; + transformEvent.data = transformEvent.data.map(x => { + if(x.inputs !== undefined && x.inputs.length > 0) { + compactedInput = true; + return {...x, inputs: x.inputs.map((y) => ({type: y.type, input: 'Removed by compaction'}))}; + } return x; + }); + if(compactedInput) { + await this.db.update(playEvents).set({data: transformEvent.data}).where(eq(playEvents.id, transformEvent.id)); } - return {...x, inputs: x.inputs.map(y => ({type: y.type, input: 'Removed by compaction'}))}; - }); + } } } @@ -466,9 +466,6 @@ export class DrizzlePlayRepository extends DrizzleBaseRepository<'plays'> { const vals: Parameters[0] = { compacted: compactedFlags.join('-') }; - if(compactedPlay !== undefined) { - vals.play = compactedPlay; - } await this.db.update(plays).set(vals).where(eq(plays.id, id)); } loggerCom.trace(`Compacted ${ids.length} '${retentionType}' plays`); diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index 78c0bb62..5d62c7ab 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -1362,7 +1362,7 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i queueState.queueStatus = 'completed'; events.push({eventName: PLAY_EVENT_TYPE.queueStateChange, data: queueStateToEventData(queueState), createdAt: dayjs()}); } - this.playEventsRepo.createMany(events.map(x => ({...x, playId: currQueuedPlay.id}))); + await this.playEventsRepo.createMany(events.map(x => ({...x, playId: currQueuedPlay.id}))); this.emitPlayUpdate({...currQueuedPlay, queueStates: [queueState]} as unknown as PlayApiCommonDetailed); this.emitEvent('scrobbleDequeued', { queuedScrobble: currQueuedPlay }) this.queuedGauge.labels(this.getPrometheusLabels()).dec(); @@ -1579,7 +1579,7 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i events.push({eventName: PLAY_EVENT_TYPE.queueStateChange, data: queueStateToEventData({...deadQueueState, queueStatus: 'failed', error: e}), createdAt: dayjs()}); } } finally { - this.playEventsRepo.createMany(events.map(x => ({...x, playId: deadScrobble.id}))); + await this.playEventsRepo.createMany(events.map(x => ({...x, playId: deadScrobble.id}))); } } diff --git a/src/backend/sources/AbstractSource.ts b/src/backend/sources/AbstractSource.ts index 5e2b4a28..75e130d9 100644 --- a/src/backend/sources/AbstractSource.ts +++ b/src/backend/sources/AbstractSource.ts @@ -1048,8 +1048,8 @@ export default abstract class AbstractSource extends AbstractComponent implement updatedQueueState.queueStatus = 'failed'; events.push({eventName: PLAY_EVENT_TYPE.queueStateChange, data: queueStateToEventData({...queueState, ...updatedQueueState}), createdAt: dayjs()}); } finally { - this.queueRepo.updateById(queueState.id, updatedQueueState); - this.playEventsRepo.createMany(events.map(x => ({...x, playId: currQueuedPlay.id}))); + await this.queueRepo.updateById(queueState.id, updatedQueueState); + await this.playEventsRepo.createMany(events.map(x => ({...x, playId: currQueuedPlay.id}))); } if(state === 'discovered') { -- 2.51.2