Files
dockhand/routes/api/notifications/trigger-test/+server.ts
Jarek Krochmalski 62e3c6439e Initial commit
2025-12-28 21:16:03 +01:00

131 lines
3.2 KiB
TypeScript

import { json, type RequestHandler } from '@sveltejs/kit';
import { sendEventNotification, sendEnvironmentNotification } from '$lib/server/notifications';
import { NOTIFICATION_EVENT_TYPES, type NotificationEventType } from '$lib/server/db';
/**
* Test endpoint to trigger notifications for any event type.
* This is intended for development/testing purposes only.
*
* POST /api/notifications/trigger-test
* Body: {
* eventType: string,
* environmentId?: number,
* payload: { title: string, message: string, type?: string }
* }
*/
export const POST: RequestHandler = async ({ request }) => {
try {
const body = await request.json();
const { eventType, environmentId, payload } = body;
if (!eventType) {
return json({ error: 'eventType is required' }, { status: 400 });
}
if (!payload || !payload.title || !payload.message) {
return json({ error: 'payload with title and message is required' }, { status: 400 });
}
// Validate event type - NOTIFICATION_EVENT_TYPES is array of {id, label, ...}
const validEventIds = NOTIFICATION_EVENT_TYPES.map(e => e.id);
if (!validEventIds.includes(eventType)) {
return json({
error: `Invalid event type: ${eventType}`,
validTypes: validEventIds
}, { status: 400 });
}
// Determine if this is a system event or environment event
const isSystemEvent = eventType === 'license_expiring';
let result;
if (isSystemEvent) {
// System events don't have an environment
result = await sendEventNotification(
eventType as NotificationEventType,
{
title: payload.title,
message: payload.message,
type: payload.type || 'info'
}
);
} else if (environmentId) {
// Environment-scoped events
result = await sendEventNotification(
eventType as NotificationEventType,
{
title: payload.title,
message: payload.message,
type: payload.type || 'info'
},
environmentId
);
} else {
return json({
error: 'environmentId is required for non-system events'
}, { status: 400 });
}
return json({
success: result.success,
sent: result.sent,
eventType,
environmentId: isSystemEvent ? null : environmentId
});
} catch (error) {
console.error('[Notification Test] Error:', error);
return json({
error: error instanceof Error ? error.message : 'Unknown error'
}, { status: 500 });
}
};
/**
* GET endpoint to list all available event types
*/
export const GET: RequestHandler = async () => {
return json({
eventTypes: NOTIFICATION_EVENT_TYPES,
categories: {
container: [
'container_started',
'container_stopped',
'container_restarted',
'container_exited',
'container_unhealthy',
'container_oom',
'container_updated',
'image_pulled',
],
autoUpdate: [
'auto_update_success',
'auto_update_failed',
'auto_update_blocked',
],
gitStack: [
'git_sync_success',
'git_sync_failed',
'git_sync_skipped',
],
stack: [
'stack_started',
'stack_stopped',
'stack_deployed',
'stack_deploy_failed',
],
security: [
'vulnerability_critical',
'vulnerability_high',
'vulnerability_any',
],
system: [
'environment_offline',
'environment_online',
'disk_space_warning',
'license_expiring',
],
}
});
};