feat: admin requests tab + 30s disk cache + sync all pending

This commit is contained in:
2026-04-23 13:58:31 -04:00
parent 3f37690e50
commit 8b31045dcf
4 changed files with 164 additions and 9 deletions
+84
View File
@@ -1,3 +1,4 @@
import axios from "axios";
import { Router } from "express";
import { io } from "../index";
import {
@@ -10,6 +11,19 @@ import { backfillUserHistory } from "../services/tautulli";
import { prisma } from "../utils/prisma";
const router = Router();
const OVERSEER_URL = process.env.OVERSEER_URL || "";
const OVERSEER_API_KEY = process.env.OVERSEER_API_KEY || "";
const overseerClient = axios.create({
baseURL: `${OVERSEER_URL}/api/v1`,
headers: { "X-Api-Key": OVERSEER_API_KEY },
});
const mapOverseerStatus = (status: any) => {
const s = Number(status);
if (s >= 5) return "APPROVED";
if (s === 4) return "DECLINED";
return "PENDING";
};
router.get(
"/settings",
@@ -247,4 +261,74 @@ router.get(
}),
);
router.get(
"/requests",
authenticate,
requireAdmin,
asyncHandler(async (_req: AuthenticatedRequest, res) => {
const requests = await prisma.contentRequest.findMany({
orderBy: { requestedAt: "desc" },
take: 100,
include: {
user: {
select: { plexUsername: true, email: true },
},
},
});
res.json({ requests });
}),
);
router.post(
"/sync-requests",
authenticate,
requireAdmin,
asyncHandler(async (_req: AuthenticatedRequest, res) => {
const pending = await prisma.contentRequest.findMany({
where: { status: "PENDING" },
});
const updated: any[] = [];
for (const request of pending) {
try {
const response = await overseerClient.get(
`/request/${request.overseerRequestId}`,
);
const mapped = mapOverseerStatus(response.data?.status);
if (mapped !== "PENDING") {
const result = await prisma.contentRequest.update({
where: { id: request.id },
data: { status: mapped as any },
});
if (mapped === "DECLINED") {
await prisma.transaction.create({
data: {
userId: request.userId,
type: "ADJUSTMENT",
amount: request.creditsCost,
description: `Refunded: ${request.title}`,
contentTitle: request.title,
},
});
await prisma.user.update({
where: { id: request.userId },
data: { totalSpent: { decrement: request.creditsCost } },
});
}
io.to(`user:${request.userId}`).emit("request_updated", {
id: request.id,
status: result.status,
title: request.title,
});
updated.push({
id: request.id,
status: result.status,
title: request.title,
});
}
} catch {}
}
res.json({ success: true, updated, checked: pending.length });
}),
);
export { router as adminRouter };
+1 -1
View File
@@ -23,7 +23,7 @@ let cachedDiskSpace: {
} | null = null;
async function fetchDiskSpace() {
if (cachedDiskSpace && Date.now() - cachedDiskSpace.fetchedAt < 5 * 60 * 1000)
if (cachedDiskSpace && Date.now() - cachedDiskSpace.fetchedAt < 30 * 1000)
return cachedDiskSpace;
try {
const radarrRes = await overseerClient.get("/settings/radarr");