85 lines
2.2 KiB
JavaScript
85 lines
2.2 KiB
JavaScript
import { prisma } from "~/server/utils/prisma";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
// Get current user from auth middleware
|
|
const user = event.context.user;
|
|
if (!user) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
statusMessage: "Authentication required",
|
|
});
|
|
}
|
|
|
|
// Get delivery statistics from the last 30 days
|
|
const thirtyDaysAgo = new Date();
|
|
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
|
|
|
|
// Get email statistics
|
|
const emailStats = await prisma.notification_delivery.groupBy({
|
|
by: ['is_success'],
|
|
where: {
|
|
channel_type: 'email',
|
|
created_at: {
|
|
gte: thirtyDaysAgo
|
|
}
|
|
},
|
|
_count: {
|
|
id: true
|
|
}
|
|
});
|
|
|
|
// Get push notification statistics
|
|
const pushStats = await prisma.notification_delivery.groupBy({
|
|
by: ['is_success'],
|
|
where: {
|
|
channel_type: 'push',
|
|
created_at: {
|
|
gte: thirtyDaysAgo
|
|
}
|
|
},
|
|
_count: {
|
|
id: true
|
|
}
|
|
});
|
|
|
|
// Calculate totals
|
|
const emailCount = emailStats.reduce((sum, stat) => sum + stat._count.id, 0);
|
|
const pushCount = pushStats.reduce((sum, stat) => sum + stat._count.id, 0);
|
|
const emailSuccess = emailStats.find(stat => stat.is_success)?._count.id || 0;
|
|
const pushSuccess = pushStats.find(stat => stat.is_success)?._count.id || 0;
|
|
|
|
// Calculate success rate
|
|
const totalDeliveries = emailCount + pushCount;
|
|
const totalSuccessful = emailSuccess + pushSuccess;
|
|
const successRate = totalDeliveries > 0
|
|
? (totalSuccessful / totalDeliveries) * 100
|
|
: 100;
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
emailsSent: emailCount,
|
|
pushSent: pushCount,
|
|
successRate: Number(successRate.toFixed(2)),
|
|
failed: totalDeliveries - totalSuccessful
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching delivery stats:', {
|
|
message: error.message,
|
|
code: error.code,
|
|
meta: error.meta,
|
|
stack: error.stack
|
|
});
|
|
|
|
if (error.statusCode) {
|
|
throw error;
|
|
}
|
|
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: `Failed to fetch delivery statistics: ${error.message}`
|
|
});
|
|
}
|
|
});
|