From 46a0af9401d065a1c637a6c5f8bd89f2d73afc1b Mon Sep 17 00:00:00 2001 From: Aykhan Date: Thu, 23 Oct 2025 18:55:56 +0400 Subject: [PATCH] fix: prevent overwriting settings with defaults --- server/routes/users/[id]/settings.ts | 29 +++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/server/routes/users/[id]/settings.ts b/server/routes/users/[id]/settings.ts index 431b952..868e486 100644 --- a/server/routes/users/[id]/settings.ts +++ b/server/routes/users/[id]/settings.ts @@ -114,11 +114,11 @@ export default defineEventHandler(async event => { const validatedBody = userSettingsSchema.parse(body); - const data = { + const createData = { application_theme: validatedBody.applicationTheme ?? null, application_language: validatedBody.applicationLanguage, default_subtitle_language: validatedBody.defaultSubtitleLanguage ?? null, - proxy_urls: validatedBody.proxyUrls === null ? [] : validatedBody.proxyUrls || [], + proxy_urls: validatedBody.proxyUrls === null ? [] : (validatedBody.proxyUrls || []), trakt_key: validatedBody.traktKey ?? null, febbox_key: validatedBody.febboxKey ?? null, enable_thumbnails: validatedBody.enableThumbnails, @@ -134,14 +134,33 @@ export default defineEventHandler(async event => { proxy_tmdb: validatedBody.proxyTmdb, }; - log.info('Preparing to upsert settings', { userId, data }); + const updateData: Partial = {}; + if (Object.prototype.hasOwnProperty.call(body, 'applicationTheme')) updateData.application_theme = createData.application_theme; + if (Object.prototype.hasOwnProperty.call(body, 'applicationLanguage')) updateData.application_language = createData.application_language; + if (Object.prototype.hasOwnProperty.call(body, 'defaultSubtitleLanguage')) updateData.default_subtitle_language = createData.default_subtitle_language; + if (Object.prototype.hasOwnProperty.call(body, 'proxyUrls')) updateData.proxy_urls = createData.proxy_urls; + if (Object.prototype.hasOwnProperty.call(body, 'traktKey')) updateData.trakt_key = createData.trakt_key; + if (Object.prototype.hasOwnProperty.call(body, 'febboxKey')) updateData.febbox_key = createData.febbox_key; + if (Object.prototype.hasOwnProperty.call(body, 'enableThumbnails')) updateData.enable_thumbnails = createData.enable_thumbnails; + if (Object.prototype.hasOwnProperty.call(body, 'enableAutoplay')) updateData.enable_autoplay = createData.enable_autoplay; + if (Object.prototype.hasOwnProperty.call(body, 'enableSkipCredits')) updateData.enable_skip_credits = createData.enable_skip_credits; + if (Object.prototype.hasOwnProperty.call(body, 'enableDiscover')) updateData.enable_discover = createData.enable_discover; + if (Object.prototype.hasOwnProperty.call(body, 'enableFeatured')) updateData.enable_featured = createData.enable_featured; + if (Object.prototype.hasOwnProperty.call(body, 'enableDetailsModal')) updateData.enable_details_modal = createData.enable_details_modal; + if (Object.prototype.hasOwnProperty.call(body, 'enableImageLogos')) updateData.enable_image_logos = createData.enable_image_logos; + if (Object.prototype.hasOwnProperty.call(body, 'enableCarouselView')) updateData.enable_carousel_view = createData.enable_carousel_view; + if (Object.prototype.hasOwnProperty.call(body, 'sourceOrder')) updateData.source_order = createData.source_order; + if (Object.prototype.hasOwnProperty.call(body, 'enableSourceOrder')) updateData.enable_source_order = createData.enable_source_order; + if (Object.prototype.hasOwnProperty.call(body, 'proxyTmdb')) updateData.proxy_tmdb = createData.proxy_tmdb; + + log.info('Preparing to upsert settings', { userId, updateData, createData: { id: userId, ...createData } }); const settings = await prisma.user_settings.upsert({ where: { id: userId }, - update: data, + update: updateData, create: { id: userId, - ...data, + ...createData, }, }) as unknown as UserSettings;