1
0
Fork 0

refactor(impersonation): move user selection into action flow

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jason Fraley 2026-09-01 17:17:48 -04:00
parent d46f480825
commit 6efe23a9e4
2 changed files with 48 additions and 15 deletions

View file

@ -0,0 +1,48 @@
"use server";
import config from "@payload-config";
import { isPayloadUser } from "@/utils/access-control/isPayloadUser";
import { getPayload } from "payload";
import { isSuperuser } from "@/utils/access-control/hasPermission";
import { headers } from "next/headers";
async function authenticate() {
const payloadConfig = await config;
const payload = await getPayload({ config: payloadConfig });
const hdrs = await headers();
const { user } = await payload.auth({
headers: hdrs,
canSetHeaders: false,
});
if (!isPayloadUser(user)) {
throw new Error("Unauthorized");
}
return { payload, user };
}
export async function getImpersonationUsers(): Promise<Array<{
id: number | string;
username?: string | null;
displayName?: string | null;
}>> {
const { payload, user } = await authenticate();
if (!(await isSuperuser(payload, user))) {
return [];
}
return await payload.find({
collection: "users",
depth: 0,
limit: 1000,
pagination: false,
sort: "username",
select: {
username: true,
displayName: true,
},
overrideAccess: true,
}).then((result) => result.docs);
}

View file

@ -1,15 +0,0 @@
import { redirect } from "next/navigation";
import { getPayload } from "payload";
import config from "@payload-config";
import { ImpersonationControl } from "@/components/frontend/impersonation/ImpersonationControl";
import { findImpersonationUsers } from "@/lib/impersonation";
import { isSuperuser } from "@/utils/access-control/hasPermission";
import { headers } from "next/headers";
export default async function ImpersonatePage() {
const payload = await getPayload({ config });
const { user } = await payload.auth({ headers: await headers(), canSetHeaders: false });
if (!user || !(await isSuperuser(payload, user))) redirect("/");
const users = await findImpersonationUsers(payload);
return <main className="flex-1 space-y-6 p-6 md:p-8"><ImpersonationControl users={users.docs as Parameters<typeof ImpersonationControl>[0]["users"]} /></main>;
}