mirror of
https://github.com/wassname/Open-Assistant.git
synced 2026-06-28 16:20:34 +08:00
69 lines
2.1 KiB
TypeScript
69 lines
2.1 KiB
TypeScript
import { withRole } from "src/lib/auth";
|
|
import { createApiClient } from "src/lib/oasst_client_factory";
|
|
import prisma from "src/lib/prismadb";
|
|
import { FetchUsersParams } from "src/types/Users";
|
|
|
|
/**
|
|
* The number of users to fetch in a single request. Could later be a query parameter.
|
|
*/
|
|
const PAGE_SIZE = 20;
|
|
|
|
/**
|
|
* Returns a list of user results from the database when the requesting user is
|
|
* a logged in admin.
|
|
*
|
|
* This takes two query params:
|
|
* - `cursor`: A string representing a user's `display_name`.
|
|
* - `direction`: Either "forward" or "backward" representing the pagination
|
|
* direction.
|
|
*/
|
|
const handler = withRole("admin", async (req, res, token) => {
|
|
const { cursor, direction, searchDisplayName = "", sortKey = "username" } = req.query;
|
|
|
|
const oasstApiClient = await createApiClient(token);
|
|
// First, get all the users according to the backend.
|
|
const { items: all_users, ...rest } = await oasstApiClient.fetch_users({
|
|
searchDisplayName: searchDisplayName as FetchUsersParams["searchDisplayName"],
|
|
direction: direction as FetchUsersParams["direction"],
|
|
limit: PAGE_SIZE,
|
|
cursor: cursor as FetchUsersParams["cursor"],
|
|
sortKey: sortKey === "username" || sortKey === "display_name" ? sortKey : undefined,
|
|
});
|
|
|
|
// Next, get all the users stored in the web's auth database to fetch their role.
|
|
const local_user_ids = all_users.map(({ id }) => id);
|
|
const local_users = await prisma.user.findMany({
|
|
where: {
|
|
id: {
|
|
in: local_user_ids,
|
|
},
|
|
},
|
|
select: {
|
|
id: true,
|
|
role: true,
|
|
},
|
|
});
|
|
|
|
// Combine the information by updating the set of full users with their role.
|
|
// Default any users without a role set locally as "general".
|
|
const local_user_map = local_users.reduce((result, user) => {
|
|
result.set(user.id, user.role);
|
|
return result;
|
|
}, new Map());
|
|
|
|
const users = all_users.map((user) => {
|
|
const role = local_user_map.get(user.id) || "general";
|
|
return {
|
|
...user,
|
|
role,
|
|
};
|
|
});
|
|
|
|
res.status(200).json({
|
|
items: users,
|
|
...rest,
|
|
});
|
|
});
|
|
|
|
export default handler;
|