From 591888e97a9a07a78fadd0070f8c2df4900a9331 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 9 Oct 2026 20:00:35 +0000 Subject: [PATCH] fix: correctly merge edit data with non-form play data --- src/backend/common/AbstractComponent.ts | 18 +++++++++++++++--- src/backend/server/api.ts | 8 +++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/backend/common/AbstractComponent.ts b/src/backend/common/AbstractComponent.ts index c3ea03a4..d47a6849 100644 --- a/src/backend/common/AbstractComponent.ts +++ b/src/backend/common/AbstractComponent.ts @@ -1116,15 +1116,27 @@ export default abstract class AbstractComponent extends AbstractInitializable { abstract processPlay(playEntity: PlaySelectWithQueueStates, signal?: AbortSignal): Promise - public async updatePlay(uid: string, data: Partial): Promise { + public async updatePlay(uid: string, data: Partial): Promise { const playRow = await this.playRepo.findByUidWith<'events'>(uid, ['events']); if(playRow === undefined) { throw new SimpleError(`No play exists with uid ${uid}`); } const original = JSON.parse(JSON.stringify(playRow.play)); - playRow.play.data = { - ...data + const merged: PlayData = { + ...playRow.play.data, + ...data, + repeat: playRow.play.data.repeat }; + const samePlayDate = data.playDate?.isSame(playRow.play.data.playDate); + + if(playRow.play.data.listenRanges !== undefined && samePlayDate) { + merged.listenRanges = playRow.play.data.listenRanges + merged.playDateCompleted = playRow.play.data.playDateCompleted; + } else if(data.listenedFor !== undefined) { + merged.playDateCompleted = data.playDate?.add(data.listenedFor, 's') + } + + playRow.play.data = merged; const modified = JSON.parse(JSON.stringify(playRow.play)); const patch = diffObjects(original, modified); const event = playUpdateToEvent({input: {data}, patch}); diff --git a/src/backend/server/api.ts b/src/backend/server/api.ts index 0e350f60..36844956 100644 --- a/src/backend/server/api.ts +++ b/src/backend/server/api.ts @@ -13,6 +13,7 @@ import { albumSearchToMusicService, artistSearchToMusicService, playEditStrictCreateSchema, + type PlayObject, } from "../../core/Atomic.ts"; import type {LeveledLogData} from "../common/infrastructure/Atomic.ts"; import { getRoot } from "../ioc.ts"; @@ -42,6 +43,7 @@ import pMap from "p-map"; import type { PlayWith } from "../common/database/drizzle/drizzleTypes.ts"; import { stripIndents } from "common-tags"; import { nameToCredit } from "../../core/MusicMetadata.ts"; +import { asPlayCheap } from "../../core/PlayMarshalUtils.ts"; const maxBufferSize = 300; const output: Record> = {}; @@ -497,9 +499,9 @@ Note: this is only supported by some components.` body } = req; - const playRes = await component.updatePlay(playUid as string, body.data); - //PlayApiCommonDetailed - // plus paginatioon + const play: PlayObject = asPlayCheap(body); + + const playRes = await component.updatePlay(playUid as string, play.data); return res.json(asSerializablePlaySelect(playRes)); }); -- 2.54.0