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
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),
|
|
});
|
|
});
|
|
|