diff --git a/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx
index 3b8cfa287..ddeb52058 100644
--- a/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx
+++ b/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx
@@ -1,8 +1,87 @@
-export default function UserPage() {
+'use client';
+
+import { Loader } from 'lucide-react';
+import { Controller, useForm } from 'react-hook-form';
+
+import { trpc } from '@documenso/trpc/react';
+import { Button } from '@documenso/ui/primitives/button';
+import { Input } from '@documenso/ui/primitives/input';
+import { Label } from '@documenso/ui/primitives/label';
+import { SignaturePad } from '@documenso/ui/primitives/signature-pad';
+import { useToast } from '@documenso/ui/primitives/use-toast';
+
+import { FormErrorMessage } from '../../../../../components/form/form-error-message';
+
+export default function UserPage({ params }: { params: { id: number } }) {
+ const toast = useToast();
+
+ const result = trpc.profile.getUser.useQuery(
+ {
+ id: Number(params.id),
+ },
+ {
+ enabled: !!params.id,
+ },
+ );
+
+ const {
+ register,
+ control,
+ handleSubmit,
+ formState: { errors, isSubmitting },
+ } = useForm();
+
+ console.log(result.data);
+
+ const onSubmit = async (data) => {
+ console.log(data);
+ };
+
return (
-
Hey
-
Ho
+
Manage {result.data?.name}'s profile
+
);
}
diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts
index bbeff675b..c5756c480 100644
--- a/packages/trpc/server/profile-router/router.ts
+++ b/packages/trpc/server/profile-router/router.ts
@@ -1,6 +1,8 @@
import { TRPCError } from '@trpc/server';
+import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin';
import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password';
+import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id';
import { resetPassword } from '@documenso/lib/server-only/user/reset-password';
import { updatePassword } from '@documenso/lib/server-only/user/update-password';
import { updateProfile } from '@documenso/lib/server-only/user/update-profile';
@@ -9,11 +11,36 @@ import { authenticatedProcedure, procedure, router } from '../trpc';
import {
ZForgotPasswordFormSchema,
ZResetPasswordFormSchema,
+ ZRetrieveUserByIdQuerySchema,
ZUpdatePasswordMutationSchema,
ZUpdateProfileMutationSchema,
} from './schema';
export const profileRouter = router({
+ getUser: authenticatedProcedure
+ .input(ZRetrieveUserByIdQuerySchema)
+ .query(async ({ input, ctx }) => {
+ const isUserAdmin = isAdmin(ctx.user);
+
+ if (!isUserAdmin) {
+ throw new TRPCError({
+ code: 'UNAUTHORIZED',
+ message: 'Not authorized to perform this action.',
+ });
+ }
+
+ try {
+ const { id } = input;
+
+ return await getUserById({ id });
+ } catch (err) {
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: 'We were unable to retrieve the specified account. Please try again.',
+ });
+ }
+ }),
+
updateProfile: authenticatedProcedure
.input(ZUpdateProfileMutationSchema)
.mutation(async ({ input, ctx }) => {
diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts
index 641227684..a910ec3cc 100644
--- a/packages/trpc/server/profile-router/schema.ts
+++ b/packages/trpc/server/profile-router/schema.ts
@@ -1,5 +1,9 @@
import { z } from 'zod';
+export const ZRetrieveUserByIdQuerySchema = z.object({
+ id: z.number().min(1),
+});
+
export const ZUpdateProfileMutationSchema = z.object({
name: z.string().min(1),
signature: z.string(),
@@ -18,6 +22,7 @@ export const ZResetPasswordFormSchema = z.object({
token: z.string().min(1),
});
+export type TRetrieveUserByIdQuerySchema = z.infer;
export type TUpdateProfileMutationSchema = z.infer;
export type TUpdatePasswordMutationSchema = z.infer;
export type TForgotPasswordFormSchema = z.infer;