Files
Nas-Notification/server/api/notifications/audience-preview.post.js

149 lines
3.9 KiB
JavaScript

import prisma from "~/server/utils/prisma";
export default defineEventHandler(async (event) => {
try {
const body = await readBody(event);
// Simple validation
const audienceType = body.audienceType || 'all';
const specificUsers = body.specificUsers || '';
const userSegments = Array.isArray(body.userSegments) ? body.userSegments : [];
const excludeUnsubscribed = body.excludeUnsubscribed !== false;
let totalCount = 0;
let users = [];
// Calculate total count based on audience type
if (audienceType === 'all') {
totalCount = await prisma.user.count({
where: {
userStatus: 'active'
}
});
// Get sample users for preview
users = await prisma.user.findMany({
where: {
userStatus: 'active'
},
select: {
userID: true,
userEmail: true,
userFullName: true
},
take: 10,
orderBy: {
userCreatedDate: 'desc'
}
});
}
else if (audienceType === 'specific' && specificUsers) {
const usersList = specificUsers
.split('\n')
.map(u => u.trim())
.filter(Boolean);
if (usersList.length > 0) {
users = await prisma.user.findMany({
where: {
OR: [
{ userEmail: { in: usersList } },
{ userID: { in: usersList.map(id => parseInt(id)).filter(id => !isNaN(id)) } }
]
},
select: {
userID: true,
userEmail: true,
userFullName: true
}
});
totalCount = users.length;
}
}
else if (audienceType === 'segmented') {
// For segmented audience, we'll use a simplified approach
// In a real implementation, we'd fetch users based on the segments
if (userSegments.includes('new_users')) {
// New users calculation - simplified example
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
totalCount = await prisma.user.count({
where: {
userStatus: 'active',
userCreatedDate: {
gte: thirtyDaysAgo
}
}
});
users = await prisma.user.findMany({
where: {
userStatus: 'active',
userCreatedDate: {
gte: thirtyDaysAgo
}
},
select: {
userID: true,
userEmail: true,
userFullName: true
},
take: 10,
orderBy: {
userCreatedDate: 'desc'
}
});
} else {
// Default segment behavior
totalCount = await prisma.user.count({
where: {
userStatus: 'active'
}
});
users = await prisma.user.findMany({
where: {
userStatus: 'active'
},
select: {
userID: true,
userEmail: true,
userFullName: true
},
take: 10,
orderBy: {
userCreatedDate: 'desc'
}
});
}
}
// Format users for response
const formattedUsers = users.map(user => ({
id: user.userID,
name: user.userFullName?.trim() || 'Unknown',
email: user.userEmail,
segment: audienceType === 'specific' ? 'Specific User' :
audienceType === 'segmented' ? 'Segmented User' : 'All Users'
}));
return {
success: true,
data: {
users: formattedUsers,
totalCount,
previewCount: formattedUsers.length
}
};
} catch (error) {
console.error('Error previewing audience:', error);
throw createError({
statusCode: 500,
statusMessage: 'Failed to preview audience',
data: {
error: error.message
}
});
}
});