148 lines · 3.0 KB · TypeScript
RawDownload
import { db } from "@dokploy/server/db";import {	type apiCreateProject,	applications,	libsql,	mariadb,	mongo,	mysql,	postgres,	projects,	redis,} from "@dokploy/server/db/schema";import { TRPCError } from "@trpc/server";import { eq } from "drizzle-orm";import type { z } from "zod";import { createProductionEnvironment } from "./environment"; export type Project = typeof projects.$inferSelect; export const createProject = async (	input: z.infer<typeof apiCreateProject>,	organizationId: string,) => {	const newProject = await db		.insert(projects)		.values({			...input,			organizationId: organizationId,		})		.returning()		.then((value) => value[0]); 	if (!newProject) {		throw new TRPCError({			code: "BAD_REQUEST",			message: "Error creating the project",		});	} 	// Automatically create a production environment	const newEnvironment = await createProductionEnvironment(		newProject.projectId,	);	return {		project: newProject,		environment: newEnvironment,	};}; export const findProjectById = async (projectId: string) => {	const project = await db.query.projects.findFirst({		where: eq(projects.projectId, projectId),		with: {			environments: {				with: {					applications: true,					compose: true,					libsql: true,					mariadb: true,					mongo: true,					mysql: true,					postgres: true,					redis: true,				},			},			projectTags: {				with: {					tag: true,				},			},		},	});	if (!project) {		throw new TRPCError({			code: "NOT_FOUND",			message: "Project not found",		});	}	return project;}; export const deleteProject = async (projectId: string) => {	const project = await db		.delete(projects)		.where(eq(projects.projectId, projectId))		.returning()		.then((value) => value[0]); 	return project;}; export const updateProjectById = async (	projectId: string,	projectData: Partial<Project>,) => {	const result = await db		.update(projects)		.set({			...projectData,		})		.where(eq(projects.projectId, projectId))		.returning()		.then((res) => res[0]); 	return result;}; export const validUniqueServerAppName = async (appName: string) => {	const query = await db.query.environments.findMany({		with: {			applications: {				where: eq(applications.appName, appName),			},			libsql: {				where: eq(libsql.appName, appName),			},			mariadb: {				where: eq(mariadb.appName, appName),			},			mongo: {				where: eq(mongo.appName, appName),			},			mysql: {				where: eq(mysql.appName, appName),			},			postgres: {				where: eq(postgres.appName, appName),			},			redis: {				where: eq(redis.appName, appName),			},		},	}); 	// Filter out items with non-empty fields	const nonEmptyProjects = query.filter(		(project) =>			project.applications.length > 0 ||			project.libsql.length > 0 ||			project.mariadb.length > 0 ||			project.mongo.length > 0 ||			project.mysql.length > 0 ||			project.postgres.length > 0 ||			project.redis.length > 0,	); 	return nonEmptyProjects.length === 0;};