194 lines · 4.2 KB · TypeScript
RawDownload
import { db } from "@dokploy/server/db";import {	type apiCreateGithub,	gitProvider,	github,} from "@dokploy/server/db/schema";import { TRPCError } from "@trpc/server";import { eq } from "drizzle-orm";import { authGithub } from "../utils/providers/github";import { updatePreviewDeployment } from "./preview-deployment"; export type Github = typeof github.$inferSelect;export const createGithub = async (	input: typeof apiCreateGithub._type,	organizationId: string,	userId: string,) => {	return await db.transaction(async (tx) => {		const newGitProvider = await tx			.insert(gitProvider)			.values({				providerType: "github",				organizationId: organizationId,				name: input.name,				userId: userId,			})			.returning()			.then((response) => response[0]); 		if (!newGitProvider) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error creating the Git provider",			});		} 		return await tx			.insert(github)			.values({				...input,				gitProviderId: newGitProvider?.gitProviderId,			})			.returning()			.then((response) => response[0]);	});}; export const findGithubById = async (githubId: string) => {	const githubProviderResult = await db.query.github.findFirst({		where: eq(github.githubId, githubId),		with: {			gitProvider: true,		},	}); 	if (!githubProviderResult) {		throw new TRPCError({			code: "NOT_FOUND",			message: "Github Provider not found",		});	} 	return githubProviderResult;}; export const updateGithub = async (	githubId: string,	input: Partial<Github>,) => {	return await db		.update(github)		.set({			...input,		})		.where(eq(github.githubId, githubId))		.returning()		.then((response) => response[0]);}; export const getIssueComment = (	appName: string,	status: "success" | "error" | "running" | "initializing",	previewDomain: string,) => {	let statusMessage = "";	if (status === "success") {		statusMessage = "✅ Done";	} else if (status === "error") {		statusMessage = "❌ Failed";	} else if (status === "initializing") {		statusMessage = "🔄 Building";	} else {		statusMessage = "🔄 Building";	}	const finished = `| Name       | Status       | Preview                             | Updated (UTC)         ||------------|--------------|-------------------------------------|-----------------------|| ${appName}  | ${statusMessage} | [Preview URL](${previewDomain}) | ${new Date().toISOString()} |`; 	return finished;};interface CommentExists {	owner: string;	repository: string;	comment_id: number;	githubId: string;}export const issueCommentExists = async ({	owner,	repository,	comment_id,	githubId,}: CommentExists) => {	const github = await findGithubById(githubId);	const octokit = authGithub(github);	try {		await octokit.rest.issues.getComment({			owner: owner || "",			repo: repository || "",			comment_id: comment_id,		});		return true;	} catch {		return false;	}};interface Comment {	owner: string;	repository: string;	issue_number: string;	body: string;	comment_id: number;	githubId: string;}export const updateIssueComment = async ({	owner,	repository,	issue_number,	body,	comment_id,	githubId,}: Comment) => {	const github = await findGithubById(githubId);	const octokit = authGithub(github); 	await octokit.rest.issues.updateComment({		owner: owner || "",		repo: repository || "",		issue_number: issue_number,		body,		comment_id: comment_id,	});}; interface CommentCreate {	appName: string;	owner: string;	repository: string;	issue_number: string;	previewDomain: string;	githubId: string;	previewDeploymentId: string;} export const createPreviewDeploymentComment = async ({	owner,	repository,	issue_number,	previewDomain,	appName,	githubId,	previewDeploymentId,}: CommentCreate) => {	const github = await findGithubById(githubId);	const octokit = authGithub(github); 	const runningComment = getIssueComment(		appName,		"initializing",		previewDomain,	); 	const issue = await octokit.rest.issues.createComment({		owner: owner || "",		repo: repository || "",		issue_number: Number.parseInt(issue_number),		body: `### Dokploy Preview Deployment\n\n${runningComment}`,	}); 	return await updatePreviewDeployment(previewDeploymentId, {		pullRequestCommentId: `${issue.data.id}`,	}).then((response) => response[0]);};