Implements comprehensive webhook infrastructure to receive and process real-time entity updates from Autotask, reducing API calls and improving data freshness. Features: - Webhook receiver endpoint: POST /api/webhooks/autotask - Automatic entity mapping and upsert to PostgreSQL - Event logging and tracking in webhook_logs table - Duplicate event prevention via unique event_id - Failed event tracking with error messages - Statistics and monitoring APIs - Support for 8 entity types: Companies, Tickets, Tasks, Projects, Time Entries, Contacts, Contracts, Configuration Items Architecture: - WebhookService: Core processing logic - Database tables: webhook_logs, webhook_configs - API endpoints: /autotask (receiver), /logs, /stats - Automatic data mapping using existing entity-mapper Benefits: - Near real-time updates (<1 minute vs 24 hours) - Reduced API usage (webhooks vs polling) - Complements daily incremental sync for redundancy - Automatic recovery from webhook failures Files Added: - lib/types/webhook.ts - TypeScript types and interfaces - lib/services/webhook-service.ts - Webhook processing service - app/api/webhooks/autotask/route.ts - Webhook receiver - app/api/webhooks/logs/route.ts - Logs API - app/api/webhooks/stats/route.ts - Statistics API - migrations/004_webhook_support.sql - Database schema - docs/WEBHOOK_SETUP.md - Complete setup guide (47 sections) - docs/WEBHOOKS_README.md - Quick start guide Next Steps: 1. Run database migration 2. Configure webhooks in Autotask 3. Test endpoint and monitor logs See docs/WEBHOOK_SETUP.md for detailed setup instructions.
36 lines
1,001 B
TypeScript
36 lines
1,001 B
TypeScript
/**
|
|
* Webhook Logs API
|
|
* View and manage webhook event logs
|
|
*/
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import { webhookService } from '@/lib/services/webhook-service';
|
|
|
|
/**
|
|
* GET /api/webhooks/logs
|
|
* Get recent webhook logs
|
|
*/
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const searchParams = request.nextUrl.searchParams;
|
|
const limit = parseInt(searchParams.get('limit') || '100');
|
|
const entityType = searchParams.get('entityType') || undefined;
|
|
|
|
const logs = await webhookService.getWebhookLogs(limit, entityType);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
logs,
|
|
count: logs.length,
|
|
});
|
|
|
|
} catch (error) {
|
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
console.error('[WEBHOOK LOGS API] Error fetching logs:', errorMessage);
|
|
|
|
return NextResponse.json(
|
|
{ error: 'Failed to fetch webhook logs', details: errorMessage },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|