import { db } from "@dokploy/server/db"; import { generateRandomDomain } from "@dokploy/server/templates/utils"; import { manageDomain } from "@dokploy/server/utils/traefik/domain"; import { TRPCError } from "@trpc/server"; import { eq } from "drizzle-orm"; import { type apiCreateDomain, domains } from "../db/schema"; import { findAdmin, findAdminById } from "./admin"; import { findApplicationById } from "./application"; import { findServerById } from "./server"; export type Domain = typeof domains.$inferSelect; export const createDomain = async (input: typeof apiCreateDomain._type) => { const result = await db.transaction(async (tx) => { const domain = await tx .insert(domains) .values({ ...input, }) .returning() .then((response) => response[0]); if (!domain) { throw new TRPCError({ code: "BAD_REQUEST", message: "Error creating domain", }); } if (domain.applicationId) { const application = await findApplicationById(domain.applicationId); await manageDomain(application, domain); } return domain; }); return result; }; export const generateTraefikMeDomain = async ( appName: string, adminId: string, serverId?: string, ) => { if (serverId) { const server = await findServerById(serverId); return generateRandomDomain({ serverIp: server.ipAddress, projectName: appName, }); } if (process.env.NODE_ENV === "development") { return generateRandomDomain({ serverIp: "", projectName: appName, }); } const admin = await findAdminById(adminId); return generateRandomDomain({ serverIp: admin?.serverIp || "", projectName: appName, }); }; export const generateWildcardDomain = ( appName: string, serverDomain: string, ) => { return `${appName}-${serverDomain}`; }; export const findDomainById = async (domainId: string) => { const domain = await db.query.domains.findFirst({ where: eq(domains.domainId, domainId), with: { application: true, }, }); if (!domain) { throw new TRPCError({ code: "NOT_FOUND", message: "Domain not found", }); } return domain; }; export const findDomainsByApplicationId = async (applicationId: string) => { const domainsArray = await db.query.domains.findMany({ where: eq(domains.applicationId, applicationId), with: { application: true, }, }); return domainsArray; }; export const findDomainsByComposeId = async (composeId: string) => { const domainsArray = await db.query.domains.findMany({ where: eq(domains.composeId, composeId), with: { compose: true, }, }); return domainsArray; }; export const updateDomainById = async ( domainId: string, domainData: Partial, ) => { const domain = await db .update(domains) .set({ ...domainData, }) .where(eq(domains.domainId, domainId)) .returning(); return domain[0]; }; export const removeDomainById = async (domainId: string) => { await findDomainById(domainId); // TODO: fix order const result = await db .delete(domains) .where(eq(domains.domainId, domainId)) .returning(); return result[0]; }; export const getDomainHost = (domain: Domain) => { return `${domain.https ? "https" : "http"}://${domain.host}`; };