This commit is contained in:
1 parent
8efd032cc6
commit
df38dccbf1
735 files changed
+128321
-120870
No files matched your search
@@ -2,138 +2,207 @@
|
||||
|
||||
import { NextResponse } from "next/server";
|
||||
import { requireStaff } from "@/lib/admin/guard";
|
||||
import { logger } from "@/lib/logger";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { rcon } from "@/lib/services/rcon";
|
||||
import { logStaffActivity } from "@/lib/services/staff-activity";
|
||||
import { logger } from "@/lib/logger";
|
||||
|
||||
const giveCurrency = async ({
|
||||
rconClient: _rconClient,
|
||||
db: _db,
|
||||
userId,
|
||||
type,
|
||||
amount,
|
||||
rconClient: _rconClient,
|
||||
db: _db,
|
||||
userId,
|
||||
type,
|
||||
amount,
|
||||
}: {
|
||||
rconClient: typeof rcon;
|
||||
db: typeof prisma;
|
||||
userId: number;
|
||||
type: string;
|
||||
amount: number;
|
||||
rconClient: typeof rcon;
|
||||
db: typeof prisma;
|
||||
userId: number;
|
||||
type: string;
|
||||
amount: number;
|
||||
}) => {
|
||||
await logStaffActivity({
|
||||
staffId: 1,
|
||||
action: "give_currency",
|
||||
description: `Gave ${amount} ${type} to user #${userId}`,
|
||||
targetType: "user",
|
||||
targetId: userId,
|
||||
});
|
||||
return { success: true, message: `Gave ${amount} ${type} to user #${userId}` };
|
||||
await logStaffActivity({
|
||||
staffId: 1,
|
||||
action: "give_currency",
|
||||
description: `Gave ${amount} ${type} to user #${userId}`,
|
||||
targetType: "user",
|
||||
targetId: userId,
|
||||
});
|
||||
return {
|
||||
success: true,
|
||||
message: `Gave ${amount} ${type} to user #${userId}`,
|
||||
};
|
||||
};
|
||||
|
||||
export async function POST(request: Request) {
|
||||
try {
|
||||
const staff = await requireStaff();
|
||||
const formData = await request.formData();
|
||||
const userId = Number(formData.get("userId"));
|
||||
const username = String(formData.get("username") || "");
|
||||
const action = String(formData.get("action") || "");
|
||||
try {
|
||||
const staff = await requireStaff();
|
||||
const formData = await request.formData();
|
||||
const userId = Number(formData.get("userId"));
|
||||
const username = String(formData.get("username") || "");
|
||||
const action = String(formData.get("action") || "");
|
||||
|
||||
if (!userId || !username) {
|
||||
return NextResponse.json({ success: false, message: "Invalid user data" }, { status: 400 });
|
||||
}
|
||||
if (!userId || !username) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid user data" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "set_rank") {
|
||||
const rank = Number(formData.get("rank") || "0");
|
||||
if (!rank || rank < 0 || rank > 10) {
|
||||
return NextResponse.json({ success: false, message: "Invalid rank value" }, { status: 400 });
|
||||
}
|
||||
if (action === "set_rank") {
|
||||
const rank = Number(formData.get("rank") || "0");
|
||||
if (!rank || rank < 0 || rank > 10) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid rank value" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
await prisma.user.update({ where: { id: userId }, data: { rank } });
|
||||
await rcon.setRank(userId, rank);
|
||||
await logStaffActivity({
|
||||
staffId: staff.id,
|
||||
action: "rank_change",
|
||||
description: `Set rank of user #${userId} to ${rank}`,
|
||||
targetType: "user",
|
||||
targetId: userId,
|
||||
});
|
||||
await prisma.user.update({ where: { id: userId }, data: { rank } });
|
||||
await rcon.setRank(userId, rank);
|
||||
await logStaffActivity({
|
||||
staffId: staff.id,
|
||||
action: "rank_change",
|
||||
description: `Set rank of user #${userId} to ${rank}`,
|
||||
targetType: "user",
|
||||
targetId: userId,
|
||||
});
|
||||
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Set rank of user #${userId} to ${rank}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Set rank of user #${userId} to ${rank}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "disconnect") {
|
||||
await rcon.disconnectUser(userId, username);
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Disconnected user #${userId} (${username})` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
if (action === "disconnect") {
|
||||
await rcon.disconnectUser(userId, username);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: true,
|
||||
message: `Disconnected user #${userId} (${username})`,
|
||||
},
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "alert") {
|
||||
const message = String(formData.get("message") || "")
|
||||
.trim()
|
||||
.slice(0, 512);
|
||||
if (!message) {
|
||||
return NextResponse.json({ success: false, message: "Alert message is required" }, { status: 400 });
|
||||
}
|
||||
await rcon.alertUser(userId, message);
|
||||
return NextResponse.json({ success: true, message: `Sent alert to user #${userId}` }, { status: 200 });
|
||||
}
|
||||
if (action === "alert") {
|
||||
const message = String(formData.get("message") || "")
|
||||
.trim()
|
||||
.slice(0, 512);
|
||||
if (!message) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Alert message is required" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
await rcon.alertUser(userId, message);
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Sent alert to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "give_credits") {
|
||||
const credits = Number(formData.get("credits") || "0");
|
||||
if (!credits || credits <= 0) {
|
||||
return NextResponse.json({ success: false, message: "Invalid credit amount" }, { status: 400 });
|
||||
}
|
||||
await giveCurrency({ rconClient: rcon, db: prisma, userId, type: "credits", amount: credits });
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${credits} credits to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
if (action === "give_credits") {
|
||||
const credits = Number(formData.get("credits") || "0");
|
||||
if (!credits || credits <= 0) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid credit amount" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
await giveCurrency({
|
||||
rconClient: rcon,
|
||||
db: prisma,
|
||||
userId,
|
||||
type: "credits",
|
||||
amount: credits,
|
||||
});
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: true,
|
||||
message: `Gave ${credits} credits to user #${userId}`,
|
||||
},
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "give_duckets") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json({ success: false, message: "Invalid duckets amount" }, { status: 400 });
|
||||
}
|
||||
await giveCurrency({ rconClient: rcon, db: prisma, userId, type: "duckets", amount });
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${amount} duckets to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
if (action === "give_duckets") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid duckets amount" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
await giveCurrency({
|
||||
rconClient: rcon,
|
||||
db: prisma,
|
||||
userId,
|
||||
type: "duckets",
|
||||
amount,
|
||||
});
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${amount} duckets to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "give_diamonds") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json({ success: false, message: "Invalid diamonds amount" }, { status: 400 });
|
||||
}
|
||||
await giveCurrency({ rconClient: rcon, db: prisma, userId, type: "diamonds", amount });
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${amount} diamonds to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
if (action === "give_diamonds") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid diamonds amount" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
await giveCurrency({
|
||||
rconClient: rcon,
|
||||
db: prisma,
|
||||
userId,
|
||||
type: "diamonds",
|
||||
amount,
|
||||
});
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: true,
|
||||
message: `Gave ${amount} diamonds to user #${userId}`,
|
||||
},
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
if (action === "give_points") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json({ success: false, message: "Invalid points amount" }, { status: 400 });
|
||||
}
|
||||
await giveCurrency({ rconClient: rcon, db: prisma, userId, type: "points", amount });
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${amount} points to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
if (action === "give_points") {
|
||||
const amount = Number(formData.get("amount") || "0");
|
||||
if (!amount || amount <= 0) {
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Invalid points amount" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
await giveCurrency({
|
||||
rconClient: rcon,
|
||||
db: prisma,
|
||||
userId,
|
||||
type: "points",
|
||||
amount,
|
||||
});
|
||||
return NextResponse.json(
|
||||
{ success: true, message: `Gave ${amount} points to user #${userId}` },
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.json({ success: false, message: `Unknown action: ${action}` }, { status: 400 });
|
||||
} catch (error) {
|
||||
logger.error("Admin users actions error", { module: "admin/users/actions", error: String(error) });
|
||||
return NextResponse.json({ success: false, message: "Internal server error" }, { status: 500 });
|
||||
}
|
||||
return NextResponse.json(
|
||||
{ success: false, message: `Unknown action: ${action}` },
|
||||
{ status: 400 },
|
||||
);
|
||||
} catch (error) {
|
||||
logger.error("Admin users actions error", {
|
||||
module: "admin/users/actions",
|
||||
error: String(error),
|
||||
});
|
||||
return NextResponse.json(
|
||||
{ success: false, message: "Internal server error" },
|
||||
{ status: 500 },
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user