Update various configuration files, components, and assets; enhance notification system and API endpoints; improve documentation and styles across the application.
This commit is contained in:
149
server/api/notifications/audience-preview.post.js
Normal file
149
server/api/notifications/audience-preview.post.js
Normal file
@@ -0,0 +1,149 @@
|
||||
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
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user