1236 lines · 29.1 KB · TypeScript
RawDownload
import { db } from "@dokploy/server/db";import {	type apiCreateCustom,	type apiCreateDiscord,	type apiCreateEmail,	type apiCreateGotify,	type apiCreateLark,	type apiCreateMattermost,	type apiCreateNtfy,	type apiCreatePushover,	type apiCreateResend,	type apiCreateSlack,	type apiCreateTeams,	type apiCreateTelegram,	type apiUpdateCustom,	type apiUpdateDiscord,	type apiUpdateEmail,	type apiUpdateGotify,	type apiUpdateLark,	type apiUpdateMattermost,	type apiUpdateNtfy,	type apiUpdatePushover,	type apiUpdateResend,	type apiUpdateSlack,	type apiUpdateTeams,	type apiUpdateTelegram,	custom,	discord,	email,	gotify,	lark,	mattermost,	notifications,	ntfy,	pushover,	resend,	slack,	teams,	telegram,} from "@dokploy/server/db/schema";import { TRPCError } from "@trpc/server";import { eq } from "drizzle-orm";import type { z } from "zod"; export type Notification = typeof notifications.$inferSelect; export const createSlackNotification = async (	input: z.infer<typeof apiCreateSlack>,	organizationId: string,) => {	await db.transaction(async (tx) => {		const newSlack = await tx			.insert(slack)			.values({				channel: input.channel,				webhookUrl: input.webhookUrl,			})			.returning()			.then((value) => value[0]); 		if (!newSlack) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting slack",			});		} 		const newDestination = await tx			.insert(notifications)			.values({				slackId: newSlack.slackId,				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				notificationType: "slack",				organizationId: organizationId,				serverThreshold: input.serverThreshold,			})			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting notification",			});		} 		return newDestination;	});}; export const updateSlackNotification = async (	input: z.infer<typeof apiUpdateSlack>,) => {	await db.transaction(async (tx) => {		const newDestination = await tx			.update(notifications)			.set({				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				organizationId: input.organizationId,				serverThreshold: input.serverThreshold,			})			.where(eq(notifications.notificationId, input.notificationId))			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error Updating notification",			});		} 		await tx			.update(slack)			.set({				channel: input.channel,				webhookUrl: input.webhookUrl,			})			.where(eq(slack.slackId, input.slackId))			.returning()			.then((value) => value[0]); 		return newDestination;	});}; export const createTelegramNotification = async (	input: z.infer<typeof apiCreateTelegram>,	organizationId: string,) => {	await db.transaction(async (tx) => {		const newTelegram = await tx			.insert(telegram)			.values({				botToken: input.botToken,				chatId: input.chatId,				messageThreadId: input.messageThreadId,			})			.returning()			.then((value) => value[0]); 		if (!newTelegram) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting telegram",			});		} 		const newDestination = await tx			.insert(notifications)			.values({				telegramId: newTelegram.telegramId,				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				notificationType: "telegram",				organizationId: organizationId,				serverThreshold: input.serverThreshold,			})			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting notification",			});		} 		return newDestination;	});}; export const updateTelegramNotification = async (	input: z.infer<typeof apiUpdateTelegram>,) => {	await db.transaction(async (tx) => {		const newDestination = await tx			.update(notifications)			.set({				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				organizationId: input.organizationId,				serverThreshold: input.serverThreshold,			})			.where(eq(notifications.notificationId, input.notificationId))			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error Updating notification",			});		} 		await tx			.update(telegram)			.set({				botToken: input.botToken,				chatId: input.chatId,				messageThreadId: input.messageThreadId,			})			.where(eq(telegram.telegramId, input.telegramId))			.returning()			.then((value) => value[0]); 		return newDestination;	});}; export const createDiscordNotification = async (	input: z.infer<typeof apiCreateDiscord>,	organizationId: string,) => {	await db.transaction(async (tx) => {		const newDiscord = await tx			.insert(discord)			.values({				webhookUrl: input.webhookUrl,				decoration: input.decoration,			})			.returning()			.then((value) => value[0]); 		if (!newDiscord) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting discord",			});		} 		const newDestination = await tx			.insert(notifications)			.values({				discordId: newDiscord.discordId,				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				notificationType: "discord",				organizationId: organizationId,				serverThreshold: input.serverThreshold,			})			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting notification",			});		} 		return newDestination;	});}; export const updateDiscordNotification = async (	input: z.infer<typeof apiUpdateDiscord>,) => {	await db.transaction(async (tx) => {		const newDestination = await tx			.update(notifications)			.set({				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				organizationId: input.organizationId,				serverThreshold: input.serverThreshold,			})			.where(eq(notifications.notificationId, input.notificationId))			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error Updating notification",			});		} 		await tx			.update(discord)			.set({				webhookUrl: input.webhookUrl,				decoration: input.decoration,			})			.where(eq(discord.discordId, input.discordId))			.returning()			.then((value) => value[0]); 		return newDestination;	});}; export const createEmailNotification = async (	input: z.infer<typeof apiCreateEmail>,	organizationId: string,) => {	await db.transaction(async (tx) => {		const newEmail = await tx			.insert(email)			.values({				smtpServer: input.smtpServer,				smtpPort: input.smtpPort,				username: input.username,				password: input.password,				fromAddress: input.fromAddress,				toAddresses: input.toAddresses,			})			.returning()			.then((value) => value[0]); 		if (!newEmail) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting email",			});		} 		const newDestination = await tx			.insert(notifications)			.values({				emailId: newEmail.emailId,				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				notificationType: "email",				organizationId: organizationId,				serverThreshold: input.serverThreshold,			})			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting notification",			});		} 		return newDestination;	});}; export const updateEmailNotification = async (	input: z.infer<typeof apiUpdateEmail>,) => {	await db.transaction(async (tx) => {		const newDestination = await tx			.update(notifications)			.set({				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				organizationId: input.organizationId,				serverThreshold: input.serverThreshold,			})			.where(eq(notifications.notificationId, input.notificationId))			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error Updating notification",			});		} 		await tx			.update(email)			.set({				smtpServer: input.smtpServer,				smtpPort: input.smtpPort,				username: input.username,				password: input.password,				fromAddress: input.fromAddress,				toAddresses: input.toAddresses,			})			.where(eq(email.emailId, input.emailId))			.returning()			.then((value) => value[0]); 		return newDestination;	});}; export const createResendNotification = async (	input: z.infer<typeof apiCreateResend>,	organizationId: string,) => {	await db.transaction(async (tx) => {		const newResend = await tx			.insert(resend)			.values({				apiKey: input.apiKey,				fromAddress: input.fromAddress,				toAddresses: input.toAddresses,			})			.returning()			.then((value) => value[0]); 		if (!newResend) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting resend",			});		} 		const newDestination = await tx			.insert(notifications)			.values({				resendId: newResend.resendId,				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				notificationType: "resend",				organizationId: organizationId,				serverThreshold: input.serverThreshold,			})			.returning()			.then((value) => value[0]); 		if (!newDestination) {			throw new TRPCError({				code: "BAD_REQUEST",				message: "Error input: Inserting notification",			});		} 		return newDestination;	});}; export const updateResendNotification = async (	input: z.infer<typeof apiUpdateResend>,) => {	await db.transaction(async (tx) => {		const newDestination = await tx			.update(notifications)			.set({				name: input.name,				appDeploy: input.appDeploy,				appBuildError: input.appBuildError,				databaseBackup: input.databaseBackup,				dokployBackup: input.dokployBackup,				volumeBackup: input.volumeBackup,				dokployRestart: input.dokployRestart,				dockerCleanup: input.dockerCleanup,				organizationId: input.organizationId,

Lines 1–500 of 1236.