diff --git a/src/app/(frontend)/impersonate/actions.ts b/src/app/(frontend)/impersonate/actions.ts new file mode 100644 index 0000000..5ba75b8 --- /dev/null +++ b/src/app/(frontend)/impersonate/actions.ts @@ -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> { + 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); +} diff --git a/src/app/(frontend)/impersonate/page.tsx b/src/app/(frontend)/impersonate/page.tsx deleted file mode 100644 index 3732b12..0000000 --- a/src/app/(frontend)/impersonate/page.tsx +++ /dev/null @@ -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
[0]["users"]} />
; -}