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.
 
 
 
 

50 lines
1.3 KiB

import { dbGlobal } from "drizzle-pkg/lib/db";
import { users } from "drizzle-pkg/lib/schema/auth";
import { count, desc, like, or } from "drizzle-orm";
export default defineWrappedResponseHandler(async (event) => {
const query = getQuery(event);
const page = query.page ? Number(query.page) : 1;
const pageSize = query.pageSize ? Number(query.pageSize) : 10;
const search = query.search as string | undefined;
const offset = (page - 1) * pageSize;
const searchPattern = search ? `%${search}%` : undefined;
const [totalResult] = await dbGlobal
.select({ total: count() })
.from(users);
const list = await dbGlobal
.select({
id: users.id,
username: users.username,
email: users.email,
nickname: users.nickname,
avatar: users.avatar,
role: users.role,
status: users.status,
createdAt: users.createdAt,
})
.from(users)
.where(
searchPattern
? or(
like(users.username, searchPattern),
like(users.email, searchPattern),
like(users.nickname, searchPattern),
)
: undefined,
)
.orderBy(desc(users.createdAt))
.limit(pageSize)
.offset(offset);
return R.success({
list,
total: totalResult?.total ?? 0,
page,
pageSize,
totalPages: Math.ceil((totalResult?.total ?? 0) / pageSize),
});
});