veza/apps/web/src/services/webhookService.ts

57 lines
1.9 KiB
TypeScript
Raw Normal View History

import { apiClient } from './api/client';
import { logger } from '@/utils/logger';
export interface Webhook {
id: string;
url: string;
events: string[];
status: 'active' | 'failed';
lastTriggered: string;
secret?: string;
created_at: string;
}
export const webhookService = {
list: async (): Promise<Webhook[]> => {
try {
const response = await apiClient.get<any[]>('/webhooks');
return (response.data || []).map(hook => ({
id: hook.id,
url: hook.url,
events: hook.events || [],
status: hook.status || 'active',
lastTriggered: hook.last_triggered || 'Never',
created_at: hook.created_at,
}));
} catch (error: unknown) {
const err = error as { response?: { status?: number }; code?: number };
const status = err?.response?.status ?? err?.code;
const is5xx = typeof status === 'number' && status >= 500;
if (!is5xx) {
logger.error('[Webhooks] Failed to list webhooks', { error });
}
// 5xx: no log (backend error, avoid console noise)
return [];
}
},
create: async (url: string, events: string[] = ['*']): Promise<Webhook> => {
const response = await apiClient.post<any>('/webhooks', {
url,
events,
});
return response.data;
},
delete: async (id: string): Promise<void> => {
await apiClient.delete(`/webhooks/${id}`);
},
regenerateKey: async (id: string): Promise<{ api_key: string }> => {
const response = await apiClient.post<{ data: { api_key: string } }>(`/webhooks/${id}/regenerate-key`);
// APIClient might already unwrap the first level of "data"
// If response.data is { api_key }, we return it.
return response.data as any;
}
};