diff --git a/app/components/debug/WebhookReceiverSection.vue b/app/components/debug/WebhookReceiverSection.vue
new file mode 100644
index 0000000..4a0fa52
--- /dev/null
+++ b/app/components/debug/WebhookReceiverSection.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
Receptor de Webhooks
+
+ Configura un webhook con la siguiente URL para recibir eventos aqui:
+
+
+
+ {{ receiverUrl }}
+
+
+
+
+
+
+
+
+
+
+
+
+ Actualizar
+
+
+
+ Limpiar
+
+
+
+ {{ events.length }} eventos
+
+
+
+
+
+
+
No hay eventos recibidos
+
+ Configura un webhook apuntando a la URL de arriba
+
+
+
+
+
+
+
+
+ {{ event.event }}
+
+
+ {{ formatTime(event.receivedAt) }}
+
+
+
+
+
+
+
{{ JSON.stringify(event.data, null, 2) }}
+
{{ JSON.stringify(event.data) }}
+
+
+
+
+
+
+
diff --git a/app/pages/debug/index.vue b/app/pages/debug/index.vue
index bd3191e..c2c082b 100644
--- a/app/pages/debug/index.vue
+++ b/app/pages/debug/index.vue
@@ -33,8 +33,11 @@
-
+
+
+
+
{
}, { immediate: true })
const tabs = [
+ { label: 'Webhooks', slot: 'webhooks', icon: 'i-lucide-webhook' },
{ label: 'Blocklist', slot: 'blocklist', icon: 'i-lucide-ban' },
{ label: 'Privacy', slot: 'privacy', icon: 'i-lucide-shield' },
{ label: 'Groups', slot: 'groups', icon: 'i-lucide-users' },
diff --git a/server/api/debug/webhook-events.delete.ts b/server/api/debug/webhook-events.delete.ts
new file mode 100644
index 0000000..1a570ea
--- /dev/null
+++ b/server/api/debug/webhook-events.delete.ts
@@ -0,0 +1,16 @@
+/**
+ * DELETE /api/debug/webhook-events
+ * Clear all stored debug webhook events
+ */
+import { debugWebhookStore } from '../../services/debug/webhook-store'
+
+export default defineEventHandler(async (event) => {
+ const username = getHeader(event, 'x-authentik-username')
+ if (!username) {
+ throw createError({ statusCode: 401, message: 'Unauthorized' })
+ }
+
+ debugWebhookStore.clear()
+
+ return { success: true, message: 'Events cleared' }
+})
diff --git a/server/api/debug/webhook-events.get.ts b/server/api/debug/webhook-events.get.ts
new file mode 100644
index 0000000..16dab0e
--- /dev/null
+++ b/server/api/debug/webhook-events.get.ts
@@ -0,0 +1,23 @@
+/**
+ * GET /api/debug/webhook-events
+ * Get stored debug webhook events
+ */
+import { debugWebhookStore } from '../../services/debug/webhook-store'
+
+export default defineEventHandler(async (event) => {
+ const username = getHeader(event, 'x-authentik-username')
+ if (!username) {
+ throw createError({ statusCode: 401, message: 'Unauthorized' })
+ }
+
+ const query = getQuery(event)
+ const limit = parseInt(query.limit as string) || 50
+
+ const events = debugWebhookStore.getEvents(limit)
+
+ return {
+ success: true,
+ count: events.length,
+ events
+ }
+})
diff --git a/server/api/debug/webhook-receiver.post.ts b/server/api/debug/webhook-receiver.post.ts
new file mode 100644
index 0000000..65325b5
--- /dev/null
+++ b/server/api/debug/webhook-receiver.post.ts
@@ -0,0 +1,32 @@
+/**
+ * POST /api/debug/webhook-receiver
+ * Internal endpoint to receive webhooks for debugging
+ * Stores events in memory and emits via SSE
+ */
+import { debugWebhookStore } from '../../services/debug/webhook-store'
+
+export default defineEventHandler(async (event) => {
+ const body = await readBody(event)
+ const headers = getHeaders(event)
+
+ const webhookEvent = {
+ id: crypto.randomUUID(),
+ receivedAt: new Date().toISOString(),
+ event: body.event || 'unknown',
+ timestamp: body.timestamp,
+ data: body.data || body,
+ headers: {
+ 'x-webhook-event': headers['x-webhook-event'],
+ 'x-webhook-timestamp': headers['x-webhook-timestamp'],
+ 'x-webhook-signature': headers['x-webhook-signature'],
+ 'content-type': headers['content-type'],
+ }
+ }
+
+ // Store the event
+ debugWebhookStore.addEvent(webhookEvent)
+
+ console.log(`[Debug Webhook] Received event: ${webhookEvent.event}`)
+
+ return { success: true, message: 'Event received' }
+})
diff --git a/server/services/debug/webhook-store.ts b/server/services/debug/webhook-store.ts
new file mode 100644
index 0000000..bc8d286
--- /dev/null
+++ b/server/services/debug/webhook-store.ts
@@ -0,0 +1,41 @@
+/**
+ * Debug Webhook Store
+ * Stores webhook events in memory for debugging
+ */
+
+interface WebhookEvent {
+ id: string
+ receivedAt: string
+ event: string
+ timestamp?: string
+ data: any
+ headers: Record
+}
+
+class DebugWebhookStore {
+ private events: WebhookEvent[] = []
+ private maxEvents = 100
+
+ addEvent(event: WebhookEvent) {
+ this.events.unshift(event)
+
+ // Keep only the last N events
+ if (this.events.length > this.maxEvents) {
+ this.events = this.events.slice(0, this.maxEvents)
+ }
+ }
+
+ getEvents(limit: number = 50): WebhookEvent[] {
+ return this.events.slice(0, limit)
+ }
+
+ clear() {
+ this.events = []
+ }
+
+ getCount(): number {
+ return this.events.length
+ }
+}
+
+export const debugWebhookStore = new DebugWebhookStore()