mirror of
https://github.com/dokploy/dokploy.git
synced 2026-06-13 19:09:49 +00:00
41c09cd86b
- Added a new `forward_auth_settings` table to manage authentication domains and their configurations. - Introduced UI components for handling forward authentication, including enabling/disabling SSO for domains and selecting SSO providers. - Updated existing tests to include validation for the new `forwardAuthProviderId` field in domain configurations. - Enhanced the dashboard to integrate forward authentication management, allowing users to configure SSO settings directly from the application interface. This update improves the flexibility and security of application authentication by allowing integration with various identity providers.
142 lines
3.8 KiB
TypeScript
142 lines
3.8 KiB
TypeScript
import { relations, sql } from "drizzle-orm";
|
|
import {
|
|
type AnyPgColumn,
|
|
boolean,
|
|
integer,
|
|
pgEnum,
|
|
pgTable,
|
|
serial,
|
|
text,
|
|
} from "drizzle-orm/pg-core";
|
|
import { createInsertSchema } from "drizzle-zod";
|
|
import { nanoid } from "nanoid";
|
|
import { z } from "zod";
|
|
import { domain } from "../validations/domain";
|
|
import { applications } from "./application";
|
|
import { compose } from "./compose";
|
|
import { previewDeployments } from "./preview-deployments";
|
|
import { certificateType } from "./shared";
|
|
import { ssoProvider } from "./sso";
|
|
|
|
export const domainType = pgEnum("domainType", [
|
|
"compose",
|
|
"application",
|
|
"preview",
|
|
]);
|
|
|
|
export const domains = pgTable("domain", {
|
|
domainId: text("domainId")
|
|
.notNull()
|
|
.primaryKey()
|
|
.$defaultFn(() => nanoid()),
|
|
host: text("host").notNull(),
|
|
https: boolean("https").notNull().default(false),
|
|
port: integer("port").default(3000),
|
|
customEntrypoint: text("customEntrypoint"),
|
|
path: text("path").default("/"),
|
|
serviceName: text("serviceName"),
|
|
domainType: domainType("domainType").default("application"),
|
|
uniqueConfigKey: serial("uniqueConfigKey"),
|
|
createdAt: text("createdAt")
|
|
.notNull()
|
|
.$defaultFn(() => new Date().toISOString()),
|
|
composeId: text("composeId").references(() => compose.composeId, {
|
|
onDelete: "cascade",
|
|
}),
|
|
customCertResolver: text("customCertResolver"),
|
|
applicationId: text("applicationId").references(
|
|
() => applications.applicationId,
|
|
{ onDelete: "cascade" },
|
|
),
|
|
previewDeploymentId: text("previewDeploymentId").references(
|
|
(): AnyPgColumn => previewDeployments.previewDeploymentId,
|
|
{ onDelete: "cascade" },
|
|
),
|
|
certificateType: certificateType("certificateType").notNull().default("none"),
|
|
internalPath: text("internalPath").default("/"),
|
|
stripPath: boolean("stripPath").notNull().default(false),
|
|
middlewares: text("middlewares").array().default(sql`ARRAY[]::text[]`),
|
|
forwardAuthProviderId: text("forwardAuthProviderId").references(
|
|
() => ssoProvider.providerId,
|
|
{ onDelete: "set null" },
|
|
),
|
|
});
|
|
|
|
export const domainsRelations = relations(domains, ({ one }) => ({
|
|
application: one(applications, {
|
|
fields: [domains.applicationId],
|
|
references: [applications.applicationId],
|
|
}),
|
|
compose: one(compose, {
|
|
fields: [domains.composeId],
|
|
references: [compose.composeId],
|
|
}),
|
|
previewDeployment: one(previewDeployments, {
|
|
fields: [domains.previewDeploymentId],
|
|
references: [previewDeployments.previewDeploymentId],
|
|
}),
|
|
forwardAuthProvider: one(ssoProvider, {
|
|
fields: [domains.forwardAuthProviderId],
|
|
references: [ssoProvider.providerId],
|
|
}),
|
|
}));
|
|
|
|
const createSchema = createInsertSchema(domains, {
|
|
...domain.shape,
|
|
// Override pgEnum so Zod 4 infers only string literals, not numeric enum index
|
|
domainType: z.enum(["compose", "application", "preview"]).optional(),
|
|
});
|
|
|
|
export const apiCreateDomain = createSchema.pick({
|
|
host: true,
|
|
path: true,
|
|
port: true,
|
|
customEntrypoint: true,
|
|
https: true,
|
|
applicationId: true,
|
|
certificateType: true,
|
|
customCertResolver: true,
|
|
composeId: true,
|
|
serviceName: true,
|
|
domainType: true,
|
|
previewDeploymentId: true,
|
|
internalPath: true,
|
|
stripPath: true,
|
|
middlewares: true,
|
|
forwardAuthProviderId: true,
|
|
});
|
|
|
|
export const apiFindDomain = z.object({
|
|
domainId: z.string().min(1),
|
|
});
|
|
|
|
export const apiFindDomainByApplication = createSchema.pick({
|
|
applicationId: true,
|
|
});
|
|
|
|
export const apiCreateTraefikMeDomain = createSchema.pick({}).extend({
|
|
appName: z.string().min(1),
|
|
});
|
|
|
|
export const apiFindDomainByCompose = createSchema.pick({
|
|
composeId: true,
|
|
});
|
|
|
|
export const apiUpdateDomain = createSchema
|
|
.pick({
|
|
host: true,
|
|
path: true,
|
|
port: true,
|
|
customEntrypoint: true,
|
|
https: true,
|
|
certificateType: true,
|
|
customCertResolver: true,
|
|
serviceName: true,
|
|
domainType: true,
|
|
internalPath: true,
|
|
stripPath: true,
|
|
middlewares: true,
|
|
forwardAuthProviderId: true,
|
|
})
|
|
.merge(createSchema.pick({ domainId: true }).required());
|