From bff354094e340f69b2ffb3a6ddf83f48cba86316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Sat, 7 Mar 2026 11:05:21 +0100 Subject: [PATCH] fix: add adminGetVideo/adminGetArticle queries to fix 404 on edit pages The edit page loaders were calling adminListVideos/adminListArticles with the old pre-pagination signatures and filtering by ID client-side, which broke after pagination limited results to 50. Now fetches the single item by ID directly via new adminGetVideo and adminGetArticle backend queries. Co-Authored-By: Claude Sonnet 4.6 --- .../backend/src/graphql/resolvers/articles.ts | 20 +++++ .../backend/src/graphql/resolvers/videos.ts | 16 ++++ packages/frontend/src/lib/services.ts | 83 +++++++++++++++++++ .../admin/articles/[id]/+page.server.ts | 9 +- .../routes/admin/videos/[id]/+page.server.ts | 11 ++- 5 files changed, 129 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/graphql/resolvers/articles.ts b/packages/backend/src/graphql/resolvers/articles.ts index 41cb1b6..6105b11 100644 --- a/packages/backend/src/graphql/resolvers/articles.ts +++ b/packages/backend/src/graphql/resolvers/articles.ts @@ -96,6 +96,26 @@ builder.queryField("article", (t) => }), ); +builder.queryField("adminGetArticle", (t) => + t.field({ + type: ArticleType, + nullable: true, + args: { + id: t.arg.string({ required: true }), + }, + resolve: async (_root, args, ctx) => { + requireAdmin(ctx); + const article = await ctx.db + .select() + .from(articles) + .where(eq(articles.id, args.id)) + .limit(1); + if (!article[0]) return null; + return enrichArticle(ctx.db, article[0]); + }, + }), +); + // ─── Admin queries & mutations ──────────────────────────────────────────────── builder.queryField("adminListArticles", (t) => diff --git a/packages/backend/src/graphql/resolvers/videos.ts b/packages/backend/src/graphql/resolvers/videos.ts index 9e31b0b..22b88fc 100644 --- a/packages/backend/src/graphql/resolvers/videos.ts +++ b/packages/backend/src/graphql/resolvers/videos.ts @@ -188,6 +188,22 @@ builder.queryField("video", (t) => }), ); +builder.queryField("adminGetVideo", (t) => + t.field({ + type: VideoType, + nullable: true, + args: { + id: t.arg.string({ required: true }), + }, + resolve: async (_root, args, ctx) => { + requireAdmin(ctx); + const video = await ctx.db.select().from(videos).where(eq(videos.id, args.id)).limit(1); + if (!video[0]) return null; + return enrichVideo(ctx.db, video[0]); + }, + }), +); + builder.queryField("videoLikeStatus", (t) => t.field({ type: VideoLikeStatusType, diff --git a/packages/frontend/src/lib/services.ts b/packages/frontend/src/lib/services.ts index 4082c69..94afa2f 100644 --- a/packages/frontend/src/lib/services.ts +++ b/packages/frontend/src/lib/services.ts @@ -1339,6 +1339,51 @@ export async function adminListVideos( }); } +const ADMIN_GET_VIDEO_QUERY = gql` + query AdminGetVideo($id: String!) { + adminGetVideo(id: $id) { + id + slug + title + description + image + movie + tags + upload_date + premium + featured + likes_count + plays_count + models { + id + artist_name + slug + avatar + } + movie_file { + id + filename + mime_type + duration + } + } + } +`; + +export async function adminGetVideo( + id: string, + fetchFn?: typeof globalThis.fetch, + token?: string, +): Promise