diff --git a/lib/utils/reports-service.js b/lib/utils/reports-service.js new file mode 100644 index 000000000..deb79eeb7 --- /dev/null +++ b/lib/utils/reports-service.js @@ -0,0 +1,50 @@ +// @flow + +import { + reportsServiceURL, + sendReportEndpoint, +} from '../facts/reports-service.js'; +import type { + ReportsServiceSendReportsRequest, + ReportsServiceSendReportsResponse, +} from '../types/report-types.js'; + +async function sendReports( + reports: ReportsServiceSendReportsRequest, +): Promise { + const reportsArray = Array.isArray(reports) ? reports : [reports]; + + if (reportsArray.length === 0) { + return { reportIDs: [] }; + } + + const requestBody = reportsArray.map(clientReport => { + const { id, ...report } = clientReport; + return report; + }); + const url = `${reportsServiceURL}${sendReportEndpoint.path}`; + const response = await fetch(url, { + method: sendReportEndpoint.method, + body: JSON.stringify(requestBody), + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + const { status, statusText } = response; + let responseText, errorMessage; + try { + responseText = await response.text(); + } finally { + errorMessage = responseText || statusText || '-'; + } + // we cannot throw error inside `finally` block because eslint complains + throw new Error(`Server responded with HTTP ${status}: ${errorMessage}`); + } + + const { reportIDs } = await response.json(); + return { reportIDs }; +} + +export { sendReports };