100 lines
2.4 KiB
JavaScript
100 lines
2.4 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 query parameters
|
|
const query = getQuery(event);
|
|
const limit = parseInt(query.limit) || 10;
|
|
const page = parseInt(query.page) || 1;
|
|
const status = query.status;
|
|
|
|
// Build where clause
|
|
const where = {};
|
|
if (status) {
|
|
where.status = status;
|
|
}
|
|
|
|
// Get jobs with related data
|
|
const jobs = await prisma.notification_queue.findMany({
|
|
where,
|
|
select: {
|
|
id: true,
|
|
status: true,
|
|
scheduled_for: true,
|
|
last_attempt_at: true,
|
|
error_message: true,
|
|
notifications: {
|
|
select: {
|
|
type: true,
|
|
title: true,
|
|
}
|
|
},
|
|
notification_recipients: {
|
|
select: {
|
|
channel_type: true,
|
|
}
|
|
}
|
|
},
|
|
orderBy: {
|
|
scheduled_for: 'desc'
|
|
},
|
|
skip: (page - 1) * limit,
|
|
take: limit
|
|
});
|
|
|
|
// Format jobs for frontend
|
|
const formattedJobs = jobs.map(job => {
|
|
const timeDiff = new Date() - new Date(job.last_attempt_at || job.scheduled_for);
|
|
const minutes = Math.floor(timeDiff / 60000);
|
|
|
|
return {
|
|
id: job.id,
|
|
type: job.notifications.type,
|
|
description: job.notifications.title,
|
|
status: job.status,
|
|
time: minutes <= 0 ? 'Just now' :
|
|
minutes === 1 ? '1 minute ago' :
|
|
minutes < 60 ? `${minutes} minutes ago` :
|
|
`${Math.floor(minutes / 60)} hours ago`
|
|
};
|
|
});
|
|
|
|
// Get total count for pagination
|
|
const total = await prisma.notification_queue.count({ where });
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
jobs: formattedJobs,
|
|
pagination: {
|
|
page,
|
|
totalPages: Math.ceil(total / limit),
|
|
totalItems: total,
|
|
hasMore: page * limit < total
|
|
}
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching queue jobs:', error);
|
|
|
|
if (error.statusCode) {
|
|
throw error;
|
|
}
|
|
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: 'Failed to fetch queue jobs'
|
|
});
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
});
|