diff --git a/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx b/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx index 4d36ab7a..5213c0b9 100644 --- a/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx @@ -51,7 +51,7 @@ export const GenerateToken = () => { diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 761cfb71..32179378 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -103,9 +103,9 @@ export const ProfileForm = () => { const onSubmit = async (values: Profile) => { await mutateAsync({ email: values.email.toLowerCase(), - password: values.password, + password: values.password || undefined, image: values.image, - currentPassword: values.currentPassword, + currentPassword: values.currentPassword || undefined, }) .then(async () => { await refetch(); diff --git a/apps/dokploy/migrate.ts b/apps/dokploy/migrate.ts index 097459b9..e1f52c9a 100644 --- a/apps/dokploy/migrate.ts +++ b/apps/dokploy/migrate.ts @@ -1,149 +1,149 @@ -import { drizzle } from "drizzle-orm/postgres-js"; -import { nanoid } from "nanoid"; -import postgres from "postgres"; -import * as schema from "./server/db/schema"; +// import { drizzle } from "drizzle-orm/postgres-js"; +// import { nanoid } from "nanoid"; +// import postgres from "postgres"; +// import * as schema from "./server/db/schema"; -const connectionString = process.env.DATABASE_URL!; +// const connectionString = process.env.DATABASE_URL!; -const sql = postgres(connectionString, { max: 1 }); -const db = drizzle(sql, { - schema, -}); +// const sql = postgres(connectionString, { max: 1 }); +// const db = drizzle(sql, { +// schema, +// }); -await db - .transaction(async (db) => { - const admins = await db.query.admins.findMany({ - with: { - auth: true, - users: { - with: { - auth: true, - }, - }, - }, - }); - for (const admin of admins) { - const user = await db - .insert(schema.users_temp) - .values({ - id: admin.adminId, - email: admin.auth.email, - token: admin.auth.token || "", - emailVerified: true, - updatedAt: new Date(), - role: "admin", - serverIp: admin.serverIp, - image: admin.auth.image, - certificateType: admin.certificateType, - host: admin.host, - letsEncryptEmail: admin.letsEncryptEmail, - sshPrivateKey: admin.sshPrivateKey, - enableDockerCleanup: admin.enableDockerCleanup, - enableLogRotation: admin.enableLogRotation, - enablePaidFeatures: admin.enablePaidFeatures, - metricsConfig: admin.metricsConfig, - cleanupCacheApplications: admin.cleanupCacheApplications, - cleanupCacheOnPreviews: admin.cleanupCacheOnPreviews, - cleanupCacheOnCompose: admin.cleanupCacheOnCompose, - stripeCustomerId: admin.stripeCustomerId, - stripeSubscriptionId: admin.stripeSubscriptionId, - serversQuantity: admin.serversQuantity, - }) - .returning() - .then((user) => user[0]); +// await db +// .transaction(async (db) => { +// const admins = await db.query.admins.findMany({ +// with: { +// auth: true, +// users: { +// with: { +// auth: true, +// }, +// }, +// }, +// }); +// for (const admin of admins) { +// const user = await db +// .insert(schema.users_temp) +// .values({ +// id: admin.adminId, +// email: admin.auth.email, +// token: admin.auth.token || "", +// emailVerified: true, +// updatedAt: new Date(), +// role: "admin", +// serverIp: admin.serverIp, +// image: admin.auth.image, +// certificateType: admin.certificateType, +// host: admin.host, +// letsEncryptEmail: admin.letsEncryptEmail, +// sshPrivateKey: admin.sshPrivateKey, +// enableDockerCleanup: admin.enableDockerCleanup, +// enableLogRotation: admin.enableLogRotation, +// enablePaidFeatures: admin.enablePaidFeatures, +// metricsConfig: admin.metricsConfig, +// cleanupCacheApplications: admin.cleanupCacheApplications, +// cleanupCacheOnPreviews: admin.cleanupCacheOnPreviews, +// cleanupCacheOnCompose: admin.cleanupCacheOnCompose, +// stripeCustomerId: admin.stripeCustomerId, +// stripeSubscriptionId: admin.stripeSubscriptionId, +// serversQuantity: admin.serversQuantity, +// }) +// .returning() +// .then((user) => user[0]); - await db.insert(schema.account).values({ - providerId: "credential", - userId: user?.id || "", - password: admin.auth.password, - is2FAEnabled: admin.auth.is2FAEnabled || false, - createdAt: new Date(admin.auth.createdAt) || new Date(), - updatedAt: new Date(admin.auth.createdAt) || new Date(), - }); +// await db.insert(schema.account).values({ +// providerId: "credential", +// userId: user?.id || "", +// password: admin.auth.password, +// is2FAEnabled: admin.auth.is2FAEnabled || false, +// createdAt: new Date(admin.auth.createdAt) || new Date(), +// updatedAt: new Date(admin.auth.createdAt) || new Date(), +// }); - const organization = await db - .insert(schema.organization) - .values({ - name: "My Organization", - slug: nanoid(), - ownerId: user?.id || "", - createdAt: new Date(admin.createdAt) || new Date(), - }) - .returning() - .then((organization) => organization[0]); +// const organization = await db +// .insert(schema.organization) +// .values({ +// name: "My Organization", +// slug: nanoid(), +// ownerId: user?.id || "", +// createdAt: new Date(admin.createdAt) || new Date(), +// }) +// .returning() +// .then((organization) => organization[0]); - for (const member of admin.users) { - const userTemp = await db - .insert(schema.users_temp) - .values({ - id: member.userId, - email: member.auth.email, - token: member.token || "", - emailVerified: true, - updatedAt: new Date(admin.createdAt) || new Date(), - role: "user", - image: member.auth.image, - createdAt: admin.createdAt, - canAccessToAPI: member.canAccessToAPI || false, - canAccessToDocker: member.canAccessToDocker || false, - canAccessToGitProviders: member.canAccessToGitProviders || false, - canAccessToSSHKeys: member.canAccessToSSHKeys || false, - canAccessToTraefikFiles: member.canAccessToTraefikFiles || false, - canCreateProjects: member.canCreateProjects || false, - canCreateServices: member.canCreateServices || false, - canDeleteProjects: member.canDeleteProjects || false, - canDeleteServices: member.canDeleteServices || false, - accessedProjects: member.accessedProjects || [], - accessedServices: member.accessedServices || [], - }) - .returning() - .then((userTemp) => userTemp[0]); +// for (const member of admin.users) { +// const userTemp = await db +// .insert(schema.users_temp) +// .values({ +// id: member.userId, +// email: member.auth.email, +// token: member.token || "", +// emailVerified: true, +// updatedAt: new Date(admin.createdAt) || new Date(), +// role: "user", +// image: member.auth.image, +// createdAt: admin.createdAt, +// canAccessToAPI: member.canAccessToAPI || false, +// canAccessToDocker: member.canAccessToDocker || false, +// canAccessToGitProviders: member.canAccessToGitProviders || false, +// canAccessToSSHKeys: member.canAccessToSSHKeys || false, +// canAccessToTraefikFiles: member.canAccessToTraefikFiles || false, +// canCreateProjects: member.canCreateProjects || false, +// canCreateServices: member.canCreateServices || false, +// canDeleteProjects: member.canDeleteProjects || false, +// canDeleteServices: member.canDeleteServices || false, +// accessedProjects: member.accessedProjects || [], +// accessedServices: member.accessedServices || [], +// }) +// .returning() +// .then((userTemp) => userTemp[0]); - await db.insert(schema.account).values({ - providerId: "credential", - userId: member?.userId || "", - password: member.auth.password, - is2FAEnabled: member.auth.is2FAEnabled || false, - createdAt: new Date(member.auth.createdAt) || new Date(), - updatedAt: new Date(member.auth.createdAt) || new Date(), - }); +// await db.insert(schema.account).values({ +// providerId: "credential", +// userId: member?.userId || "", +// password: member.auth.password, +// is2FAEnabled: member.auth.is2FAEnabled || false, +// createdAt: new Date(member.auth.createdAt) || new Date(), +// updatedAt: new Date(member.auth.createdAt) || new Date(), +// }); - await db.insert(schema.member).values({ - organizationId: organization?.id || "", - userId: userTemp?.id || "", - role: "admin", - createdAt: new Date(member.createdAt) || new Date(), - }); - } - } - }) - .then(() => { - console.log("Migration finished"); - }) - .catch((error) => { - console.error(error); - }); +// await db.insert(schema.member).values({ +// organizationId: organization?.id || "", +// userId: userTemp?.id || "", +// role: "admin", +// createdAt: new Date(member.createdAt) || new Date(), +// }); +// } +// } +// }) +// .then(() => { +// console.log("Migration finished"); +// }) +// .catch((error) => { +// console.error(error); +// }); -await db - .transaction(async (db) => { - const projects = await db.query.projects.findMany({ - with: { - user: { - with: { - organizations: true, - }, - }, - }, - }); - for (const project of projects) { - const _user = await db.update(schema.projects).set({ - organizationId: project.user.organizations[0]?.id || "", - }); - } - }) - .then(() => { - console.log("Migration finished"); - }) - .catch((error) => { - console.error(error); - }); +// await db +// .transaction(async (db) => { +// const projects = await db.query.projects.findMany({ +// with: { +// user: { +// with: { +// organizations: true, +// }, +// }, +// }, +// }); +// for (const project of projects) { +// const _user = await db.update(schema.projects).set({ +// organizationId: project.user.organizations[0]?.id || "", +// }); +// } +// }) +// .then(() => { +// console.log("Migration finished"); +// }) +// .catch((error) => { +// console.error(error); +// }); diff --git a/apps/dokploy/server/api/routers/user.ts b/apps/dokploy/server/api/routers/user.ts index b9f0adcd..1dac65fe 100644 --- a/apps/dokploy/server/api/routers/user.ts +++ b/apps/dokploy/server/api/routers/user.ts @@ -8,12 +8,14 @@ import { } from "@dokploy/server"; import { db } from "@dokploy/server/db"; import { + account, apiAssignPermissions, apiFindOneToken, apiUpdateUser, invitation, member, } from "@dokploy/server/db/schema"; +import * as bcrypt from "bcrypt"; import { TRPCError } from "@trpc/server"; import { and, asc, eq, gt } from "drizzle-orm"; import { z } from "zod"; @@ -81,6 +83,35 @@ export const userRouter = createTRPCRouter({ update: protectedProcedure .input(apiUpdateUser) .mutation(async ({ input, ctx }) => { + if (input.password || input.currentPassword) { + const currentAuth = await db.query.account.findFirst({ + where: eq(account.userId, ctx.user.id), + }); + const correctPassword = bcrypt.compareSync( + input.currentPassword || "", + currentAuth?.password || "", + ); + + if (!correctPassword) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Current password is incorrect", + }); + } + + if (!input.password) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "New password is required", + }); + } + await db + .update(account) + .set({ + password: bcrypt.hashSync(input.password, 10), + }) + .where(eq(account.userId, ctx.user.id)); + } return await updateUser(ctx.user.id, input); }), getUserByToken: publicProcedure diff --git a/packages/server/src/db/schema/user.ts b/packages/server/src/db/schema/user.ts index 2f3761fe..3916f1e7 100644 --- a/packages/server/src/db/schema/user.ts +++ b/packages/server/src/db/schema/user.ts @@ -278,6 +278,8 @@ export const apiUpdateWebServerMonitoring = z.object({ }); export const apiUpdateUser = createSchema.partial().extend({ + password: z.string().optional(), + currentPassword: z.string().optional(), metricsConfig: z .object({ server: z.object({