/
githubmirror
/
novu
Обзор
Документация
Войти
/
githubmirror
/
novu
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
next
apps/dashboard/src/api/api.client.ts
140 строк
5 KB
Himanshu Garg
refactor(dashboard): unify connect and platform into main platform (#11467)
08 июн 2026, 14:38
Не верифицирован
08 июн 2026, 14:38
6292b30
Код
Авторство
О чём код?
import { IEnvironment } from '@novu/shared'; import { apiHostnameManager } from '@/utils/api-hostname-manager'; import { getToken } from '@/utils/auth'; // This is how we import the speakeasy autogenerated Novu SDK that is CJS in a the Dashboard ESM project with Vite // Read more at https://github.com/vitejs/vite/issues/5668#issuecomment-968117934 /** DO NOT CHANGE THIS CODE START */ // import * as NovuAPI from '@novu/api'; // const { Novu } = NovuAPI; // export const novuClient = new Novu(); /** DO NOT CHANGE THIS CODE END */ export class NovuApiError extends Error { constructor( public message: string, public status: number, public rawError?: unknown ) { super(message); } } type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; const request = async <T>( endpoint: string, options?: { environment?: IEnvironment; body?: unknown; method?: HttpMethod; headers?: HeadersInit; version?: 'v1' | 'v2'; signal?: AbortSignal; } ): Promise<T> => { const { body, environment, headers, method = 'GET', version = 'v1', signal } = options || {}; try { const jwt = await getToken(); const config: RequestInit = { method, headers: { Authorization: `Bearer ${jwt}`, 'Content-Type': 'application/json', ...(environment && { 'Novu-Environment-Id': environment._id }), ...headers, }, signal, }; if (body) { if (body instanceof FormData) { // For FormData, don't stringify and don't set Content-Type (let browser handle it) config.body = body; // Remove Content-Type header for FormData delete (config.headers as Record<string, string>)['Content-Type']; } else { config.body = JSON.stringify(body); } } const baseUrl = apiHostnameManager.getHostname(); const response = await fetch(`${baseUrl}/${version}${endpoint}`, config); if (!response.ok) { const errorData = await response.json(); throw new NovuApiError(parseErrorMessage(errorData), response.status, errorData); } if (response.status === 204) { return {} as T; } return await response.json(); } catch (error) { if (error instanceof NovuApiError) { throw error; } if (typeof error === 'object' && error && 'message' in error) { throw new Error(`Fetch error: ${error.message}`); } throw new Error(`Fetch error: ${JSON.stringify(error)}`); } }; type RequestOptions = { body?: unknown; environment?: IEnvironment; signal?: AbortSignal; headers?: HeadersInit }; export const get = <T>(endpoint: string, { environment, signal, headers }: RequestOptions = {}) => request<T>(endpoint, { method: 'GET', environment, signal, headers }); export const post = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { method: 'POST', ...options }); export const put = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { method: 'PUT', ...options }); export const del = <T>(endpoint: string, { environment, signal }: RequestOptions = {}) => request<T>(endpoint, { method: 'DELETE', environment, signal }); export const patch = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { method: 'PATCH', ...options }); export const getV2 = <T>(endpoint: string, { environment, signal }: RequestOptions = {}) => request<T>(endpoint, { version: 'v2', method: 'GET', environment, signal }); export const postV2 = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { version: 'v2', method: 'POST', ...options }); export const putV2 = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { version: 'v2', method: 'PUT', ...options }); export const delV2 = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { version: 'v2', method: 'DELETE', ...options }); export const patchV2 = <T>(endpoint: string, options: RequestOptions) => request<T>(endpoint, { version: 'v2', method: 'PATCH', ...options }); function parseErrorMessage(errorData: any): string { const DEFAULT_ERROR = 'Novu API error'; if (!errorData?.message) { return DEFAULT_ERROR; } if (Array.isArray(errorData.message)) { return errorData.message.filter(Boolean).join('. ') || DEFAULT_ERROR; } if (typeof errorData.message !== 'string') { return errorData.message?.message || DEFAULT_ERROR; } try { const parsedMessage = JSON.parse(errorData.message); return parsedMessage.message || DEFAULT_ERROR; } catch { return errorData.message?.message || errorData.message || DEFAULT_ERROR; } } export function getApiBaseUrl(): string { return apiHostnameManager.getHostname(); }