feat: add admin sitemap regeneration endpoint and cron task
This commit is contained in:
@@ -33,6 +33,7 @@ import { gamesListingRoutes } from "@/lib/api/games-listing"
|
|||||||
import { steamgridProxyRoutes } from "@/lib/api/steamgrid-proxy"
|
import { steamgridProxyRoutes } from "@/lib/api/steamgrid-proxy"
|
||||||
import { dashboardRoutes } from "@/lib/api/dashboard"
|
import { dashboardRoutes } from "@/lib/api/dashboard"
|
||||||
import { dashboardPublicRoutes } from "@/lib/api/dashboard-public"
|
import { dashboardPublicRoutes } from "@/lib/api/dashboard-public"
|
||||||
|
import { sitemapRegenerateRoutes } from "@/lib/api/sitemap-regenerate"
|
||||||
import { savedFilterRoutes } from "@/lib/api/saved-filters"
|
import { savedFilterRoutes } from "@/lib/api/saved-filters"
|
||||||
import { cronRoutes } from "@/lib/api/cron"
|
import { cronRoutes } from "@/lib/api/cron"
|
||||||
import { profilePhotoRoutes } from "@/lib/api/profile-photo"
|
import { profilePhotoRoutes } from "@/lib/api/profile-photo"
|
||||||
@@ -124,6 +125,7 @@ export const app = new Elysia({ prefix: "/api" })
|
|||||||
// Dashboard
|
// Dashboard
|
||||||
.use(dashboardRoutes)
|
.use(dashboardRoutes)
|
||||||
.use(dashboardPublicRoutes)
|
.use(dashboardPublicRoutes)
|
||||||
|
.use(sitemapRegenerateRoutes)
|
||||||
// Root
|
// Root
|
||||||
.get("/", () => ({
|
.get("/", () => ({
|
||||||
name: "DeckyVault API",
|
name: "DeckyVault API",
|
||||||
|
|||||||
@@ -110,6 +110,21 @@ 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 ──────────────────────────────────────────────────────
|
// ── Cron Route ──────────────────────────────────────────────────────
|
||||||
export const cronRoutes = new Elysia({ prefix: "/cron" }).post(
|
export const cronRoutes = new Elysia({ prefix: "/cron" }).post(
|
||||||
"/daily",
|
"/daily",
|
||||||
|
|||||||
@@ -23,5 +23,6 @@ export { communitySuggestionRoutes } from "./community-suggestions"
|
|||||||
export { savedFilterRoutes } from "./saved-filters"
|
export { savedFilterRoutes } from "./saved-filters"
|
||||||
export { dashboardRoutes } from "./dashboard"
|
export { dashboardRoutes } from "./dashboard"
|
||||||
export { dashboardPublicRoutes } from "./dashboard-public"
|
export { dashboardPublicRoutes } from "./dashboard-public"
|
||||||
|
export { sitemapRegenerateRoutes } from "./sitemap-regenerate"
|
||||||
export { cronRoutes } from "./cron"
|
export { cronRoutes } from "./cron"
|
||||||
export { profilePhotoRoutes } from "./profile-photo"
|
export { profilePhotoRoutes } from "./profile-photo"
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
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) }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
+235
-235
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user