UNPKG

ministry-platform-provider

Version:

TypeScript client library for Ministry Platform API integration

119 lines (118 loc) 4.32 kB
export class HttpClient { baseUrl; getToken; constructor(baseUrl, getToken) { this.baseUrl = baseUrl; this.getToken = getToken; } async get(endpoint, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'GET', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Accept': 'application/json' } }); if (!response.ok) { throw new Error(`GET ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } async post(endpoint, body, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body ? JSON.stringify(body) : undefined }); if (!response.ok) { throw new Error(`POST ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } async postFormData(endpoint, formData, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Accept': 'application/json' // Don't set Content-Type for FormData }, body: formData }); if (!response.ok) { throw new Error(`POST ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } async put(endpoint, body, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'PUT', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(body) }); if (!response.ok) { throw new Error(`PUT ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } async putFormData(endpoint, formData, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'PUT', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Accept': 'application/json' // Don't set Content-Type for FormData }, body: formData }); if (!response.ok) { throw new Error(`PUT ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } async delete(endpoint, queryParams) { const url = this.buildUrl(endpoint, queryParams); const response = await fetch(url, { method: 'DELETE', headers: { 'Authorization': `Bearer ${this.getToken()}`, 'Accept': 'application/json' } }); if (!response.ok) { throw new Error(`DELETE ${endpoint} failed: ${response.status} ${response.statusText}`); } return await response.json(); } buildUrl(endpoint, queryParams) { const url = `${this.baseUrl}${endpoint}`; if (!queryParams) return url; const queryString = this.buildQueryString(queryParams); return queryString ? `${url}?${queryString}` : url; } buildQueryString(params) { return Object.entries(params) .filter(([, value]) => value !== undefined && value !== null) .map(([key, value]) => { if (Array.isArray(value)) { return value.map(v => `${key}=${encodeURIComponent(String(v))}`).join('&'); } return `${key}=${encodeURIComponent(String(value))}`; }) .join('&'); } }