ministry-platform-provider
Version:
TypeScript client library for Ministry Platform API integration
119 lines (118 loc) • 4.32 kB
JavaScript
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('&');
}
}