You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.6 KiB
52 lines
1.6 KiB
import { dbGlobal } from "drizzle-pkg/lib/db";
|
|
import { users } from "drizzle-pkg/lib/schema/auth";
|
|
import { inArray } from "drizzle-orm";
|
|
import log4js from "logger";
|
|
import { requireAdmin } from "#server/utils/admin-guard";
|
|
|
|
const logger = log4js.getLogger("USERS");
|
|
|
|
export default defineWrappedResponseHandler(async (event) => {
|
|
requireAdmin(event);
|
|
|
|
const body = await readBody(event);
|
|
|
|
if (!body?.ids || !Array.isArray(body.ids) || body.ids.length === 0) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: "请选择要操作的用户",
|
|
});
|
|
}
|
|
|
|
if (!body?.action || !["enable", "disable", "delete"].includes(body.action)) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: "无效的操作类型",
|
|
});
|
|
}
|
|
|
|
const ids = body.ids.map((n: number) => Number(n)).filter(n => !isNaN(n));
|
|
if (ids.length === 0) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: "无效的用户ID列表",
|
|
});
|
|
}
|
|
|
|
if (body.action === "delete") {
|
|
await dbGlobal.delete(users).where(inArray(users.id, ids));
|
|
logger.info("users batch deleted by admin: count=%d", ids.length);
|
|
return R.success({ message: `已删除 ${ids.length} 个用户` });
|
|
}
|
|
|
|
const newStatus = body.action === "enable" ? "active" : "disabled";
|
|
await dbGlobal
|
|
.update(users)
|
|
.set({ status: newStatus })
|
|
.where(inArray(users.id, ids));
|
|
|
|
logger.info("users batch %s by admin: ids=%s", body.action, ids.join(","));
|
|
return R.success({
|
|
message: `已${body.action === "enable" ? "启用" : "禁用"} ${ids.length} 个用户`
|
|
});
|
|
});
|