From 46a0af9401d065a1c637a6c5f8bd89f2d73afc1b Mon Sep 17 00:00:00 2001 From: Aykhan Date: Thu, 23 Oct 2025 18:55:56 +0400 Subject: [PATCH 1/6] 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; From b38f7c1c2ad6dc851fe466bfa7b5013fe08dcdc8 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:23:12 -0600 Subject: [PATCH 2/6] add missing settings --- .../migration.sql | 13 ++++ prisma/schema.prisma | 12 ++++ server/routes/users/[id]/settings.ts | 72 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 prisma/migrations/20251023152211_add_missing_settings/migration.sql diff --git a/prisma/migrations/20251023152211_add_missing_settings/migration.sql b/prisma/migrations/20251023152211_add_missing_settings/migration.sql new file mode 100644 index 0000000..96a9419 --- /dev/null +++ b/prisma/migrations/20251023152211_add_missing_settings/migration.sql @@ -0,0 +1,13 @@ +-- AlterTable +ALTER TABLE "user_settings" ADD COLUMN "disabled_embeds" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "disabled_sources" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "embed_order" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "enable_double_click_to_seek" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_embed_order" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_hold_to_boost" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_low_performance_mode" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_native_subtitles" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "force_compact_episode_view" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "home_section_order" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "manual_source_selection" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "real_debrid_key" VARCHAR(255); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a09cdb2..4e49248 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -68,6 +68,7 @@ model user_settings { proxy_urls String[] trakt_key String? @db.VarChar(255) febbox_key String? @db.VarChar(255) + real_debrid_key String? @db.VarChar(255) enable_thumbnails Boolean @default(false) enable_autoplay Boolean @default(true) enable_skip_credits Boolean @default(true) @@ -76,9 +77,20 @@ model user_settings { enable_details_modal Boolean @default(false) enable_image_logos Boolean @default(true) enable_carousel_view Boolean @default(false) + force_compact_episode_view Boolean @default(false) source_order String[] @default([]) enable_source_order Boolean @default(false) + disabled_sources String[] @default([]) + embed_order String[] @default([]) + enable_embed_order Boolean @default(false) + disabled_embeds String[] @default([]) proxy_tmdb Boolean @default(false) + enable_low_performance_mode Boolean @default(false) + enable_native_subtitles Boolean @default(false) + enable_hold_to_boost Boolean @default(false) + home_section_order String[] @default([]) + manual_source_selection Boolean @default(false) + enable_double_click_to_seek Boolean @default(false) } model users { diff --git a/server/routes/users/[id]/settings.ts b/server/routes/users/[id]/settings.ts index 868e486..71437dd 100644 --- a/server/routes/users/[id]/settings.ts +++ b/server/routes/users/[id]/settings.ts @@ -12,6 +12,7 @@ interface UserSettings { proxy_urls: string[]; trakt_key: string | null; febbox_key: string | null; + real_debrid_key: string | null; enable_thumbnails: boolean; enable_autoplay: boolean; enable_skip_credits: boolean; @@ -20,9 +21,20 @@ interface UserSettings { enable_details_modal: boolean; enable_image_logos: boolean; enable_carousel_view: boolean; + force_compact_episode_view: boolean; source_order: string[]; enable_source_order: boolean; + disabled_sources: string[]; + embed_order: string[]; + enable_embed_order: boolean; + disabled_embeds: string[]; proxy_tmdb: boolean; + enable_low_performance_mode: boolean; + enable_native_subtitles: boolean; + enable_hold_to_boost: boolean; + home_section_order: string[]; + manual_source_selection: boolean; + enable_double_click_to_seek: boolean; } const userSettingsSchema = z.object({ @@ -32,6 +44,7 @@ const userSettingsSchema = z.object({ proxyUrls: z.array(z.string()).nullable().optional(), traktKey: z.string().nullable().optional(), febboxKey: z.string().nullable().optional(), + realDebridKey: z.string().nullable().optional(), enableThumbnails: z.boolean().optional().default(false), enableAutoplay: z.boolean().optional().default(true), enableSkipCredits: z.boolean().optional().default(true), @@ -40,9 +53,20 @@ const userSettingsSchema = z.object({ enableDetailsModal: z.boolean().optional().default(false), enableImageLogos: z.boolean().optional().default(true), enableCarouselView: z.boolean().optional().default(false), + forceCompactEpisodeView: z.boolean().optional().default(false), sourceOrder: z.array(z.string()).optional().default([]), enableSourceOrder: z.boolean().optional().default(false), + disabledSources: z.array(z.string()).optional().default([]), + embedOrder: z.array(z.string()).optional().default([]), + enableEmbedOrder: z.boolean().optional().default(false), + disabledEmbeds: z.array(z.string()).optional().default([]), proxyTmdb: z.boolean().optional().default(false), + enableLowPerformanceMode: z.boolean().optional().default(false), + enableNativeSubtitles: z.boolean().optional().default(false), + enableHoldToBoost: z.boolean().optional().default(false), + homeSectionOrder: z.array(z.string()).optional().default([]), + manualSourceSelection: z.boolean().optional().default(false), + enableDoubleClickToSeek: z.boolean().optional().default(false), }); export default defineEventHandler(async event => { @@ -83,6 +107,7 @@ export default defineEventHandler(async event => { proxyUrls: settings?.proxy_urls.length === 0 ? null : settings?.proxy_urls || null, traktKey: settings?.trakt_key || null, febboxKey: settings?.febbox_key || null, + realDebridKey: settings?.real_debrid_key || null, enableThumbnails: settings?.enable_thumbnails ?? false, enableAutoplay: settings?.enable_autoplay ?? true, enableSkipCredits: settings?.enable_skip_credits ?? true, @@ -91,9 +116,20 @@ export default defineEventHandler(async event => { enableDetailsModal: settings?.enable_details_modal ?? false, enableImageLogos: settings?.enable_image_logos ?? true, enableCarouselView: settings?.enable_carousel_view ?? false, + forceCompactEpisodeView: settings?.force_compact_episode_view ?? false, sourceOrder: settings?.source_order || [], enableSourceOrder: settings?.enable_source_order ?? false, + disabledSources: settings?.disabled_sources || [], + embedOrder: settings?.embed_order || [], + enableEmbedOrder: settings?.enable_embed_order ?? false, + disabledEmbeds: settings?.disabled_embeds || [], proxyTmdb: settings?.proxy_tmdb ?? false, + enableLowPerformanceMode: settings?.enable_low_performance_mode ?? false, + enableNativeSubtitles: settings?.enable_native_subtitles ?? false, + enableHoldToBoost: settings?.enable_hold_to_boost ?? false, + homeSectionOrder: settings?.home_section_order || [], + manualSourceSelection: settings?.manual_source_selection ?? false, + enableDoubleClickToSeek: settings?.enable_double_click_to_seek ?? false, }; } catch (error) { log.error('Failed to get user settings', { @@ -121,6 +157,7 @@ export default defineEventHandler(async event => { proxy_urls: validatedBody.proxyUrls === null ? [] : (validatedBody.proxyUrls || []), trakt_key: validatedBody.traktKey ?? null, febbox_key: validatedBody.febboxKey ?? null, + real_debrid_key: validatedBody.realDebridKey ?? null, enable_thumbnails: validatedBody.enableThumbnails, enable_autoplay: validatedBody.enableAutoplay, enable_skip_credits: validatedBody.enableSkipCredits, @@ -129,9 +166,20 @@ export default defineEventHandler(async event => { enable_details_modal: validatedBody.enableDetailsModal, enable_image_logos: validatedBody.enableImageLogos, enable_carousel_view: validatedBody.enableCarouselView, + force_compact_episode_view: validatedBody.forceCompactEpisodeView, source_order: validatedBody.sourceOrder || [], enable_source_order: validatedBody.enableSourceOrder, + disabled_sources: validatedBody.disabledSources || [], + embed_order: validatedBody.embedOrder || [], + enable_embed_order: validatedBody.enableEmbedOrder, + disabled_embeds: validatedBody.disabledEmbeds || [], proxy_tmdb: validatedBody.proxyTmdb, + enable_low_performance_mode: validatedBody.enableLowPerformanceMode, + enable_native_subtitles: validatedBody.enableNativeSubtitles, + enable_hold_to_boost: validatedBody.enableHoldToBoost, + home_section_order: validatedBody.homeSectionOrder || [], + manual_source_selection: validatedBody.manualSourceSelection, + enable_double_click_to_seek: validatedBody.enableDoubleClickToSeek, }; const updateData: Partial = {}; @@ -141,6 +189,7 @@ export default defineEventHandler(async event => { 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, 'realDebridKey')) updateData.real_debrid_key = createData.real_debrid_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; @@ -149,9 +198,20 @@ export default defineEventHandler(async event => { 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, 'forceCompactEpisodeView')) updateData.force_compact_episode_view = createData.force_compact_episode_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, 'disabledSources')) updateData.disabled_sources = createData.disabled_sources; + if (Object.prototype.hasOwnProperty.call(body, 'embedOrder')) updateData.embed_order = createData.embed_order; + if (Object.prototype.hasOwnProperty.call(body, 'enableEmbedOrder')) updateData.enable_embed_order = createData.enable_embed_order; + if (Object.prototype.hasOwnProperty.call(body, 'disabledEmbeds')) updateData.disabled_embeds = createData.disabled_embeds; if (Object.prototype.hasOwnProperty.call(body, 'proxyTmdb')) updateData.proxy_tmdb = createData.proxy_tmdb; + if (Object.prototype.hasOwnProperty.call(body, 'enableLowPerformanceMode')) updateData.enable_low_performance_mode = createData.enable_low_performance_mode; + if (Object.prototype.hasOwnProperty.call(body, 'enableNativeSubtitles')) updateData.enable_native_subtitles = createData.enable_native_subtitles; + if (Object.prototype.hasOwnProperty.call(body, 'enableHoldToBoost')) updateData.enable_hold_to_boost = createData.enable_hold_to_boost; + if (Object.prototype.hasOwnProperty.call(body, 'homeSectionOrder')) updateData.home_section_order = createData.home_section_order; + if (Object.prototype.hasOwnProperty.call(body, 'manualSourceSelection')) updateData.manual_source_selection = createData.manual_source_selection; + if (Object.prototype.hasOwnProperty.call(body, 'enableDoubleClickToSeek')) updateData.enable_double_click_to_seek = createData.enable_double_click_to_seek; log.info('Preparing to upsert settings', { userId, updateData, createData: { id: userId, ...createData } }); @@ -174,6 +234,7 @@ export default defineEventHandler(async event => { proxyUrls: settings.proxy_urls.length === 0 ? null : settings.proxy_urls, traktKey: settings.trakt_key, febboxKey: settings.febbox_key, + realDebridKey: settings.real_debrid_key, enableThumbnails: settings.enable_thumbnails, enableAutoplay: settings.enable_autoplay, enableSkipCredits: settings.enable_skip_credits, @@ -182,9 +243,20 @@ export default defineEventHandler(async event => { enableDetailsModal: settings.enable_details_modal, enableImageLogos: settings.enable_image_logos, enableCarouselView: settings.enable_carousel_view, + forceCompactEpisodeView: settings.force_compact_episode_view, sourceOrder: settings.source_order, enableSourceOrder: settings.enable_source_order, + disabledSources: settings.disabled_sources, + embedOrder: settings.embed_order, + enableEmbedOrder: settings.enable_embed_order, + disabledEmbeds: settings.disabled_embeds, proxyTmdb: settings.proxy_tmdb, + enableLowPerformanceMode: settings.enable_low_performance_mode, + enableNativeSubtitles: settings.enable_native_subtitles, + enableHoldToBoost: settings.enable_hold_to_boost, + homeSectionOrder: settings.home_section_order, + manualSourceSelection: settings.manual_source_selection, + enableDoubleClickToSeek: settings.enable_double_click_to_seek, }; } catch (error) { log.error('Failed to update user settings', { From 133e59a92380fbac8d7dd0ed2461a7a6d5624e2c Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:24:49 -0600 Subject: [PATCH 3/6] increase watchparty cleanup to 30 min --- server/api/player/README.md | 4 ++-- server/api/player/status.get.ts | 2 +- server/utils/playerStatus.ts | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/api/player/README.md b/server/api/player/README.md index 979c10a..044837a 100644 --- a/server/api/player/README.md +++ b/server/api/player/README.md @@ -1,6 +1,6 @@ # Player Status API -This API allows for tracking and retrieving player status data for users in watch party rooms. Status data is automatically cleaned up if it's older than 1 minute. +This API allows for tracking and retrieving player status data for users in watch party rooms. Status data is automatically cleaned up if it's older than 30 minutes. ## Endpoints @@ -142,6 +142,6 @@ Get status updates for all users in a specific room. ## Notes -- Status data is automatically cleaned up if it's older than 1 minute +- Status data is automatically cleaned up if it's older than 30 minutes - The system keeps a maximum of 5 status updates per user per room - Timestamps are in milliseconds since epoch (Unix timestamp) diff --git a/server/api/player/status.get.ts b/server/api/player/status.get.ts index 60c424f..3dd5c52 100644 --- a/server/api/player/status.get.ts +++ b/server/api/player/status.get.ts @@ -33,7 +33,7 @@ export default defineEventHandler(event => { const key = `${userId}:${roomCode}`; const statuses = playerStatusStore.get(key) || []; - // Remove statuses older than 15 minutes + // Remove statuses older than the cleanup interval (30 minutes) const cutoffTime = Date.now() - CLEANUP_INTERVAL; const recentStatuses = statuses.filter(status => status.timestamp >= cutoffTime); diff --git a/server/utils/playerStatus.ts b/server/utils/playerStatus.ts index 26a14b3..39bf3dc 100644 --- a/server/utils/playerStatus.ts +++ b/server/utils/playerStatus.ts @@ -30,8 +30,8 @@ export interface PlayerStatus { // Key: userId+roomCode, Value: Status data array export const playerStatusStore = new Map>(); -// Cleanup interval (1 minute in milliseconds) -export const CLEANUP_INTERVAL = 1 * 60 * 1000; +// Cleanup interval (30 minutes in milliseconds) +export const CLEANUP_INTERVAL = 30 * 60 * 1000; // Clean up old status entries function cleanupOldStatuses() { @@ -48,5 +48,5 @@ function cleanupOldStatuses() { } } -// Schedule cleanup every 1 minute -setInterval(cleanupOldStatuses, 1 * 60 * 1000); +// Schedule cleanup every 5 minutes +setInterval(cleanupOldStatuses, 5 * 60 * 1000); From 1815a5a37763219575de395c5f959df38a949662 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:56:21 -0600 Subject: [PATCH 4/6] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac31d75..7d6d432 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "2.0.8", + "version": "2.0.9", "scripts": { "build": "nitro build", "dev": "nitro dev", From d15be26cdee7e2b79e03a495fcebf9928be9821a Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 10:33:40 -0600 Subject: [PATCH 5/6] revert change --- server/routes/users/[id]/settings.ts | 41 ++++------------------------ 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/server/routes/users/[id]/settings.ts b/server/routes/users/[id]/settings.ts index 71437dd..823429f 100644 --- a/server/routes/users/[id]/settings.ts +++ b/server/routes/users/[id]/settings.ts @@ -150,11 +150,11 @@ export default defineEventHandler(async event => { const validatedBody = userSettingsSchema.parse(body); - const createData = { + const data = { 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, real_debrid_key: validatedBody.realDebridKey ?? null, @@ -182,45 +182,14 @@ export default defineEventHandler(async event => { enable_double_click_to_seek: validatedBody.enableDoubleClickToSeek, }; - 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, 'realDebridKey')) updateData.real_debrid_key = createData.real_debrid_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, 'forceCompactEpisodeView')) updateData.force_compact_episode_view = createData.force_compact_episode_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, 'disabledSources')) updateData.disabled_sources = createData.disabled_sources; - if (Object.prototype.hasOwnProperty.call(body, 'embedOrder')) updateData.embed_order = createData.embed_order; - if (Object.prototype.hasOwnProperty.call(body, 'enableEmbedOrder')) updateData.enable_embed_order = createData.enable_embed_order; - if (Object.prototype.hasOwnProperty.call(body, 'disabledEmbeds')) updateData.disabled_embeds = createData.disabled_embeds; - if (Object.prototype.hasOwnProperty.call(body, 'proxyTmdb')) updateData.proxy_tmdb = createData.proxy_tmdb; - if (Object.prototype.hasOwnProperty.call(body, 'enableLowPerformanceMode')) updateData.enable_low_performance_mode = createData.enable_low_performance_mode; - if (Object.prototype.hasOwnProperty.call(body, 'enableNativeSubtitles')) updateData.enable_native_subtitles = createData.enable_native_subtitles; - if (Object.prototype.hasOwnProperty.call(body, 'enableHoldToBoost')) updateData.enable_hold_to_boost = createData.enable_hold_to_boost; - if (Object.prototype.hasOwnProperty.call(body, 'homeSectionOrder')) updateData.home_section_order = createData.home_section_order; - if (Object.prototype.hasOwnProperty.call(body, 'manualSourceSelection')) updateData.manual_source_selection = createData.manual_source_selection; - if (Object.prototype.hasOwnProperty.call(body, 'enableDoubleClickToSeek')) updateData.enable_double_click_to_seek = createData.enable_double_click_to_seek; - - log.info('Preparing to upsert settings', { userId, updateData, createData: { id: userId, ...createData } }); + log.info('Preparing to upsert settings', { userId, data }); const settings = await prisma.user_settings.upsert({ where: { id: userId }, - update: updateData, + update: data, create: { id: userId, - ...createData, + ...data, }, }) as unknown as UserSettings; From e82648ad209f84df489a374fc7bf8c9bad5e147d Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 10:34:57 -0600 Subject: [PATCH 6/6] bump v --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d6d432..563805d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "2.0.9", + "version": "2.0.10", "scripts": { "build": "nitro build", "dev": "nitro dev",