From 83153471b84fb4770df2ed7d21c4176afd82c8ae Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 8 Jun 2024 16:42:38 -0600
Subject: [PATCH] feat: add docker compose appName validation
---
pages/dashboard/project/[projectId].tsx | 2 +-
server/api/routers/compose.ts | 12 +++++++++---
server/api/services/compose.ts | 21 +++++++++++++++++++++
3 files changed, 31 insertions(+), 4 deletions(-)
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({