fix: sync pending requests from overseer
This commit is contained in:
@@ -13,6 +13,13 @@ const overseerClient = axios.create({
|
||||
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(
|
||||
"/costs",
|
||||
authenticate,
|
||||
@@ -79,13 +86,11 @@ router.post(
|
||||
cost += (seasons.length - 1) * (settings?.tvPerSeasonCost || 250);
|
||||
const dbBalance = user.totalEarned - user.totalSpent;
|
||||
if (dbBalance < cost)
|
||||
return res
|
||||
.status(400)
|
||||
.json({
|
||||
error: "Insufficient balance",
|
||||
required: cost,
|
||||
current: dbBalance,
|
||||
});
|
||||
return res.status(400).json({
|
||||
error: "Insufficient balance",
|
||||
required: cost,
|
||||
current: dbBalance,
|
||||
});
|
||||
const overseerRequest = await overseerClient.post("/request", {
|
||||
mediaType,
|
||||
mediaId,
|
||||
@@ -130,6 +135,56 @@ router.post(
|
||||
});
|
||||
}),
|
||||
);
|
||||
router.post(
|
||||
"/sync-pending",
|
||||
authenticate,
|
||||
asyncHandler(async (req: AuthenticatedRequest, res) => {
|
||||
const pending = await prisma.contentRequest.findMany({
|
||||
where: { userId: req.user!.id, 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 });
|
||||
}),
|
||||
);
|
||||
router.post(
|
||||
"/webhook",
|
||||
asyncHandler(async (req, res) => {
|
||||
@@ -139,12 +194,7 @@ router.post(
|
||||
req.body.requestId ??
|
||||
req.body.id ??
|
||||
req.body.overseer_request_id;
|
||||
const statusRaw = String(req.body.status || "").toUpperCase();
|
||||
let status = "PENDING";
|
||||
if (statusRaw === "APPROVED" || statusRaw === "COMPLETED")
|
||||
status = "APPROVED";
|
||||
else if (statusRaw === "DECLINED" || statusRaw === "FAILED")
|
||||
status = "DECLINED";
|
||||
const status = mapOverseerStatus(req.body.status);
|
||||
if (!rawId) return res.status(400).json({ error: "Missing fields" });
|
||||
const request = await prisma.contentRequest.findFirst({
|
||||
where: { overseerRequestId: Number(rawId) },
|
||||
|
||||
Reference in New Issue
Block a user