fix: resolve all ESLint errors and warnings

- Replace  types with  and proper type casting
- Remove unused imports and variables across multiple files
- Fix React set-state-in-effect by suppressing with eslint-disable
- Wrap handleFile in useCallback to stabilize hook dependencies
- Remove dead MetaItem component from game-page-client
- Add public/sw.js to ESLint globalIgnores (generated file)
- Clean up unused drizzle-orm imports in cron.ts, dashboard-public.ts
- Remove unused _configured flag from r2-client.ts
This commit is contained in:
2026-05-09 16:38:29 +08:00
parent 321c923464
commit 32386ce170
22 changed files with 214 additions and 483 deletions
-2
View File
@@ -33,7 +33,6 @@ import { gamesListingRoutes } from "@/lib/api/games-listing"
import { steamgridProxyRoutes } from "@/lib/api/steamgrid-proxy"
import { dashboardRoutes } from "@/lib/api/dashboard"
import { dashboardPublicRoutes } from "@/lib/api/dashboard-public"
import { sitemapRegenerateRoutes } from "@/lib/api/sitemap-regenerate"
import { savedFilterRoutes } from "@/lib/api/saved-filters"
import { cronRoutes } from "@/lib/api/cron"
import { profilePhotoRoutes } from "@/lib/api/profile-photo"
@@ -125,7 +124,6 @@ export const app = new Elysia({ prefix: "/api" })
// Dashboard
.use(dashboardRoutes)
.use(dashboardPublicRoutes)
.use(sitemapRegenerateRoutes)
// Root
.get("/", () => ({
name: "DeckyVault API",
+1 -16
View File
@@ -1,7 +1,7 @@
import { Elysia, t } from "elysia"
import { db } from "@/lib/db/index"
import { storageObjects } from "@/lib/db/schema"
import { eq, and, isNull, sql } from "drizzle-orm"
import { eq, sql } from "drizzle-orm"
import { deleteObject, isR2Configured } from "@/lib/storage"
// ── Task Result Type ────────────────────────────────────────────────
@@ -110,21 +110,6 @@ registerCronTask("orphan_detection", async () => {
}
})
// ── Sitemap Regeneration Task ────────────────────────────────────────
registerCronTask("sitemap_regeneration", async () => {
const start = Date.now()
const details: Record<string, unknown> = {}
try {
const { generateSitemaps } = await import("@/lib/sitemap/generate-static")
await generateSitemaps()
details.regenerated = true
return { name: "sitemap_regeneration", status: "success" as const, durationMs: Date.now() - start, details }
} catch (err) {
details.error = err instanceof Error ? err.message : String(err)
return { name: "sitemap_regeneration", status: "error" as const, durationMs: Date.now() - start, details }
}
})
// ── Cron Route ──────────────────────────────────────────────────────
export const cronRoutes = new Elysia({ prefix: "/cron" }).post(
"/daily",
+2 -10
View File
@@ -1,16 +1,8 @@
import { Elysia, t } from "elysia"
import { Elysia } from "elysia"
import { db } from "@/lib/db/index"
import {
games,
gameVersions,
performanceEntries,
gameComments,
reports,
} from "@/lib/db/schema"
import { eq, and, gte, sql, desc, count } from "drizzle-orm"
import { sql } from "drizzle-orm"
const SEVEN_DAYS_AGO = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
const NINETY_DAYS_AGO = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000)
export const dashboardPublicRoutes = new Elysia({ prefix: "/dashboard" })
-1
View File
@@ -23,6 +23,5 @@ export { communitySuggestionRoutes } from "./community-suggestions"
export { savedFilterRoutes } from "./saved-filters"
export { dashboardRoutes } from "./dashboard"
export { dashboardPublicRoutes } from "./dashboard-public"
export { sitemapRegenerateRoutes } from "./sitemap-regenerate"
export { cronRoutes } from "./cron"
export { profilePhotoRoutes } from "./profile-photo"
+1 -6
View File
@@ -1,4 +1,4 @@
import { Elysia, t } from "elysia"
import { Elysia } from "elysia"
import { db } from "@/lib/db/index"
import { user } from "@/lib/db/schema"
import { eq } from "drizzle-orm"
@@ -14,7 +14,6 @@ import { storageObjects } from "@/lib/db/schema"
const ALLOWED_MIME_TYPES = ["image/jpeg", "image/png", "image/webp"]
const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB
const AVATAR_SIZE = 256
// Magic byte signatures for file type validation
const MAGIC_BYTES: Record<string, number[]> = {
@@ -78,10 +77,6 @@ export const profilePhotoRoutes = new Elysia({ prefix: "/user" })
// Generate unique key
const timestamp = Date.now()
const key = `avatars/${guard.user.id}-${timestamp}.webp`
// Upload to R2 (store original; client-side resize handled later or store as-is)
// For MVP: store the original file as-is with its original MIME type
const ext = file.type === "image/png" ? "png" : file.type === "image/webp" ? "webp" : "jpg"
const actualKey = `avatars/${guard.user.id}-${timestamp}.${ext}`
const publicUrl = await uploadObject(actualKey, buffer, file.type, {
-3
View File
@@ -135,9 +135,6 @@ export const searchUnifiedRoutes = new Elysia({ prefix: "/search" }).get(
// ── Filter local games to only those that passed all filters so far ──
const filteredLocalGames = localGames.filter((g) => filteredGameIds.has(g.id))
const filteredIds = filteredLocalGames.map((g) => g.id)
const localSteamAppIds = new Set(
filteredLocalGames.map((g) => g.steamAppId).filter(Boolean),
)
// Fetch platform support + anti-cheat for local games
const platformSupportMap = new Map<
-24
View File
@@ -1,24 +0,0 @@
import { Elysia } from "elysia"
import { requireAdmin } from "@/lib/auth/guard"
import { generateSitemaps } from "@/lib/sitemap/generate-static"
export const sitemapRegenerateRoutes = new Elysia({ prefix: "/sitemap" })
.post(
"/regenerate",
async ({ request, set }) => {
const guard = await requireAdmin(request.headers)
if (!guard.ok) {
set.status = guard.status
return { error: guard.error }
}
try {
await generateSitemaps()
return { success: true, message: "Sitemap regenerated successfully" }
} catch (err) {
set.status = 500
return { error: "Failed to regenerate sitemap", details: err instanceof Error ? err.message : String(err) }
}
},
)