mirror of
https://github.com/beilunyang/moemail.git
synced 2026-06-07 16:39:38 +08:00
76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import { createDb } from "@/lib/db";
|
|
import { roles, userRoles } from "@/lib/schema";
|
|
import { eq } from "drizzle-orm";
|
|
import { ROLES } from "@/lib/permissions";
|
|
import { assignRoleToUser } from "@/lib/auth";
|
|
|
|
export const runtime = "edge";
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const { userId, roleName } = await request.json() as {
|
|
userId: string,
|
|
roleName: typeof ROLES.KNIGHT | typeof ROLES.CIVILIAN
|
|
};
|
|
if (!userId || !roleName) {
|
|
return Response.json(
|
|
{ error: "缺少必要参数" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
if (![ROLES.KNIGHT, ROLES.CIVILIAN].includes(roleName)) {
|
|
return Response.json(
|
|
{ error: "角色不合法" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const db = createDb();
|
|
|
|
const currentUserRole = await db.query.userRoles.findFirst({
|
|
where: eq(userRoles.userId, userId),
|
|
with: {
|
|
role: true,
|
|
},
|
|
});
|
|
|
|
if (currentUserRole?.role.name === ROLES.EMPEROR) {
|
|
return Response.json(
|
|
{ error: "不能降级皇帝" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
let targetRole = await db.query.roles.findFirst({
|
|
where: eq(roles.name, roleName),
|
|
});
|
|
|
|
if (!targetRole) {
|
|
const description = roleName === ROLES.KNIGHT
|
|
? "高级用户"
|
|
: "普通用户";
|
|
|
|
const [newRole] = await db.insert(roles)
|
|
.values({
|
|
name: roleName,
|
|
description,
|
|
})
|
|
.returning();
|
|
targetRole = newRole;
|
|
}
|
|
|
|
await assignRoleToUser(db, userId, targetRole.id);
|
|
|
|
return Response.json({
|
|
success: true,
|
|
message: roleName === ROLES.KNIGHT ? "册封成功" : "贬为平民"
|
|
});
|
|
} catch (error) {
|
|
console.error("Failed to change user role:", error);
|
|
return Response.json(
|
|
{ error: "操作失败" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |