From 951e6d2d39763ab2401109d38ca2532c35860c0b Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 5 Jun 2025 22:46:45 -0600 Subject: [PATCH] add (almost) every user preference --- .../migration.sql | 12 ++++ prisma/schema.prisma | 11 +++ server/routes/users/[id]/settings.ts | 69 ++++++++++++++++++- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20250606034630_add_user_preferences/migration.sql diff --git a/prisma/migrations/20250606034630_add_user_preferences/migration.sql b/prisma/migrations/20250606034630_add_user_preferences/migration.sql new file mode 100644 index 0000000..8cda611 --- /dev/null +++ b/prisma/migrations/20250606034630_add_user_preferences/migration.sql @@ -0,0 +1,12 @@ +-- AlterTable +ALTER TABLE "user_settings" ADD COLUMN "enable_autoplay" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "enable_carousel_view" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_details_modal" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_discover" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "enable_featured" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_image_logos" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "enable_skip_credits" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "enable_source_order" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_thumbnails" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "proxy_tmdb" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "source_order" TEXT[] DEFAULT ARRAY[]::TEXT[]; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4d3f84c..86f5262 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -66,6 +66,17 @@ model user_settings { proxy_urls String[] trakt_key String? @db.VarChar(255) febbox_key String? @db.VarChar(255) + enable_thumbnails Boolean @default(false) + enable_autoplay Boolean @default(true) + enable_skip_credits Boolean @default(true) + enable_discover Boolean @default(true) + enable_featured Boolean @default(false) + enable_details_modal Boolean @default(false) + enable_image_logos Boolean @default(true) + enable_carousel_view Boolean @default(false) + source_order String[] @default([]) + enable_source_order Boolean @default(false) + proxy_tmdb Boolean @default(false) } model users { diff --git a/server/routes/users/[id]/settings.ts b/server/routes/users/[id]/settings.ts index cb9f105..431b952 100644 --- a/server/routes/users/[id]/settings.ts +++ b/server/routes/users/[id]/settings.ts @@ -4,6 +4,27 @@ import { scopedLogger } from '~/utils/logger'; const log = scopedLogger('user-settings'); +interface UserSettings { + id: string; + application_theme: string | null; + application_language: string; + default_subtitle_language: string | null; + proxy_urls: string[]; + trakt_key: string | null; + febbox_key: string | null; + enable_thumbnails: boolean; + enable_autoplay: boolean; + enable_skip_credits: boolean; + enable_discover: boolean; + enable_featured: boolean; + enable_details_modal: boolean; + enable_image_logos: boolean; + enable_carousel_view: boolean; + source_order: string[]; + enable_source_order: boolean; + proxy_tmdb: boolean; +} + const userSettingsSchema = z.object({ applicationTheme: z.string().nullable().optional(), applicationLanguage: z.string().optional().default('en'), @@ -11,6 +32,17 @@ const userSettingsSchema = z.object({ proxyUrls: z.array(z.string()).nullable().optional(), traktKey: z.string().nullable().optional(), febboxKey: z.string().nullable().optional(), + enableThumbnails: z.boolean().optional().default(false), + enableAutoplay: z.boolean().optional().default(true), + enableSkipCredits: z.boolean().optional().default(true), + enableDiscover: z.boolean().optional().default(true), + enableFeatured: z.boolean().optional().default(false), + enableDetailsModal: z.boolean().optional().default(false), + enableImageLogos: z.boolean().optional().default(true), + enableCarouselView: z.boolean().optional().default(false), + sourceOrder: z.array(z.string()).optional().default([]), + enableSourceOrder: z.boolean().optional().default(false), + proxyTmdb: z.boolean().optional().default(false), }); export default defineEventHandler(async event => { @@ -41,7 +73,7 @@ export default defineEventHandler(async event => { try { const settings = await prisma.user_settings.findUnique({ where: { id: userId }, - }); + }) as unknown as UserSettings | null; return { id: userId, @@ -51,6 +83,17 @@ 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, + enableThumbnails: settings?.enable_thumbnails ?? false, + enableAutoplay: settings?.enable_autoplay ?? true, + enableSkipCredits: settings?.enable_skip_credits ?? true, + enableDiscover: settings?.enable_discover ?? true, + enableFeatured: settings?.enable_featured ?? false, + enableDetailsModal: settings?.enable_details_modal ?? false, + enableImageLogos: settings?.enable_image_logos ?? true, + enableCarouselView: settings?.enable_carousel_view ?? false, + sourceOrder: settings?.source_order || [], + enableSourceOrder: settings?.enable_source_order ?? false, + proxyTmdb: settings?.proxy_tmdb ?? false, }; } catch (error) { log.error('Failed to get user settings', { @@ -78,6 +121,17 @@ export default defineEventHandler(async event => { proxy_urls: validatedBody.proxyUrls === null ? [] : validatedBody.proxyUrls || [], trakt_key: validatedBody.traktKey ?? null, febbox_key: validatedBody.febboxKey ?? null, + enable_thumbnails: validatedBody.enableThumbnails, + enable_autoplay: validatedBody.enableAutoplay, + enable_skip_credits: validatedBody.enableSkipCredits, + enable_discover: validatedBody.enableDiscover, + enable_featured: validatedBody.enableFeatured, + enable_details_modal: validatedBody.enableDetailsModal, + enable_image_logos: validatedBody.enableImageLogos, + enable_carousel_view: validatedBody.enableCarouselView, + source_order: validatedBody.sourceOrder || [], + enable_source_order: validatedBody.enableSourceOrder, + proxy_tmdb: validatedBody.proxyTmdb, }; log.info('Preparing to upsert settings', { userId, data }); @@ -89,7 +143,7 @@ export default defineEventHandler(async event => { id: userId, ...data, }, - }); + }) as unknown as UserSettings; log.info('Settings updated successfully', { userId }); @@ -101,6 +155,17 @@ export default defineEventHandler(async event => { proxyUrls: settings.proxy_urls.length === 0 ? null : settings.proxy_urls, traktKey: settings.trakt_key, febboxKey: settings.febbox_key, + enableThumbnails: settings.enable_thumbnails, + enableAutoplay: settings.enable_autoplay, + enableSkipCredits: settings.enable_skip_credits, + enableDiscover: settings.enable_discover, + enableFeatured: settings.enable_featured, + enableDetailsModal: settings.enable_details_modal, + enableImageLogos: settings.enable_image_logos, + enableCarouselView: settings.enable_carousel_view, + sourceOrder: settings.source_order, + enableSourceOrder: settings.enable_source_order, + proxyTmdb: settings.proxy_tmdb, }; } catch (error) { log.error('Failed to update user settings', {