[autofix.ci] apply automated fixes

This commit is contained in:
autofix-ci[bot]
2025-12-07 19:32:00 +00:00
committed by GitHub
parent 18d12d1a6f
commit 212006ba9e
2 changed files with 547 additions and 547 deletions
@@ -6,365 +6,365 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns"; import { format } from "date-fns";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { import {
sendCustomNotification, sendCustomNotification,
sendDiscordNotification, sendDiscordNotification,
sendEmailNotification, sendEmailNotification,
sendGotifyNotification, sendGotifyNotification,
sendLarkNotification, sendLarkNotification,
sendNtfyNotification, sendNtfyNotification,
sendSlackNotification, sendSlackNotification,
sendTelegramNotification, sendTelegramNotification,
} from "./utils"; } from "./utils";
interface Props { interface Props {
projectName: string; projectName: string;
applicationName: string; applicationName: string;
applicationType: string; applicationType: string;
buildLink: string; buildLink: string;
organizationId: string; organizationId: string;
domains: Domain[]; domains: Domain[];
environmentName: string; environmentName: string;
} }
export const sendBuildSuccessNotifications = async ({ export const sendBuildSuccessNotifications = async ({
projectName, projectName,
applicationName, applicationName,
applicationType, applicationType,
buildLink, buildLink,
organizationId, organizationId,
domains, domains,
environmentName, environmentName,
}: Props) => { }: Props) => {
const date = new Date(); const date = new Date();
const unixDate = ~~(Number(date) / 1000); const unixDate = ~~(Number(date) / 1000);
const notificationList = await db.query.notifications.findMany({ const notificationList = await db.query.notifications.findMany({
where: and( where: and(
eq(notifications.appDeploy, true), eq(notifications.appDeploy, true),
eq(notifications.organizationId, organizationId) eq(notifications.organizationId, organizationId),
), ),
with: { with: {
email: true, email: true,
discord: true, discord: true,
telegram: true, telegram: true,
slack: true, slack: true,
gotify: true, gotify: true,
ntfy: true, ntfy: true,
custom: true, custom: true,
lark: true, lark: true,
}, },
}); });
for (const notification of notificationList) { for (const notification of notificationList) {
const { email, discord, telegram, slack, gotify, ntfy, custom, lark } = const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification; notification;
try { try {
if (email) { if (email) {
const template = await renderAsync( const template = await renderAsync(
BuildSuccessEmail({ BuildSuccessEmail({
projectName, projectName,
applicationName, applicationName,
applicationType, applicationType,
buildLink, buildLink,
date: date.toLocaleString(), date: date.toLocaleString(),
environmentName, environmentName,
}) }),
).catch(); ).catch();
await sendEmailNotification( await sendEmailNotification(
email, email,
"Build success for dokploy", "Build success for dokploy",
template template,
); );
} }
if (discord) { if (discord) {
const decorate = (decoration: string, text: string) => const decorate = (decoration: string, text: string) =>
`${discord.decoration ? decoration : ""} ${text}`.trim(); `${discord.decoration ? decoration : ""} ${text}`.trim();
await sendDiscordNotification(discord, { await sendDiscordNotification(discord, {
title: decorate(">", "`✅` Build Successes"), title: decorate(">", "`✅` Build Successes"),
color: 0x57f287, color: 0x57f287,
fields: [ fields: [
{ {
name: decorate("`🛠️`", "Project"), name: decorate("`🛠️`", "Project"),
value: projectName, value: projectName,
inline: true, inline: true,
}, },
{ {
name: decorate("`⚙️`", "Application"), name: decorate("`⚙️`", "Application"),
value: applicationName, value: applicationName,
inline: true, inline: true,
}, },
{ {
name: decorate("`🌍`", "Environment"), name: decorate("`🌍`", "Environment"),
value: environmentName, value: environmentName,
inline: true, inline: true,
}, },
{ {
name: decorate("`❔`", "Type"), name: decorate("`❔`", "Type"),
value: applicationType, value: applicationType,
inline: true, inline: true,
}, },
{ {
name: decorate("`📅`", "Date"), name: decorate("`📅`", "Date"),
value: `<t:${unixDate}:D>`, value: `<t:${unixDate}:D>`,
inline: true, inline: true,
}, },
{ {
name: decorate("`⌚`", "Time"), name: decorate("`⌚`", "Time"),
value: `<t:${unixDate}:t>`, value: `<t:${unixDate}:t>`,
inline: true, inline: true,
}, },
{ {
name: decorate("`❓`", "Type"), name: decorate("`❓`", "Type"),
value: "Successful", value: "Successful",
inline: true, inline: true,
}, },
{ {
name: decorate("`🧷`", "Build Link"), name: decorate("`🧷`", "Build Link"),
value: `[Click here to access build link](${buildLink})`, value: `[Click here to access build link](${buildLink})`,
}, },
], ],
timestamp: date.toISOString(), timestamp: date.toISOString(),
footer: { footer: {
text: "Dokploy Build Notification", text: "Dokploy Build Notification",
}, },
}); });
} }
if (gotify) { if (gotify) {
const decorate = (decoration: string, text: string) => const decorate = (decoration: string, text: string) =>
`${gotify.decoration ? decoration : ""} ${text}\n`; `${gotify.decoration ? decoration : ""} ${text}\n`;
await sendGotifyNotification( await sendGotifyNotification(
gotify, gotify,
decorate("✅", "Build Success"), decorate("✅", "Build Success"),
`${decorate("🛠️", `Project: ${projectName}`)}` + `${decorate("🛠️", `Project: ${projectName}`)}` +
`${decorate("⚙️", `Application: ${applicationName}`)}` + `${decorate("⚙️", `Application: ${applicationName}`)}` +
`${decorate("🌍", `Environment: ${environmentName}`)}` + `${decorate("🌍", `Environment: ${environmentName}`)}` +
`${decorate("❔", `Type: ${applicationType}`)}` + `${decorate("❔", `Type: ${applicationType}`)}` +
`${decorate("🕒", `Date: ${date.toLocaleString()}`)}` + `${decorate("🕒", `Date: ${date.toLocaleString()}`)}` +
`${decorate("🔗", `Build details:\n${buildLink}`)}` `${decorate("🔗", `Build details:\n${buildLink}`)}`,
); );
} }
if (ntfy) { if (ntfy) {
await sendNtfyNotification( await sendNtfyNotification(
ntfy, ntfy,
"Build Success", "Build Success",
"white_check_mark", "white_check_mark",
`view, Build details, ${buildLink}, clear=true;`, `view, Build details, ${buildLink}, clear=true;`,
`🛠Project: ${projectName}\n` + `🛠Project: ${projectName}\n` +
`⚙️Application: ${applicationName}\n` + `⚙️Application: ${applicationName}\n` +
`🌍Environment: ${environmentName}\n` + `🌍Environment: ${environmentName}\n` +
`❔Type: ${applicationType}\n` + `❔Type: ${applicationType}\n` +
`🕒Date: ${date.toLocaleString()}` `🕒Date: ${date.toLocaleString()}`,
); );
} }
if (telegram) { if (telegram) {
const chunkArray = <T>(array: T[], chunkSize: number): T[][] => const chunkArray = <T>(array: T[], chunkSize: number): T[][] =>
Array.from({ length: Math.ceil(array.length / chunkSize) }, (_, i) => Array.from({ length: Math.ceil(array.length / chunkSize) }, (_, i) =>
array.slice(i * chunkSize, i * chunkSize + chunkSize) array.slice(i * chunkSize, i * chunkSize + chunkSize),
); );
const inlineButton = [ const inlineButton = [
[ [
{ {
text: "Deployment Logs", text: "Deployment Logs",
url: buildLink, url: buildLink,
}, },
], ],
...chunkArray(domains, 2).map((chunk) => ...chunkArray(domains, 2).map((chunk) =>
chunk.map((data) => ({ chunk.map((data) => ({
text: data.host, text: data.host,
url: `${data.https ? "https" : "http"}://${data.host}`, url: `${data.https ? "https" : "http"}://${data.host}`,
})) })),
), ),
]; ];
await sendTelegramNotification( await sendTelegramNotification(
telegram, telegram,
`<b>✅ Build Success</b>\n\n<b>Project:</b> ${projectName}\n<b>Application:</b> ${applicationName}\n<b>Environment:</b> ${environmentName}\n<b>Type:</b> ${applicationType}\n<b>Date:</b> ${format( `<b>✅ Build Success</b>\n\n<b>Project:</b> ${projectName}\n<b>Application:</b> ${applicationName}\n<b>Environment:</b> ${environmentName}\n<b>Type:</b> ${applicationType}\n<b>Date:</b> ${format(
date, date,
"PP" "PP",
)}\n<b>Time:</b> ${format(date, "pp")}`, )}\n<b>Time:</b> ${format(date, "pp")}`,
inlineButton inlineButton,
); );
} }
if (slack) { if (slack) {
const { channel } = slack; const { channel } = slack;
await sendSlackNotification(slack, { await sendSlackNotification(slack, {
channel: channel, channel: channel,
attachments: [ attachments: [
{ {
color: "#00FF00", color: "#00FF00",
pretext: ":white_check_mark: *Build Success*", pretext: ":white_check_mark: *Build Success*",
fields: [ fields: [
{ {
title: "Project", title: "Project",
value: projectName, value: projectName,
short: true, short: true,
}, },
{ {
title: "Application", title: "Application",
value: applicationName, value: applicationName,
short: true, short: true,
}, },
{ {
title: "Environment", title: "Environment",
value: environmentName, value: environmentName,
short: true, short: true,
}, },
{ {
title: "Type", title: "Type",
value: applicationType, value: applicationType,
short: true, short: true,
}, },
{ {
title: "Time", title: "Time",
value: date.toLocaleString(), value: date.toLocaleString(),
short: true, short: true,
}, },
], ],
actions: [ actions: [
{ {
type: "button", type: "button",
text: "View Build Details", text: "View Build Details",
url: buildLink, url: buildLink,
}, },
], ],
}, },
], ],
}); });
} }
if (custom) { if (custom) {
await sendCustomNotification(custom, { await sendCustomNotification(custom, {
title: "Build Success", title: "Build Success",
message: "Build completed successfully", message: "Build completed successfully",
projectName, projectName,
applicationName, applicationName,
applicationType, applicationType,
buildLink, buildLink,
timestamp: date.toISOString(), timestamp: date.toISOString(),
date: date.toLocaleString(), date: date.toLocaleString(),
domains: domains.map((domain) => domain.host).join(", "), domains: domains.map((domain) => domain.host).join(", "),
status: "success", status: "success",
type: "build", type: "build",
}); });
} }
if (lark) { if (lark) {
await sendLarkNotification(lark, { await sendLarkNotification(lark, {
msg_type: "interactive", msg_type: "interactive",
card: { card: {
schema: "2.0", schema: "2.0",
config: { config: {
update_multi: true, update_multi: true,
style: { style: {
text_size: { text_size: {
normal_v2: { normal_v2: {
default: "normal", default: "normal",
pc: "normal", pc: "normal",
mobile: "heading", mobile: "heading",
}, },
}, },
}, },
}, },
header: { header: {
title: { title: {
tag: "plain_text", tag: "plain_text",
content: "✅ Build Success", content: "✅ Build Success",
}, },
subtitle: { subtitle: {
tag: "plain_text", tag: "plain_text",
content: "", content: "",
}, },
template: "green", template: "green",
padding: "12px 12px 12px 12px", padding: "12px 12px 12px 12px",
}, },
body: { body: {
direction: "vertical", direction: "vertical",
padding: "12px 12px 12px 12px", padding: "12px 12px 12px 12px",
elements: [ elements: [
{ {
tag: "column_set", tag: "column_set",
columns: [ columns: [
{ {
tag: "column", tag: "column",
width: "weighted", width: "weighted",
elements: [ elements: [
{ {
tag: "markdown", tag: "markdown",
content: `**Project:**\n${projectName}`, content: `**Project:**\n${projectName}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
{ {
tag: "markdown", tag: "markdown",
content: `**Environment:**\n${environmentName}`, content: `**Environment:**\n${environmentName}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
{ {
tag: "markdown", tag: "markdown",
content: `**Type:**\n${applicationType}`, content: `**Type:**\n${applicationType}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
], ],
vertical_align: "top", vertical_align: "top",
weight: 1, weight: 1,
}, },
{ {
tag: "column", tag: "column",
width: "weighted", width: "weighted",
elements: [ elements: [
{ {
tag: "markdown", tag: "markdown",
content: `**Application:**\n${applicationName}`, content: `**Application:**\n${applicationName}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
{ {
tag: "markdown", tag: "markdown",
content: `**Date:**\n${format(date, "PP pp")}`, content: `**Date:**\n${format(date, "PP pp")}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
], ],
vertical_align: "top", vertical_align: "top",
weight: 1, weight: 1,
}, },
], ],
}, },
{ {
tag: "button", tag: "button",
text: { text: {
tag: "plain_text", tag: "plain_text",
content: "View Build Details", content: "View Build Details",
}, },
type: "primary", type: "primary",
width: "default", width: "default",
size: "medium", size: "medium",
behaviors: [ behaviors: [
{ {
type: "open_url", type: "open_url",
default_url: buildLink, default_url: buildLink,
pc_url: "", pc_url: "",
ios_url: "", ios_url: "",
android_url: "", android_url: "",
}, },
], ],
margin: "0px 0px 0px 0px", margin: "0px 0px 0px 0px",
}, },
], ],
}, },
}, },
}); });
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
}; };
@@ -5,222 +5,222 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns"; import { format } from "date-fns";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { import {
sendCustomNotification, sendCustomNotification,
sendDiscordNotification, sendDiscordNotification,
sendEmailNotification, sendEmailNotification,
sendGotifyNotification, sendGotifyNotification,
sendLarkNotification, sendLarkNotification,
sendNtfyNotification, sendNtfyNotification,
sendSlackNotification, sendSlackNotification,
sendTelegramNotification, sendTelegramNotification,
} from "./utils"; } from "./utils";
export const sendDokployRestartNotifications = async () => { export const sendDokployRestartNotifications = async () => {
const date = new Date(); const date = new Date();
const unixDate = ~~(Number(date) / 1000); const unixDate = ~~(Number(date) / 1000);
const notificationList = await db.query.notifications.findMany({ const notificationList = await db.query.notifications.findMany({
where: eq(notifications.dokployRestart, true), where: eq(notifications.dokployRestart, true),
with: { with: {
email: true, email: true,
discord: true, discord: true,
telegram: true, telegram: true,
slack: true, slack: true,
gotify: true, gotify: true,
ntfy: true, ntfy: true,
custom: true, custom: true,
lark: true, lark: true,
}, },
}); });
for (const notification of notificationList) { for (const notification of notificationList) {
const { email, discord, telegram, slack, gotify, ntfy, custom, lark } = const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification; notification;
try { try {
if (email) { if (email) {
const template = await renderAsync( const template = await renderAsync(
DokployRestartEmail({ date: date.toLocaleString() }) DokployRestartEmail({ date: date.toLocaleString() }),
).catch(); ).catch();
await sendEmailNotification( await sendEmailNotification(
email, email,
"Dokploy Server Restarted", "Dokploy Server Restarted",
template template,
); );
} }
if (discord) { if (discord) {
const decorate = (decoration: string, text: string) => const decorate = (decoration: string, text: string) =>
`${discord.decoration ? decoration : ""} ${text}`.trim(); `${discord.decoration ? decoration : ""} ${text}`.trim();
await sendDiscordNotification(discord, { await sendDiscordNotification(discord, {
title: decorate(">", "`✅` Dokploy Server Restarted"), title: decorate(">", "`✅` Dokploy Server Restarted"),
color: 0x57f287, color: 0x57f287,
fields: [ fields: [
{ {
name: decorate("`📅`", "Date"), name: decorate("`📅`", "Date"),
value: `<t:${unixDate}:D>`, value: `<t:${unixDate}:D>`,
inline: true, inline: true,
}, },
{ {
name: decorate("`⌚`", "Time"), name: decorate("`⌚`", "Time"),
value: `<t:${unixDate}:t>`, value: `<t:${unixDate}:t>`,
inline: true, inline: true,
}, },
{ {
name: decorate("`❓`", "Type"), name: decorate("`❓`", "Type"),
value: "Successful", value: "Successful",
inline: true, inline: true,
}, },
], ],
timestamp: date.toISOString(), timestamp: date.toISOString(),
footer: { footer: {
text: "Dokploy Restart Notification", text: "Dokploy Restart Notification",
}, },
}); });
} }
if (gotify) { if (gotify) {
const decorate = (decoration: string, text: string) => const decorate = (decoration: string, text: string) =>
`${gotify.decoration ? decoration : ""} ${text}\n`; `${gotify.decoration ? decoration : ""} ${text}\n`;
await sendGotifyNotification( await sendGotifyNotification(
gotify, gotify,
decorate("✅", "Dokploy Server Restarted"), decorate("✅", "Dokploy Server Restarted"),
`${decorate("🕒", `Date: ${date.toLocaleString()}`)}` `${decorate("🕒", `Date: ${date.toLocaleString()}`)}`,
); );
} }
if (ntfy) { if (ntfy) {
await sendNtfyNotification( await sendNtfyNotification(
ntfy, ntfy,
"Dokploy Server Restarted", "Dokploy Server Restarted",
"white_check_mark", "white_check_mark",
"", "",
`🕒Date: ${date.toLocaleString()}` `🕒Date: ${date.toLocaleString()}`,
); );
} }
if (telegram) { if (telegram) {
await sendTelegramNotification( await sendTelegramNotification(
telegram, telegram,
`<b>✅ Dokploy Server Restarted</b>\n\n<b>Date:</b> ${format( `<b>✅ Dokploy Server Restarted</b>\n\n<b>Date:</b> ${format(
date, date,
"PP" "PP",
)}\n<b>Time:</b> ${format(date, "pp")}` )}\n<b>Time:</b> ${format(date, "pp")}`,
); );
} }
if (slack) { if (slack) {
const { channel } = slack; const { channel } = slack;
await sendSlackNotification(slack, { await sendSlackNotification(slack, {
channel: channel, channel: channel,
attachments: [ attachments: [
{ {
color: "#00FF00", color: "#00FF00",
pretext: ":white_check_mark: *Dokploy Server Restarted*", pretext: ":white_check_mark: *Dokploy Server Restarted*",
fields: [ fields: [
{ {
title: "Time", title: "Time",
value: date.toLocaleString(), value: date.toLocaleString(),
short: true, short: true,
}, },
], ],
}, },
], ],
}); });
} }
if (custom) { if (custom) {
try { try {
await sendCustomNotification(custom, { await sendCustomNotification(custom, {
title: "Dokploy Server Restarted", title: "Dokploy Server Restarted",
message: "Dokploy server has been restarted successfully", message: "Dokploy server has been restarted successfully",
timestamp: date.toISOString(), timestamp: date.toISOString(),
date: date.toLocaleString(), date: date.toLocaleString(),
status: "success", status: "success",
type: "dokploy-restart", type: "dokploy-restart",
}); });
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
if (lark) { if (lark) {
await sendLarkNotification(lark, { await sendLarkNotification(lark, {
msg_type: "interactive", msg_type: "interactive",
card: { card: {
schema: "2.0", schema: "2.0",
config: { config: {
update_multi: true, update_multi: true,
style: { style: {
text_size: { text_size: {
normal_v2: { normal_v2: {
default: "normal", default: "normal",
pc: "normal", pc: "normal",
mobile: "heading", mobile: "heading",
}, },
}, },
}, },
}, },
header: { header: {
title: { title: {
tag: "plain_text", tag: "plain_text",
content: "✅ Dokploy Server Restarted", content: "✅ Dokploy Server Restarted",
}, },
subtitle: { subtitle: {
tag: "plain_text", tag: "plain_text",
content: "", content: "",
}, },
template: "green", template: "green",
padding: "12px 12px 12px 12px", padding: "12px 12px 12px 12px",
}, },
body: { body: {
direction: "vertical", direction: "vertical",
padding: "12px 12px 12px 12px", padding: "12px 12px 12px 12px",
elements: [ elements: [
{ {
tag: "column_set", tag: "column_set",
columns: [ columns: [
{ {
tag: "column", tag: "column",
width: "weighted", width: "weighted",
elements: [ elements: [
{ {
tag: "markdown", tag: "markdown",
content: "**Status:**\nSuccessful", content: "**Status:**\nSuccessful",
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
], ],
vertical_align: "top", vertical_align: "top",
weight: 1, weight: 1,
}, },
{ {
tag: "column", tag: "column",
width: "weighted", width: "weighted",
elements: [ elements: [
{ {
tag: "markdown", tag: "markdown",
content: `**Restart Time:**\n${format( content: `**Restart Time:**\n${format(
date, date,
"PP pp" "PP pp",
)}`, )}`,
text_align: "left", text_align: "left",
text_size: "normal_v2", text_size: "normal_v2",
}, },
], ],
vertical_align: "top", vertical_align: "top",
weight: 1, weight: 1,
}, },
], ],
}, },
], ],
}, },
}, },
}); });
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
}; };