diff --git a/app/api/roles/users/route.ts b/app/api/roles/users/route.ts index 2c9e33b..a402f83 100644 --- a/app/api/roles/users/route.ts +++ b/app/api/roles/users/route.ts @@ -1,8 +1,8 @@ import { createDb } from "@/lib/db" -import { users } from "@/lib/schema" +import { users, userRoles, roles } from "@/lib/schema" import { eq, like, or, sql } from "drizzle-orm" import { checkPermission } from "@/lib/auth" -import { PERMISSIONS } from "@/lib/permissions" +import { PERMISSIONS, ROLES } from "@/lib/permissions" export const runtime = "edge" @@ -34,19 +34,30 @@ export async function GET(request: Request) { .where(searchCondition) const total = Number(totalResult[0].count) - const userList = await db.query.users.findMany({ - where: searchCondition, - with: { - userRoles: { - with: { - role: true, - }, - }, - }, - limit: pageSize, - offset: (page - 1) * pageSize, - orderBy: (users, { desc }) => [desc(users.id)], - }) + const roleRank = sql`CASE COALESCE(${roles.name}, ${ROLES.CIVILIAN}) + WHEN ${ROLES.EMPEROR} THEN 0 + WHEN ${ROLES.DUKE} THEN 1 + WHEN ${ROLES.KNIGHT} THEN 2 + WHEN ${ROLES.CIVILIAN} THEN 3 + ELSE 4 + END` + + const userList = await db + .select({ + id: users.id, + name: users.name, + username: users.username, + email: users.email, + image: users.image, + role: roles.name, + }) + .from(users) + .leftJoin(userRoles, eq(userRoles.userId, users.id)) + .leftJoin(roles, eq(roles.id, userRoles.roleId)) + .where(searchCondition) + .orderBy(roleRank, sql`LENGTH(COALESCE(${users.username}, ${users.name}))`, sql`LOWER(COALESCE(${users.username}, ${users.name}))`) + .limit(pageSize) + .offset((page - 1) * pageSize) return Response.json({ users: userList.map((u) => ({ @@ -55,7 +66,7 @@ export async function GET(request: Request) { username: u.username, email: u.email, image: u.image, - role: u.userRoles[0]?.role.name || null, + role: u.role || null, })), total, page,