From ace0376ad5304274fd12fc4e04bf32e0a1c67442 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:47:50 -0600 Subject: [PATCH] add favorite episode support to bookmarks also delete unused bookmark file --- .../migration.sql | 2 + prisma/schema.prisma | 11 +-- server/routes/users/[id]/bookmarks.ts | 79 +++++-------------- .../users/[id]/bookmarks/[tmdbid]/index.ts | 22 +++++- server/routes/users/bookmark.ts | 1 - 5 files changed, 48 insertions(+), 67 deletions(-) create mode 100644 prisma/migrations/20250929230057_add_favorite_episode_array_to_bookmarks/migration.sql delete mode 100644 server/routes/users/bookmark.ts diff --git a/prisma/migrations/20250929230057_add_favorite_episode_array_to_bookmarks/migration.sql b/prisma/migrations/20250929230057_add_favorite_episode_array_to_bookmarks/migration.sql new file mode 100644 index 0000000..b8496fc --- /dev/null +++ b/prisma/migrations/20250929230057_add_favorite_episode_array_to_bookmarks/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "bookmarks" ADD COLUMN "favorite_episodes" TEXT[] DEFAULT ARRAY[]::TEXT[]; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a19b47d..a09cdb2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -9,11 +9,12 @@ datasource db { } model bookmarks { - tmdb_id String @db.VarChar(255) - user_id String @db.VarChar(255) - meta Json - updated_at DateTime @db.Timestamptz(0) - group String[] + tmdb_id String @db.VarChar(255) + user_id String @db.VarChar(255) + meta Json + updated_at DateTime @db.Timestamptz(0) + group String[] + favorite_episodes String[] @default([]) @@id([tmdb_id, user_id]) @@unique([tmdb_id, user_id], map: "bookmarks_tmdb_id_user_id_unique") diff --git a/server/routes/users/[id]/bookmarks.ts b/server/routes/users/[id]/bookmarks.ts index d48537e..c6a601f 100644 --- a/server/routes/users/[id]/bookmarks.ts +++ b/server/routes/users/[id]/bookmarks.ts @@ -1,6 +1,15 @@ import { useAuth } from '~/utils/auth'; import { z } from 'zod'; +interface BookmarkWithFavorites { + tmdb_id: string; + user_id: string; + meta: any; + group: string[]; + favorite_episodes: string[]; + updated_at: Date; +} + const bookmarkMetaSchema = z.object({ title: z.string(), year: z.number().optional(), @@ -12,6 +21,7 @@ const bookmarkDataSchema = z.object({ tmdbId: z.string(), meta: bookmarkMetaSchema, group: z.union([z.string(), z.array(z.string())]).optional(), + favoriteEpisodes: z.array(z.string()).optional(), }); export default defineEventHandler(async event => { @@ -32,10 +42,11 @@ export default defineEventHandler(async event => { where: { user_id: userId }, }); - return bookmarks.map(bookmark => ({ + return bookmarks.map((bookmark: BookmarkWithFavorites) => ({ tmdbId: bookmark.tmdb_id, meta: bookmark.meta, group: bookmark.group, + favoriteEpisodes: bookmark.favorite_episodes, updatedAt: bookmark.updated_at, })); } @@ -53,6 +64,9 @@ export default defineEventHandler(async event => { ? (Array.isArray(item.group) ? item.group : [item.group]) : []; + // Normalize favoriteEpisodes to always be an array + const normalizedFavoriteEpisodes = item.favoriteEpisodes || []; + const bookmark = await prisma.bookmarks.upsert({ where: { tmdb_id_user_id: { @@ -63,21 +77,24 @@ export default defineEventHandler(async event => { update: { meta: item.meta, group: normalizedGroup, + favorite_episodes: normalizedFavoriteEpisodes, updated_at: now, - }, + } as any, create: { tmdb_id: item.tmdbId, user_id: userId, meta: item.meta, group: normalizedGroup, + favorite_episodes: normalizedFavoriteEpisodes, updated_at: now, - }, - }); + } as any, + }) as BookmarkWithFavorites; results.push({ tmdbId: bookmark.tmdb_id, meta: bookmark.meta, group: bookmark.group, + favoriteEpisodes: bookmark.favorite_episodes, updatedAt: bookmark.updated_at, }); } @@ -85,60 +102,6 @@ export default defineEventHandler(async event => { return results; } - const segments = event.path.split('/'); - const tmdbId = segments[segments.length - 1]; - - if (method === 'POST') { - const body = await readBody(event); - const validatedBody = bookmarkDataSchema.parse(body); - - const existing = await prisma.bookmarks.findUnique({ - where: { - tmdb_id_user_id: { - tmdb_id: tmdbId, - user_id: userId, - }, - }, - }); - - if (existing) { - throw createError({ - statusCode: 400, - message: 'Already bookmarked', - }); - } - - const bookmark = await prisma.bookmarks.create({ - data: { - tmdb_id: tmdbId, - user_id: userId, - meta: validatedBody.meta, - updated_at: new Date(), - }, - }); - - return { - tmdbId: bookmark.tmdb_id, - meta: bookmark.meta, - group: bookmark.group, - updatedAt: bookmark.updated_at, - }; - } - - if (method === 'DELETE') { - try { - await prisma.bookmarks.delete({ - where: { - tmdb_id_user_id: { - tmdb_id: tmdbId, - user_id: userId, - }, - }, - }); - } catch (error) {} - - return { tmdbId }; - } throw createError({ statusCode: 405, diff --git a/server/routes/users/[id]/bookmarks/[tmdbid]/index.ts b/server/routes/users/[id]/bookmarks/[tmdbid]/index.ts index be4ec4b..25673d2 100644 --- a/server/routes/users/[id]/bookmarks/[tmdbid]/index.ts +++ b/server/routes/users/[id]/bookmarks/[tmdbid]/index.ts @@ -2,6 +2,15 @@ import { useAuth } from '~/utils/auth'; import { z } from 'zod'; import { scopedLogger } from '~/utils/logger'; +interface BookmarkWithFavorites { + tmdb_id: string; + user_id: string; + meta: any; + group: string[]; + favorite_episodes: string[]; + updated_at: Date; +} + const log = scopedLogger('user-bookmarks'); const bookmarkMetaSchema = z.object({ @@ -16,6 +25,7 @@ const bookmarkRequestSchema = z.object({ meta: bookmarkMetaSchema.optional(), tmdbId: z.string().optional(), group: z.union([z.string(), z.array(z.string())]).optional(), + favoriteEpisodes: z.array(z.string()).optional(), }); export default defineEventHandler(async event => { @@ -53,6 +63,9 @@ export default defineEventHandler(async event => { ? (Array.isArray(groupFromBody) ? groupFromBody : [groupFromBody]) : []; + // Normalize favoriteEpisodes to always be an array + const normalizedFavoriteEpisodes = validatedRequest.favoriteEpisodes || []; + const bookmark = await prisma.bookmarks.upsert({ where: { tmdb_id_user_id: { @@ -63,16 +76,18 @@ export default defineEventHandler(async event => { update: { meta: validatedMeta, group: normalizedGroup, + favorite_episodes: normalizedFavoriteEpisodes, updated_at: new Date(), - }, + } as any, create: { user_id: session.user, tmdb_id: tmdbId, meta: validatedMeta, group: normalizedGroup, + favorite_episodes: normalizedFavoriteEpisodes, updated_at: new Date(), - }, - }); + } as any, + }) as BookmarkWithFavorites; log.info('Bookmark created successfully', { userId, tmdbId }); @@ -80,6 +95,7 @@ export default defineEventHandler(async event => { tmdbId: bookmark.tmdb_id, meta: bookmark.meta, group: bookmark.group, + favoriteEpisodes: bookmark.favorite_episodes, updatedAt: bookmark.updated_at, }; } catch (error) { diff --git a/server/routes/users/bookmark.ts b/server/routes/users/bookmark.ts deleted file mode 100644 index 2d285b5..0000000 --- a/server/routes/users/bookmark.ts +++ /dev/null @@ -1 +0,0 @@ -import { prisma } from '~/utils/prisma';