diff --git a/src/services/CANFiltersAPI.js b/src/services/CANFiltersAPI.js index 86122f0..a6a6b4d 100644 --- a/src/services/CANFiltersAPI.js +++ b/src/services/CANFiltersAPI.js @@ -1,49 +1,58 @@ import { - getAuthHeaderOptions, - fetchRespHandler, - addQueryParams, + errorHandler, + getAuthHeaderOptions, + fetchRespHandler, + addQueryParams, } from "../utils/http"; const API_ENDPOINT = process.env.REACT_APP_UPLOAD_SERVICE_URL; const canFiltersAPI = { - addFilter: async (vin, filter, token) => - fetch(`${API_ENDPOINT}/vehicle/${vin}/filter`, { - method: "POST", - headers: Object.assign( - { "Content-Type": "application/json" }, - getAuthHeaderOptions(token) - ), - body: JSON.stringify(filter) - }).then(fetchRespHandler), + addFilter: async (vin, filter, token) => + fetch(`${API_ENDPOINT}/vehicle/${vin}/filter`, { + method: "POST", + headers: Object.assign( + { "Content-Type": "application/json" }, + getAuthHeaderOptions(token) + ), + body: JSON.stringify(filter), + }) + .then(fetchRespHandler) + .catch(errorHandler), - getFilters: async (vin, search, token) => - fetch(addQueryParams(`${API_ENDPOINT}/vehicle/${vin}/filters`, search), { - method: "GET", - headers: Object.assign( - { "Content-Type": "application/json" }, - getAuthHeaderOptions(token) - ), - }).then(fetchRespHandler), + getFilters: async (vin, search, token) => + fetch(addQueryParams(`${API_ENDPOINT}/vehicle/${vin}/filters`, search), { + method: "GET", + headers: Object.assign( + { "Content-Type": "application/json" }, + getAuthHeaderOptions(token) + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), - updateFilter: async (vin, canID, filter, token) => - fetch(`${API_ENDPOINT}/vehicle/${vin}/filter/${canID}`, { - method: "PUT", - headers: Object.assign( - { "Content-Type": "application/json" }, - getAuthHeaderOptions(token) - ), - body: JSON.stringify(filter) - }).then(fetchRespHandler), + updateFilter: async (vin, canID, filter, token) => + fetch(`${API_ENDPOINT}/vehicle/${vin}/filter/${canID}`, { + method: "PUT", + headers: Object.assign( + { "Content-Type": "application/json" }, + getAuthHeaderOptions(token) + ), + body: JSON.stringify(filter), + }) + .then(fetchRespHandler) + .catch(errorHandler), - deleteFilter: async (vin, canID, token) => - fetch(`${API_ENDPOINT}/vehicle/${vin}/filter/${canID}`, { - method: "DELETE", - headers: Object.assign( - { "Content-Type": "application/json" }, - getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + deleteFilter: async (vin, canID, token) => + fetch(`${API_ENDPOINT}/vehicle/${vin}/filter/${canID}`, { + method: "DELETE", + headers: Object.assign( + { "Content-Type": "application/json" }, + getAuthHeaderOptions(token) + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default canFiltersAPI; diff --git a/src/services/auth.js b/src/services/auth.js index aee4615..83437c8 100644 --- a/src/services/auth.js +++ b/src/services/auth.js @@ -1,4 +1,4 @@ -import { fetchRespHandler } from "../utils/http"; +import { errorHandler, fetchRespHandler } from "../utils/http"; const AUTH_URL = process.env.REACT_APP_AUTH_SERVICE_URL; const CALLBACK_URL = process.env.REACT_APP_AUTH_CALLBACK_URL; @@ -16,7 +16,9 @@ const auth = { code, redirect: CALLBACK_URL, }), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), verify: (idToken) => fetch(`${AUTH_URL}/verify`, { @@ -25,7 +27,9 @@ const auth = { "Content-Type": "application/json", }, body: JSON.stringify({ token: idToken }), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), refresh: (refreshToken) => fetch(`${AUTH_URL}/refresh`, { @@ -34,7 +38,9 @@ const auth = { "Content-Type": "application/json", }, body: JSON.stringify({ refresh_token: refreshToken }), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default auth; diff --git a/src/services/certificatesAPI.js b/src/services/certificatesAPI.js index 7527b4b..3313723 100644 --- a/src/services/certificatesAPI.js +++ b/src/services/certificatesAPI.js @@ -1,4 +1,8 @@ -import { getAuthHeaderOptions, fetchRespHandler } from "../utils/http"; +import { + errorHandler, + getAuthHeaderOptions, + fetchRespHandler, +} from "../utils/http"; const API_ENDPOINT = process.env.REACT_APP_CERT_SERVICE_URL; @@ -11,7 +15,9 @@ const certificatesAPI = { getAuthHeaderOptions(token) ), body: JSON.stringify(data), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default certificatesAPI; diff --git a/src/services/fleetsAPI.js b/src/services/fleetsAPI.js index a862e5c..08e54ce 100644 --- a/src/services/fleetsAPI.js +++ b/src/services/fleetsAPI.js @@ -1,4 +1,5 @@ import { + errorHandler, getAuthHeaderOptions, fetchRespHandler, addQueryParams, @@ -14,8 +15,10 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(fleet) - }).then(fetchRespHandler), + body: JSON.stringify(fleet), + }) + .then(fetchRespHandler) + .catch(errorHandler), getFleet: async (name, token) => fetch(`${API_ENDPOINT}/fleet/${name}`, { @@ -23,8 +26,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), getFleets: async (search, token) => fetch(addQueryParams(`${API_ENDPOINT}/fleets`, search), { @@ -33,7 +38,9 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), updateFleet: async (name, fleet, token) => fetch(`${API_ENDPOINT}/fleet/${name}`, { @@ -42,8 +49,10 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(fleet) - }).then(fetchRespHandler), + body: JSON.stringify(fleet), + }) + .then(fetchRespHandler) + .catch(errorHandler), deleteFleet: async (name, token) => fetch(`${API_ENDPOINT}/fleet/${name}`, { @@ -51,8 +60,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), getFleetVehicles: async (name, search, token) => fetch(addQueryParams(`${API_ENDPOINT}/fleet/${name}/vehicles`, search), { @@ -60,8 +71,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), addFleetVehicle: async (name, vehicle, token) => fetch(`${API_ENDPOINT}/fleet/${name}/vehicle`, { @@ -70,8 +83,10 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(vehicle) - }).then(fetchRespHandler), + body: JSON.stringify(vehicle), + }) + .then(fetchRespHandler) + .catch(errorHandler), deleteFleetVehicle: async (name, vehicle, token) => fetch(`${API_ENDPOINT}/fleet/${name}/vehicle/${vehicle.vin}`, { @@ -79,8 +94,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), getFleetCANFilters: async (name, search, token) => fetch(addQueryParams(`${API_ENDPOINT}/fleet/${name}/filters`, search), { @@ -88,8 +105,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), addFleetCANFilter: async (name, filter, token) => fetch(`${API_ENDPOINT}/fleet/${name}/filter`, { @@ -98,8 +117,10 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(filter) - }).then(fetchRespHandler), + body: JSON.stringify(filter), + }) + .then(fetchRespHandler) + .catch(errorHandler), updateFleetCANFilter: async (name, can_id, filter, token) => fetch(`${API_ENDPOINT}/fleet/${name}/filter/${can_id}`, { @@ -108,8 +129,10 @@ const fleetsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(filter) - }).then(fetchRespHandler), + body: JSON.stringify(filter), + }) + .then(fetchRespHandler) + .catch(errorHandler), deleteFleetCANFilter: async (name, can_id, token) => fetch(`${API_ENDPOINT}/fleet/${name}/filter/${can_id}`, { @@ -117,8 +140,10 @@ const fleetsAPI = { headers: Object.assign( { "Content-Type": "application/json" }, getAuthHeaderOptions(token) - ) - }).then(fetchRespHandler), + ), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default fleetsAPI; diff --git a/src/services/manifestsAPI.js b/src/services/manifestsAPI.js index 96cc485..6ad7205 100644 --- a/src/services/manifestsAPI.js +++ b/src/services/manifestsAPI.js @@ -1,4 +1,5 @@ import { + errorHandler, getAuthHeaderOptions, fetchRespHandler, addQueryParams, @@ -14,7 +15,9 @@ const manifestsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getManifest: async (id, token) => { const u = addQueryParams(`${API_ENDPOINT}/manifest`, { id }); @@ -24,7 +27,9 @@ const manifestsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getManifests: async (search, token) => { @@ -35,7 +40,9 @@ const manifestsAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, createManifest: async (data, token) => @@ -46,7 +53,9 @@ const manifestsAPI = { getAuthHeaderOptions(token) ), body: JSON.stringify(data), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), createManifestECU: async (data, token) => fetch(`${API_ENDPOINT}/manifestecu`, { @@ -56,7 +65,9 @@ const manifestsAPI = { getAuthHeaderOptions(token) ), body: JSON.stringify(data), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default manifestsAPI; diff --git a/src/services/updatesAPI.js b/src/services/updatesAPI.js index 7090b1f..e5c56f7 100644 --- a/src/services/updatesAPI.js +++ b/src/services/updatesAPI.js @@ -1,4 +1,5 @@ import { + errorHandler, getAuthHeaderOptions, fetchRespHandler, addQueryParams, @@ -15,7 +16,9 @@ const updatesAPI = { getAuthHeaderOptions(token) ), body: JSON.stringify(data), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getCarUpdateLog: async (query, token) => { const u = addQueryParams(`${API_ENDPOINT}/carupdateslog`, query); @@ -25,7 +28,9 @@ const updatesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getCarUpdateProgress: async (carupdateids, token) => { @@ -36,7 +41,9 @@ const updatesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getCarUpdates: async (search, token) => { @@ -47,7 +54,9 @@ const updatesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getVINUpdates: async (vin, token) => { @@ -58,7 +67,9 @@ const updatesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, }; diff --git a/src/services/vehiclesAPI.js b/src/services/vehiclesAPI.js index 7542a31..ea1d408 100644 --- a/src/services/vehiclesAPI.js +++ b/src/services/vehiclesAPI.js @@ -1,4 +1,5 @@ import { + errorHandler, getAuthHeaderOptions, fetchRespHandler, addQueryParams, @@ -15,7 +16,9 @@ const vehiclesAPI = { getAuthHeaderOptions(token) ), body: JSON.stringify(vehicle), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), deleteVehicle: async (vin, token) => fetch(`${API_ENDPOINT}/vehicle/${vin}`, { @@ -24,7 +27,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getConnections: async (vins, token) => { const u = `${API_ENDPOINT}/carsconnected?vins=${vins.join(",")}`; @@ -34,7 +39,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getECUs: async (search, token) => { @@ -45,7 +52,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getModels: async (token) => @@ -55,7 +64,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getLocations: async (token) => fetch(`${API_ENDPOINT}/carslocations`, { @@ -64,7 +75,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getState: async (token, vin) => fetch(`${API_ENDPOINT}/carstate?vin=${vin}`, { @@ -73,7 +86,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getVehicle: async (vin, token) => fetch(`${API_ENDPOINT}/vehicle/${vin}`, { @@ -82,7 +97,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), getVehicles: async (search, token) => { const u = addQueryParams(`${API_ENDPOINT}/vehicles`, search); @@ -92,7 +109,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler); + }) + .then(fetchRespHandler) + .catch(errorHandler); }, getYears: async (token) => @@ -102,7 +121,9 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), sendCommand: async (vins, command, parameters, token) => fetch(`${API_ENDPOINT}/vehiclecommand`, { @@ -116,7 +137,9 @@ const vehiclesAPI = { command, parameters, }), - }).then(fetchRespHandler), + }) + .then(fetchRespHandler) + .catch(errorHandler), updateVehicle: async (vin, vehicle, token) => fetch(`${API_ENDPOINT}/vehicle/${vin}`, { @@ -125,8 +148,10 @@ const vehiclesAPI = { { "Content-Type": "application/json" }, getAuthHeaderOptions(token) ), - body: JSON.stringify(vehicle) - }).then(fetchRespHandler), + body: JSON.stringify(vehicle), + }) + .then(fetchRespHandler) + .catch(errorHandler), }; export default vehiclesAPI; diff --git a/src/utils/http.js b/src/utils/http.js index 2dffd33..2d8b69a 100644 --- a/src/utils/http.js +++ b/src/utils/http.js @@ -1,13 +1,28 @@ import { logger } from "../services/monitoring"; -export const getAuthHeaderOptions = (token) => ({ - "Authorization": `Bearer ${token}`, - }); +export const addQueryParams = (url, params) => { + if (!params) return url; + + const u = new URL(url); + + Object.keys(params).forEach((key) => u.searchParams.append(key, params[key])); + + return u.toString(); +}; + +export const errorHandler = (e) => { + logger.error(e.stack); + return { + error: e.name, + message: e.message, + }; +}; export const fetchRespHandler = (response) => { if (response.ok) return response.json(); - return response.text() + return response + .text() .then((text) => { if (response.status >= 500) logger.error(text); return JSON.parse(text); @@ -18,15 +33,9 @@ export const fetchRespHandler = (response) => { error: response.statusText, message: `${response.status} ${response.statusText}`, }; - }) -} + }); +}; -export const addQueryParams = (url, params) => { - if (!params) return url; - - const u = new URL(url); - - Object.keys(params).forEach(key => u.searchParams.append(key, params[key])) - - return u.toString(); -} +export const getAuthHeaderOptions = (token) => ({ + Authorization: `Bearer ${token}`, +});