wulf-pulse/app/api/webhooks/register/route.ts

93 lines
3.4 KiB
TypeScript

/**
* Webhook Registration API
* POST /api/webhooks/register — Register all webhooks with Autotask
* POST /api/webhooks/register?entity=Tickets — Register a single entity
*/
import { NextRequest, NextResponse } from 'next/server';
import { AutotaskWebhookManager } from '@/lib/services/autotask-webhook-manager';
import { WebhookEntityType, WEBHOOK_SUPPORTED_ENTITIES } from '@/lib/types/webhook';
export async function POST(request: NextRequest) {
try {
const manager = new AutotaskWebhookManager();
const { searchParams } = new URL(request.url);
const entityParam = searchParams.get('entity');
if (entityParam) {
// Register a single entity type
const entityType = entityParam as WebhookEntityType;
if (!WEBHOOK_SUPPORTED_ENTITIES.includes(entityType)) {
return NextResponse.json(
{ error: `Unsupported entity type: ${entityParam}. Supported: ${WEBHOOK_SUPPORTED_ENTITIES.join(', ')}` },
{ status: 400 }
);
}
const result = await manager.registerWebhook(entityType);
return NextResponse.json({ success: true, results: [result] });
}
// Register all supported entities
const results = await manager.registerAll();
const allSuccess = results.every(r => r.success);
return NextResponse.json({
success: allSuccess,
results,
summary: {
total: results.length,
succeeded: results.filter(r => r.success).length,
failed: results.filter(r => !r.success).length,
},
});
} catch (error) {
const msg = error instanceof Error ? error.message : String(error);
console.error('[WEBHOOK-REGISTER] Error:', msg);
return NextResponse.json({ error: msg }, { status: 500 });
}
}
/**
* DELETE /api/webhooks/register — Deregister all webhooks
* DELETE /api/webhooks/register?entity=Tickets — Deregister a single entity
*/
export async function DELETE(request: NextRequest) {
try {
const manager = new AutotaskWebhookManager();
const { searchParams } = new URL(request.url);
const entityParam = searchParams.get('entity');
if (entityParam) {
const entityType = entityParam as WebhookEntityType;
if (!WEBHOOK_SUPPORTED_ENTITIES.includes(entityType)) {
return NextResponse.json(
{ error: `Unsupported entity type: ${entityParam}` },
{ status: 400 }
);
}
// Find the webhook ID from DB
const { postgresClient } = await import('@/lib/services/postgres-client');
const result = await postgresClient.query<{ autotask_webhook_id: string }>(
`SELECT autotask_webhook_id FROM webhook_configs WHERE entity_type = $1 AND autotask_webhook_id IS NOT NULL`,
[entityType]
);
if (result.rows.length === 0 || !result.rows[0].autotask_webhook_id) {
return NextResponse.json({ error: `No webhook registered for ${entityType}` }, { status: 404 });
}
await manager.deleteWebhook(entityType, parseInt(result.rows[0].autotask_webhook_id));
return NextResponse.json({ success: true, entityType });
}
// Deregister all
await manager.deregisterAll();
return NextResponse.json({ success: true, message: 'All webhooks deregistered' });
} catch (error) {
const msg = error instanceof Error ? error.message : String(error);
console.error('[WEBHOOK-DEREGISTER] Error:', msg);
return NextResponse.json({ error: msg }, { status: 500 });
}
}