diff --git a/apps/dokploy/components/proprietary/sso/register-oidc-dialog.tsx b/apps/dokploy/components/proprietary/sso/register-oidc-dialog.tsx index 1ad923c0c..1f34b0347 100644 --- a/apps/dokploy/components/proprietary/sso/register-oidc-dialog.tsx +++ b/apps/dokploy/components/proprietary/sso/register-oidc-dialog.tsx @@ -120,10 +120,7 @@ export function RegisterOidcDialog({ children }: RegisterOidcDialogProps) { Provider ID - + Unique identifier; used in callback URL path. @@ -139,10 +136,7 @@ export function RegisterOidcDialog({ children }: RegisterOidcDialogProps) { Issuer URL - + Discovery document is fetched from{" "} diff --git a/apps/dokploy/components/proprietary/sso/register-saml-dialog.tsx b/apps/dokploy/components/proprietary/sso/register-saml-dialog.tsx index 3424eafdf..b8ae4ccb3 100644 --- a/apps/dokploy/components/proprietary/sso/register-saml-dialog.tsx +++ b/apps/dokploy/components/proprietary/sso/register-saml-dialog.tsx @@ -144,10 +144,7 @@ export function RegisterSamlDialog({ children }: RegisterSamlDialogProps) { Issuer URL - + @@ -230,10 +227,7 @@ export function RegisterSamlDialog({ children }: RegisterSamlDialogProps) { Audience (Entity ID) - + diff --git a/apps/dokploy/server/api/trpc.ts b/apps/dokploy/server/api/trpc.ts index 64dd7629b..ce8d8c4ea 100644 --- a/apps/dokploy/server/api/trpc.ts +++ b/apps/dokploy/server/api/trpc.ts @@ -242,7 +242,10 @@ export const enterpriseProcedure = t.procedure.use(async ({ ctx, next }) => { }, }); - if (!currentUser?.enableEnterpriseFeatures || !currentUser.isValidEnterpriseLicense) { + if ( + !currentUser?.enableEnterpriseFeatures || + !currentUser.isValidEnterpriseLicense + ) { throw new TRPCError({ code: "FORBIDDEN", message: "Valid enterprise license required", diff --git a/packages/server/auth-schema2.ts b/packages/server/auth-schema2.ts index 41a31048e..f2d028c23 100644 --- a/packages/server/auth-schema2.ts +++ b/packages/server/auth-schema2.ts @@ -1,274 +1,274 @@ import { relations } from "drizzle-orm"; import { - pgTable, - text, - timestamp, - boolean, - integer, - index, - uniqueIndex, + pgTable, + text, + timestamp, + boolean, + integer, + index, + uniqueIndex, } from "drizzle-orm/pg-core"; export const user = pgTable("user", { - id: text("id").primaryKey(), - firstName: text("first_name").notNull(), - email: text("email").notNull().unique(), - emailVerified: boolean("email_verified").default(false).notNull(), - image: text("image"), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at") - .defaultNow() - .$onUpdate(() => /* @__PURE__ */ new Date()) - .notNull(), - twoFactorEnabled: boolean("two_factor_enabled").default(false), - role: text("role"), - ownerId: text("owner_id"), - allowImpersonation: boolean("allow_impersonation").default(false), - lastName: text("last_name").default(""), + id: text("id").primaryKey(), + firstName: text("first_name").notNull(), + email: text("email").notNull().unique(), + emailVerified: boolean("email_verified").default(false).notNull(), + image: text("image"), + createdAt: timestamp("created_at").defaultNow().notNull(), + updatedAt: timestamp("updated_at") + .defaultNow() + .$onUpdate(() => /* @__PURE__ */ new Date()) + .notNull(), + twoFactorEnabled: boolean("two_factor_enabled").default(false), + role: text("role"), + ownerId: text("owner_id"), + allowImpersonation: boolean("allow_impersonation").default(false), + lastName: text("last_name").default(""), }); export const session = pgTable( - "session", - { - id: text("id").primaryKey(), - expiresAt: timestamp("expires_at").notNull(), - token: text("token").notNull().unique(), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at") - .$onUpdate(() => /* @__PURE__ */ new Date()) - .notNull(), - ipAddress: text("ip_address"), - userAgent: text("user_agent"), - userId: text("user_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - activeOrganizationId: text("active_organization_id"), - }, - (table) => [index("session_userId_idx").on(table.userId)], + "session", + { + id: text("id").primaryKey(), + expiresAt: timestamp("expires_at").notNull(), + token: text("token").notNull().unique(), + createdAt: timestamp("created_at").defaultNow().notNull(), + updatedAt: timestamp("updated_at") + .$onUpdate(() => /* @__PURE__ */ new Date()) + .notNull(), + ipAddress: text("ip_address"), + userAgent: text("user_agent"), + userId: text("user_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + activeOrganizationId: text("active_organization_id"), + }, + (table) => [index("session_userId_idx").on(table.userId)], ); export const account = pgTable( - "account", - { - id: text("id").primaryKey(), - accountId: text("account_id").notNull(), - providerId: text("provider_id").notNull(), - userId: text("user_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - accessToken: text("access_token"), - refreshToken: text("refresh_token"), - idToken: text("id_token"), - accessTokenExpiresAt: timestamp("access_token_expires_at"), - refreshTokenExpiresAt: timestamp("refresh_token_expires_at"), - scope: text("scope"), - password: text("password"), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at") - .$onUpdate(() => /* @__PURE__ */ new Date()) - .notNull(), - }, - (table) => [index("account_userId_idx").on(table.userId)], + "account", + { + id: text("id").primaryKey(), + accountId: text("account_id").notNull(), + providerId: text("provider_id").notNull(), + userId: text("user_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + accessToken: text("access_token"), + refreshToken: text("refresh_token"), + idToken: text("id_token"), + accessTokenExpiresAt: timestamp("access_token_expires_at"), + refreshTokenExpiresAt: timestamp("refresh_token_expires_at"), + scope: text("scope"), + password: text("password"), + createdAt: timestamp("created_at").defaultNow().notNull(), + updatedAt: timestamp("updated_at") + .$onUpdate(() => /* @__PURE__ */ new Date()) + .notNull(), + }, + (table) => [index("account_userId_idx").on(table.userId)], ); export const verification = pgTable( - "verification", - { - id: text("id").primaryKey(), - identifier: text("identifier").notNull(), - value: text("value").notNull(), - expiresAt: timestamp("expires_at").notNull(), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at") - .defaultNow() - .$onUpdate(() => /* @__PURE__ */ new Date()) - .notNull(), - }, - (table) => [index("verification_identifier_idx").on(table.identifier)], + "verification", + { + id: text("id").primaryKey(), + identifier: text("identifier").notNull(), + value: text("value").notNull(), + expiresAt: timestamp("expires_at").notNull(), + createdAt: timestamp("created_at").defaultNow().notNull(), + updatedAt: timestamp("updated_at") + .defaultNow() + .$onUpdate(() => /* @__PURE__ */ new Date()) + .notNull(), + }, + (table) => [index("verification_identifier_idx").on(table.identifier)], ); export const apikey = pgTable( - "apikey", - { - id: text("id").primaryKey(), - name: text("name"), - start: text("start"), - prefix: text("prefix"), - key: text("key").notNull(), - userId: text("user_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - refillInterval: integer("refill_interval"), - refillAmount: integer("refill_amount"), - lastRefillAt: timestamp("last_refill_at"), - enabled: boolean("enabled").default(true), - rateLimitEnabled: boolean("rate_limit_enabled").default(true), - rateLimitTimeWindow: integer("rate_limit_time_window").default(86400000), - rateLimitMax: integer("rate_limit_max").default(10), - requestCount: integer("request_count").default(0), - remaining: integer("remaining"), - lastRequest: timestamp("last_request"), - expiresAt: timestamp("expires_at"), - createdAt: timestamp("created_at").notNull(), - updatedAt: timestamp("updated_at").notNull(), - permissions: text("permissions"), - metadata: text("metadata"), - }, - (table) => [ - index("apikey_key_idx").on(table.key), - index("apikey_userId_idx").on(table.userId), - ], + "apikey", + { + id: text("id").primaryKey(), + name: text("name"), + start: text("start"), + prefix: text("prefix"), + key: text("key").notNull(), + userId: text("user_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + refillInterval: integer("refill_interval"), + refillAmount: integer("refill_amount"), + lastRefillAt: timestamp("last_refill_at"), + enabled: boolean("enabled").default(true), + rateLimitEnabled: boolean("rate_limit_enabled").default(true), + rateLimitTimeWindow: integer("rate_limit_time_window").default(86400000), + rateLimitMax: integer("rate_limit_max").default(10), + requestCount: integer("request_count").default(0), + remaining: integer("remaining"), + lastRequest: timestamp("last_request"), + expiresAt: timestamp("expires_at"), + createdAt: timestamp("created_at").notNull(), + updatedAt: timestamp("updated_at").notNull(), + permissions: text("permissions"), + metadata: text("metadata"), + }, + (table) => [ + index("apikey_key_idx").on(table.key), + index("apikey_userId_idx").on(table.userId), + ], ); export const ssoProvider = pgTable("sso_provider", { - id: text("id").primaryKey(), - issuer: text("issuer").notNull(), - oidcConfig: text("oidc_config"), - samlConfig: text("saml_config"), - userId: text("user_id").references(() => user.id, { onDelete: "cascade" }), - providerId: text("provider_id").notNull().unique(), - organizationId: text("organization_id"), - domain: text("domain").notNull(), + id: text("id").primaryKey(), + issuer: text("issuer").notNull(), + oidcConfig: text("oidc_config"), + samlConfig: text("saml_config"), + userId: text("user_id").references(() => user.id, { onDelete: "cascade" }), + providerId: text("provider_id").notNull().unique(), + organizationId: text("organization_id"), + domain: text("domain").notNull(), }); export const twoFactor = pgTable( - "two_factor", - { - id: text("id").primaryKey(), - secret: text("secret").notNull(), - backupCodes: text("backup_codes").notNull(), - userId: text("user_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - }, - (table) => [ - index("twoFactor_secret_idx").on(table.secret), - index("twoFactor_userId_idx").on(table.userId), - ], + "two_factor", + { + id: text("id").primaryKey(), + secret: text("secret").notNull(), + backupCodes: text("backup_codes").notNull(), + userId: text("user_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + }, + (table) => [ + index("twoFactor_secret_idx").on(table.secret), + index("twoFactor_userId_idx").on(table.userId), + ], ); export const organization = pgTable( - "organization", - { - id: text("id").primaryKey(), - name: text("name").notNull(), - slug: text("slug").notNull().unique(), - logo: text("logo"), - createdAt: timestamp("created_at").notNull(), - metadata: text("metadata"), - }, - (table) => [uniqueIndex("organization_slug_uidx").on(table.slug)], + "organization", + { + id: text("id").primaryKey(), + name: text("name").notNull(), + slug: text("slug").notNull().unique(), + logo: text("logo"), + createdAt: timestamp("created_at").notNull(), + metadata: text("metadata"), + }, + (table) => [uniqueIndex("organization_slug_uidx").on(table.slug)], ); export const member = pgTable( - "member", - { - id: text("id").primaryKey(), - organizationId: text("organization_id") - .notNull() - .references(() => organization.id, { onDelete: "cascade" }), - userId: text("user_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - role: text("role").default("member").notNull(), - createdAt: timestamp("created_at").notNull(), - }, - (table) => [ - index("member_organizationId_idx").on(table.organizationId), - index("member_userId_idx").on(table.userId), - ], + "member", + { + id: text("id").primaryKey(), + organizationId: text("organization_id") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), + userId: text("user_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + role: text("role").default("member").notNull(), + createdAt: timestamp("created_at").notNull(), + }, + (table) => [ + index("member_organizationId_idx").on(table.organizationId), + index("member_userId_idx").on(table.userId), + ], ); export const invitation = pgTable( - "invitation", - { - id: text("id").primaryKey(), - organizationId: text("organization_id") - .notNull() - .references(() => organization.id, { onDelete: "cascade" }), - email: text("email").notNull(), - role: text("role"), - status: text("status").default("pending").notNull(), - expiresAt: timestamp("expires_at").notNull(), - createdAt: timestamp("created_at").defaultNow().notNull(), - inviterId: text("inviter_id") - .notNull() - .references(() => user.id, { onDelete: "cascade" }), - }, - (table) => [ - index("invitation_organizationId_idx").on(table.organizationId), - index("invitation_email_idx").on(table.email), - ], + "invitation", + { + id: text("id").primaryKey(), + organizationId: text("organization_id") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), + email: text("email").notNull(), + role: text("role"), + status: text("status").default("pending").notNull(), + expiresAt: timestamp("expires_at").notNull(), + createdAt: timestamp("created_at").defaultNow().notNull(), + inviterId: text("inviter_id") + .notNull() + .references(() => user.id, { onDelete: "cascade" }), + }, + (table) => [ + index("invitation_organizationId_idx").on(table.organizationId), + index("invitation_email_idx").on(table.email), + ], ); export const userRelations = relations(user, ({ many }) => ({ - sessions: many(session), - accounts: many(account), - apikeys: many(apikey), - ssoProviders: many(ssoProvider), - twoFactors: many(twoFactor), - members: many(member), - invitations: many(invitation), + sessions: many(session), + accounts: many(account), + apikeys: many(apikey), + ssoProviders: many(ssoProvider), + twoFactors: many(twoFactor), + members: many(member), + invitations: many(invitation), })); export const sessionRelations = relations(session, ({ one }) => ({ - user: one(user, { - fields: [session.userId], - references: [user.id], - }), + user: one(user, { + fields: [session.userId], + references: [user.id], + }), })); export const accountRelations = relations(account, ({ one }) => ({ - user: one(user, { - fields: [account.userId], - references: [user.id], - }), + user: one(user, { + fields: [account.userId], + references: [user.id], + }), })); export const apikeyRelations = relations(apikey, ({ one }) => ({ - user: one(user, { - fields: [apikey.userId], - references: [user.id], - }), + user: one(user, { + fields: [apikey.userId], + references: [user.id], + }), })); export const ssoProviderRelations = relations(ssoProvider, ({ one }) => ({ - user: one(user, { - fields: [ssoProvider.userId], - references: [user.id], - }), + user: one(user, { + fields: [ssoProvider.userId], + references: [user.id], + }), })); export const twoFactorRelations = relations(twoFactor, ({ one }) => ({ - user: one(user, { - fields: [twoFactor.userId], - references: [user.id], - }), + user: one(user, { + fields: [twoFactor.userId], + references: [user.id], + }), })); export const organizationRelations = relations(organization, ({ many }) => ({ - members: many(member), - invitations: many(invitation), + members: many(member), + invitations: many(invitation), })); export const memberRelations = relations(member, ({ one }) => ({ - organization: one(organization, { - fields: [member.organizationId], - references: [organization.id], - }), - user: one(user, { - fields: [member.userId], - references: [user.id], - }), + organization: one(organization, { + fields: [member.organizationId], + references: [organization.id], + }), + user: one(user, { + fields: [member.userId], + references: [user.id], + }), })); export const invitationRelations = relations(invitation, ({ one }) => ({ - organization: one(organization, { - fields: [invitation.organizationId], - references: [organization.id], - }), - user: one(user, { - fields: [invitation.inviterId], - references: [user.id], - }), + organization: one(organization, { + fields: [invitation.organizationId], + references: [organization.id], + }), + user: one(user, { + fields: [invitation.inviterId], + references: [user.id], + }), }));