feat: admin requests tab + 30s disk cache + sync all pending
This commit is contained in:
@@ -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 };
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user