diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 7ac65f1b2..d040472d6 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -33,7 +33,10 @@ import { Disable2FA } from "./disable-2fa"; import { Enable2FA } from "./enable-2fa"; const profileSchema = z.object({ - email: z.string(), + email: z + .string() + .email("Please enter a valid email address") + .min(1, "Email is required"), password: z.string().nullable(), currentPassword: z.string().nullable(), image: z.string().optional(), diff --git a/apps/dokploy/server/api/routers/user.ts b/apps/dokploy/server/api/routers/user.ts index 2e7c7a0c5..d30b99b3a 100644 --- a/apps/dokploy/server/api/routers/user.ts +++ b/apps/dokploy/server/api/routers/user.ts @@ -192,7 +192,16 @@ export const userRouter = createTRPCRouter({ }) .where(eq(account.userId, ctx.user.id)); } - return await updateUser(ctx.user.id, input); + + try { + return await updateUser(ctx.user.id, input); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: + error instanceof Error ? error.message : "Failed to update user", + }); + } }), getUserByToken: publicProcedure .input(apiFindOneToken) diff --git a/packages/server/src/db/schema/user.ts b/packages/server/src/db/schema/user.ts index 933a7490c..ca92f50e8 100644 --- a/packages/server/src/db/schema/user.ts +++ b/packages/server/src/db/schema/user.ts @@ -322,6 +322,11 @@ export const apiUpdateWebServerMonitoring = z.object({ }); export const apiUpdateUser = createSchema.partial().extend({ + email: z + .string() + .email("Please enter a valid email address") + .min(1, "Email is required") + .optional(), password: z.string().optional(), currentPassword: z.string().optional(), name: z.string().optional(), diff --git a/packages/server/src/services/user.ts b/packages/server/src/services/user.ts index 728d5b8ee..ae03432a1 100644 --- a/packages/server/src/services/user.ts +++ b/packages/server/src/services/user.ts @@ -296,6 +296,19 @@ export const findMemberById = async ( }; export const updateUser = async (userId: string, userData: Partial) => { + // Validate email if it's being updated + if (userData.email !== undefined) { + if (!userData.email || userData.email.trim() === "") { + throw new Error("Email is required and cannot be empty"); + } + + // Basic email format validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(userData.email)) { + throw new Error("Please enter a valid email address"); + } + } + const user = await db .update(users_temp) .set({