150 lines
4.5 KiB
JavaScript
150 lines
4.5 KiB
JavaScript
import prisma from "~/server/utils/prisma";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const id = event.context.params.id;
|
|
const body = await readBody(event);
|
|
|
|
// Validate if notification exists
|
|
const existingNotification = await prisma.notifications.findUnique({
|
|
where: { id },
|
|
include: {
|
|
notification_channels: true,
|
|
notification_user_segments: true
|
|
}
|
|
});
|
|
|
|
if (!existingNotification) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: 'Notification not found'
|
|
});
|
|
}
|
|
|
|
// Prepare update data
|
|
const updateData = {
|
|
title: body.title,
|
|
type: body.type,
|
|
priority: body.priority,
|
|
category_id: body.category_id,
|
|
status: body.status,
|
|
delivery_type: body.delivery_type,
|
|
scheduled_at: body.scheduled_at ? new Date(body.scheduled_at) : undefined,
|
|
timezone: body.timezone,
|
|
expires_at: body.expires_at ? new Date(body.expires_at) : undefined,
|
|
enable_ab_testing: body.enable_ab_testing,
|
|
ab_test_split: body.ab_test_split,
|
|
ab_test_name: body.ab_test_name,
|
|
enable_tracking: body.enable_tracking,
|
|
audience_type: body.audience_type,
|
|
specific_users: body.specific_users,
|
|
user_status: body.user_status,
|
|
registration_period: body.registration_period,
|
|
exclude_unsubscribed: body.exclude_unsubscribed,
|
|
respect_do_not_disturb: body.respect_do_not_disturb,
|
|
content_type: body.content_type,
|
|
template_id: body.template_id,
|
|
email_subject: body.email_subject,
|
|
email_content: body.email_content,
|
|
call_to_action_text: body.call_to_action_text,
|
|
call_to_action_url: body.call_to_action_url,
|
|
push_title: body.push_title,
|
|
push_body: body.push_body,
|
|
push_image_url: body.push_image_url,
|
|
estimated_reach: body.estimated_reach,
|
|
updated_at: new Date()
|
|
};
|
|
|
|
// Remove undefined values
|
|
Object.keys(updateData).forEach(key =>
|
|
updateData[key] === undefined && delete updateData[key]
|
|
);
|
|
|
|
// Start transaction
|
|
const updatedNotification = await prisma.$transaction(async (tx) => {
|
|
// Update notification
|
|
const notification = await tx.notifications.update({
|
|
where: { id },
|
|
data: updateData,
|
|
include: {
|
|
notification_channels: true,
|
|
notification_categories: true,
|
|
notification_templates: true,
|
|
notification_user_segments: {
|
|
include: {
|
|
user_segments: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Update channels if provided
|
|
if (Array.isArray(body.channels)) {
|
|
// Validate channel data structure
|
|
const invalidChannels = body.channels.filter(channel => !channel.type);
|
|
if (invalidChannels.length > 0) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'Invalid channel data',
|
|
data: {
|
|
error: 'Each channel must have a type property',
|
|
invalidChannels,
|
|
receivedChannels: body.channels
|
|
}
|
|
});
|
|
}
|
|
|
|
// Delete existing channels
|
|
await tx.notification_channels.deleteMany({
|
|
where: { notification_id: id }
|
|
});
|
|
|
|
// Create new channels
|
|
if (body.channels.length > 0) {
|
|
await tx.notification_channels.createMany({
|
|
data: body.channels.map(channel => ({
|
|
notification_id: id,
|
|
channel_type: channel.type,
|
|
is_enabled: channel.is_enabled !== false
|
|
}))
|
|
});
|
|
}
|
|
}
|
|
|
|
// Update user segments if provided
|
|
if (Array.isArray(body.user_segments)) {
|
|
// Delete existing segments
|
|
await tx.notification_user_segments.deleteMany({
|
|
where: { notification_id: id }
|
|
});
|
|
|
|
// Create new segments
|
|
if (body.user_segments.length > 0) {
|
|
await tx.notification_user_segments.createMany({
|
|
data: body.user_segments.map(segmentId => ({
|
|
notification_id: id,
|
|
segment_id: segmentId
|
|
}))
|
|
});
|
|
}
|
|
}
|
|
|
|
return notification;
|
|
});
|
|
|
|
return {
|
|
success: true,
|
|
data: updatedNotification
|
|
};
|
|
|
|
} catch (error) {
|
|
console.error('Error updating notification:', error);
|
|
throw createError({
|
|
statusCode: error.statusCode || 500,
|
|
statusMessage: error.statusMessage || 'Failed to update notification',
|
|
data: {
|
|
error: error.message
|
|
}
|
|
});
|
|
}
|
|
});
|