diff --git a/pages/dashboard/project/[projectId].tsx b/pages/dashboard/project/[projectId].tsx index a7d34a88c..acc4a1913 100644 --- a/pages/dashboard/project/[projectId].tsx +++ b/pages/dashboard/project/[projectId].tsx @@ -215,7 +215,7 @@ const Project = ( projectName={data?.name} /> - + diff --git a/server/api/routers/compose.ts b/server/api/routers/compose.ts index 6da5fe860..66a1327d7 100644 --- a/server/api/routers/compose.ts +++ b/server/api/routers/compose.ts @@ -34,13 +34,18 @@ import { nanoid } from "nanoid"; import { removeDeploymentsByComposeId } from "../services/deployment"; import { removeComposeDirectory } from "@/server/utils/filesystem/directory"; import { createCommand } from "@/server/utils/builders/compose"; -import { loadTemplateModule, readComposeFile } from "@/templates/utils"; +import { + generatePassword, + loadTemplateModule, + readComposeFile, +} from "@/templates/utils"; import { findAdmin } from "../services/admin"; import { TRPCError } from "@trpc/server"; -import { findProjectById, slugifyProjectName } from "../services/project"; +import { findProjectById } from "../services/project"; import { createMount } from "../services/mount"; import type { TemplatesKeys } from "@/templates/types/templates-data.type"; import { templates } from "@/templates/templates"; +import { slugify } from "@/lib/slug"; export const composeRouter = createTRPCRouter({ create: protectedProcedure @@ -229,7 +234,7 @@ export const composeRouter = createTRPCRouter({ const project = await findProjectById(input.projectId); - const projectName = slugifyProjectName(`${project.name}-${input.id}`); + const projectName = slugify(`${project.name}-${input.id}`); const { envs, mounts } = generate({ serverIp: admin.serverIp, projectName: projectName, @@ -241,6 +246,7 @@ export const composeRouter = createTRPCRouter({ env: envs.join("\n"), name: input.id, sourceType: "raw", + appName: `${projectName}-${generatePassword(6)}`, }); if (ctx.user.rol === "user") { diff --git a/server/api/services/compose.ts b/server/api/services/compose.ts index 8f519e8a8..3a7739189 100644 --- a/server/api/services/compose.ts +++ b/server/api/services/compose.ts @@ -13,10 +13,21 @@ import { join } from "node:path"; import { COMPOSE_PATH } from "@/server/constants"; import { cloneGithubRepository } from "@/server/utils/providers/github"; import { cloneGitRepository } from "@/server/utils/providers/git"; +import { validUniqueServerAppName } from "./project"; export type Compose = typeof compose.$inferSelect; export const createCompose = async (input: typeof apiCreateCompose._type) => { + if (input.appName) { + const valid = await validUniqueServerAppName(input.appName); + + if (!valid) { + throw new TRPCError({ + code: "CONFLICT", + message: "Service with this 'AppName' already exists", + }); + } + } const newDestination = await db .insert(compose) .values({ @@ -39,6 +50,16 @@ export const createCompose = async (input: typeof apiCreateCompose._type) => { export const createComposeByTemplate = async ( input: typeof compose.$inferInsert, ) => { + if (input.appName) { + const valid = await validUniqueServerAppName(input.appName); + + if (!valid) { + throw new TRPCError({ + code: "CONFLICT", + message: "Service with this 'AppName' already exists", + }); + } + } const newDestination = await db .insert(compose) .values({