From ad7ceee5f80dc6a961765cdb08be76de30ea4787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Fri, 6 Mar 2026 12:35:11 +0100 Subject: [PATCH] fix: resolve lint errors from ACL/admin implementation - Remove unused requireOwnerOrAdmin import from videos.ts - Remove unused requireAuth import from users.ts - Remove unused GraphQLError import from articles.ts - Replace URLSearchParams with SvelteURLSearchParams in admin users page - Apply prettier formatting to all changed files Co-Authored-By: Claude Sonnet 4.6 --- CLAUDE.md | 16 ++--- .../backend/src/graphql/resolvers/articles.ts | 6 +- .../backend/src/graphql/resolvers/comments.ts | 6 +- .../backend/src/graphql/resolvers/users.ts | 2 +- .../backend/src/graphql/resolvers/videos.ts | 7 +-- packages/backend/src/graphql/types/index.ts | 12 ++-- packages/backend/src/lib/logger.ts | 12 +++- .../recording-card/recording-card.svelte | 5 +- .../frontend/src/routes/admin/+layout.svelte | 4 +- .../routes/admin/articles/[id]/+page.svelte | 23 +++---- .../routes/admin/articles/new/+page.svelte | 12 ++-- .../src/routes/admin/users/+page.svelte | 15 ++--- .../src/routes/admin/videos/+page.svelte | 3 +- .../src/routes/admin/videos/[id]/+page.svelte | 22 +++---- .../src/routes/admin/videos/new/+page.svelte | 23 ++++--- .../src/routes/magazine/[slug]/+page.svelte | 60 +++++++++---------- .../src/routes/sitemap.xml/+server.ts | 4 +- .../src/routes/users/[id]/+page.svelte | 10 ++-- 18 files changed, 112 insertions(+), 130 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 27f5fd0..fd88486 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -75,14 +75,14 @@ Points + achievements system tracked in `user_points` and `user_stats` tables. L ## Environment Variables (Backend) -| Variable | Purpose | -|----------|---------| -| `DATABASE_URL` | PostgreSQL connection string | -| `REDIS_URL` | Redis connection string | -| `COOKIE_SECRET` | Session cookie signing | -| `CORS_ORIGIN` | Frontend origin URL | -| `UPLOAD_DIR` | File storage path | -| `SMTP_HOST/PORT/EMAIL_FROM` | Email (Nodemailer) | +| Variable | Purpose | +| --------------------------- | ---------------------------- | +| `DATABASE_URL` | PostgreSQL connection string | +| `REDIS_URL` | Redis connection string | +| `COOKIE_SECRET` | Session cookie signing | +| `CORS_ORIGIN` | Frontend origin URL | +| `UPLOAD_DIR` | File storage path | +| `SMTP_HOST/PORT/EMAIL_FROM` | Email (Nodemailer) | ## Docker diff --git a/packages/backend/src/graphql/resolvers/articles.ts b/packages/backend/src/graphql/resolvers/articles.ts index 4c7f5d2..b0f5a6b 100644 --- a/packages/backend/src/graphql/resolvers/articles.ts +++ b/packages/backend/src/graphql/resolvers/articles.ts @@ -1,4 +1,3 @@ -import { GraphQLError } from "graphql"; import { builder } from "../builder"; import { ArticleType } from "../types/index"; import { articles, users } from "../../db/schema/index"; @@ -80,10 +79,7 @@ builder.queryField("adminListArticles", (t) => type: [ArticleType], resolve: async (_root, _args, ctx) => { requireRole(ctx, "admin"); - const articleList = await ctx.db - .select() - .from(articles) - .orderBy(desc(articles.publish_date)); + const articleList = await ctx.db.select().from(articles).orderBy(desc(articles.publish_date)); return Promise.all(articleList.map((article: any) => enrichArticle(ctx.db, article))); }, }), diff --git a/packages/backend/src/graphql/resolvers/comments.ts b/packages/backend/src/graphql/resolvers/comments.ts index 3015830..fc8ee3a 100644 --- a/packages/backend/src/graphql/resolvers/comments.ts +++ b/packages/backend/src/graphql/resolvers/comments.ts @@ -87,11 +87,7 @@ builder.mutationField("deleteComment", (t) => id: t.arg.int({ required: true }), }, resolve: async (_root, args, ctx) => { - const comment = await ctx.db - .select() - .from(comments) - .where(eq(comments.id, args.id)) - .limit(1); + const comment = await ctx.db.select().from(comments).where(eq(comments.id, args.id)).limit(1); if (!comment[0]) throw new GraphQLError("Comment not found"); requireOwnerOrAdmin(ctx, comment[0].user_id); await ctx.db.delete(comments).where(eq(comments.id, args.id)); diff --git a/packages/backend/src/graphql/resolvers/users.ts b/packages/backend/src/graphql/resolvers/users.ts index e8f6f33..71e182a 100644 --- a/packages/backend/src/graphql/resolvers/users.ts +++ b/packages/backend/src/graphql/resolvers/users.ts @@ -3,7 +3,7 @@ import { builder } from "../builder"; import { CurrentUserType, UserType, AdminUserListType } from "../types/index"; import { users } from "../../db/schema/index"; import { eq, ilike, or, count, and } from "drizzle-orm"; -import { requireAuth, requireRole } from "../../lib/acl"; +import { requireRole } from "../../lib/acl"; builder.queryField("me", (t) => t.field({ diff --git a/packages/backend/src/graphql/resolvers/videos.ts b/packages/backend/src/graphql/resolvers/videos.ts index fe474b0..11372b0 100644 --- a/packages/backend/src/graphql/resolvers/videos.ts +++ b/packages/backend/src/graphql/resolvers/videos.ts @@ -15,7 +15,7 @@ import { files, } from "../../db/schema/index"; import { eq, and, lte, desc, inArray, count } from "drizzle-orm"; -import { requireRole, requireOwnerOrAdmin } from "../../lib/acl"; +import { requireRole } from "../../lib/acl"; async function enrichVideo(db: any, video: any) { // Fetch models @@ -433,10 +433,7 @@ builder.queryField("adminListVideos", (t) => type: [VideoType], resolve: async (_root, _args, ctx) => { requireRole(ctx, "admin"); - const rows = await ctx.db - .select() - .from(videos) - .orderBy(desc(videos.upload_date)); + const rows = await ctx.db.select().from(videos).orderBy(desc(videos.upload_date)); return Promise.all(rows.map((v: any) => enrichVideo(ctx.db, v))); }, }), diff --git a/packages/backend/src/graphql/types/index.ts b/packages/backend/src/graphql/types/index.ts index 312e691..34df3d9 100644 --- a/packages/backend/src/graphql/types/index.ts +++ b/packages/backend/src/graphql/types/index.ts @@ -229,13 +229,11 @@ export const VideoPlayResponseType = builder }), }); -export const VideoLikeStatusType = builder - .objectRef("VideoLikeStatus") - .implement({ - fields: (t) => ({ - liked: t.exposeBoolean("liked"), - }), - }); +export const VideoLikeStatusType = builder.objectRef("VideoLikeStatus").implement({ + fields: (t) => ({ + liked: t.exposeBoolean("liked"), + }), +}); export const VideoAnalyticsType = builder.objectRef("VideoAnalytics").implement({ fields: (t) => ({ diff --git a/packages/backend/src/lib/logger.ts b/packages/backend/src/lib/logger.ts index 993c00d..338b29c 100644 --- a/packages/backend/src/lib/logger.ts +++ b/packages/backend/src/lib/logger.ts @@ -26,7 +26,17 @@ function createLogger(bindings: Record = {}, initialLevel: LogL message = arg; } else if (arg !== null && typeof arg === "object") { // Pino-style: log(obj, msg?) — strip internal pino keys - const { msg: m, level: _l, time: _t, pid: _p, hostname: _h, req: _req, res: _res, reqId, ...rest } = arg as Record; + const { + msg: m, + level: _l, + time: _t, + pid: _p, + hostname: _h, + req: _req, + res: _res, + reqId, + ...rest + } = arg as Record; message = msg || (typeof m === "string" ? m : ""); if (reqId) meta.reqId = reqId; Object.assign(meta, rest); diff --git a/packages/frontend/src/lib/components/recording-card/recording-card.svelte b/packages/frontend/src/lib/components/recording-card/recording-card.svelte index 661667b..3697a73 100644 --- a/packages/frontend/src/lib/components/recording-card/recording-card.svelte +++ b/packages/frontend/src/lib/components/recording-card/recording-card.svelte @@ -90,7 +90,10 @@ {/each} {#if (recording.device_info?.length ?? 0) > 2}
- +{(recording.device_info?.length ?? 0) - 2} more device{(recording.device_info?.length ?? 0) - 2 > 1 + +{(recording.device_info?.length ?? 0) - 2} more device{(recording.device_info?.length ?? + 0) - + 2 > + 1 ? "s" : ""}
diff --git a/packages/frontend/src/routes/admin/+layout.svelte b/packages/frontend/src/routes/admin/+layout.svelte index aaaf7a0..f6ed161 100644 --- a/packages/frontend/src/routes/admin/+layout.svelte +++ b/packages/frontend/src/routes/admin/+layout.svelte @@ -16,9 +16,7 @@
-