fix(notifications): update Mattermost notification handling

- Changed webhookUrl validation to ensure it is a valid URL.
- Updated input types for createMattermostNotification and updateMattermostNotification functions to use z.infer for better type inference.
- Refactored sendMattermostNotification to improve error handling and payload construction.
This commit is contained in:
Mauricio Siu
2026-03-24 12:39:38 -06:00
parent 58b9a0d3d0
commit d6056972f4
3 changed files with 22 additions and 22 deletions
@@ -494,7 +494,7 @@ export const apiCreateMattermost = notificationsSchema
serverThreshold: true,
})
.extend({
webhookUrl: z.string().min(1),
webhookUrl: z.string().url(),
channel: z.string().optional(),
username: z.string().optional(),
})
+2 -2
View File
@@ -1020,7 +1020,7 @@ export const updateNotificationById = async (
};
export const createMattermostNotification = async (
input: typeof apiCreateMattermost._type,
input: z.infer<typeof apiCreateMattermost>,
organizationId: string,
) => {
await db.transaction(async (tx) => {
@@ -1070,7 +1070,7 @@ export const createMattermostNotification = async (
};
export const updateMattermostNotification = async (
input: typeof apiUpdateMattermost._type,
input: z.infer<typeof apiUpdateMattermost>,
) => {
await db.transaction(async (tx) => {
const newDestination = await tx
@@ -211,26 +211,26 @@ export const sendMattermostNotification = async (
connection: typeof mattermost.$inferInsert,
message: any,
) => {
try {
const payload = {
...message,
// Only include username if it's provided and not empty
...(message.username &&
message.username.trim() && { username: message.username }),
// Only include channel if it's provided and not empty
...(message.channel &&
message.channel.trim() && {
channel: `#${message.channel.replace("#", "")}`,
}),
};
const payload = {
...message,
// Only include username if it's provided and not empty
...(message.username?.trim() && { username: message.username }),
// Only include channel if it's provided and not empty
...(message.channel?.trim() && {
channel: `#${message.channel.replace("#", "")}`,
}),
};
await fetch(connection.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
} catch (err) {
console.log(err);
const response = await fetch(connection.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
if (!response.ok) {
throw new Error(
`Failed to send Mattermost notification: ${response.statusText}`,
);
}
};