// AbortController is used for aborting fetch calls. This allows us to prevent future HTTP requests from going out if a previous HTTP request failed. // https://javascript.info/fetch-abort const abortController = new AbortController(); const httpMethods = { GET: 'GET', POST: 'POST', PATCH: 'PATCH' }; var abortSignal = abortController.signal; const rootEndpoint = 'https://gyt1ihav1i.execute-api.us-east-2.amazonaws.com/prod/'; // const rootEndpoint = 'https://3k07mdhq8k.execute-api.us-east-1.amazonaws.com/'; function ParseResponse(responsePayload) { let status = responsePayload["status"]; if (status === "fail") { console.log("FAILED"); abortController.abort(); } else if (status === "error") { console.log("ERROR"); abortController.abort(); } else if (status === "success") { console.log("SUCCESS"); } if (responsePayload['data'].hasOwnProperty('sqlErrorCode')) { if (responsePayload['data']['sqlErrorCode'] == 1062) console.log("USER ALREADY EXISTS"); else console.log("SQL Error " + responsePayload['data']['sqlErrorCode']); } console.log(responsePayload); } async function CreatePortalUser(payload) { // TEST PORTAL USER CREATION let response = await fetch(rootEndpoint + 'PortalUser', { method: 'POST', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return response; } async function SubmitRegistration(payload) { let response = await fetch(rootEndpoint + 'SubmitRegistration', { method: 'POST', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return responsePayload; } async function GenerateReport(studyID, acronym, jwtAccessToken, redirectCallback) { let endpoint = `${rootEndpoint}GenerateReport?studyID=${studyID}&acronym=${acronym}`; console.log("Sending Request"); let response = await fetch(endpoint, { method: 'GET', headers: { 'Content-Type': 'application/json', "Authorization": 'Bearer ' + jwtAccessToken } }); console.log("Received Response. Parsing JSON."); let responsePayload = await response.json(); console.log("JSON Parsed"); if (response.status == 401) { // Unauthorized so redirect redirectCallback(); } return responsePayload; } async function ProcessUser(confirmationID) { let payload = { "confirmationID": confirmationID }; let response = await fetch(rootEndpoint + "ConfirmUser", { method: 'POST', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return responsePayload; } async function SubmitSurvey(subjectID, sendScheduling) { let payload = { "subjectID": subjectID, "sendScheduling": sendScheduling }; let response = await fetch(rootEndpoint + "SubmitSurvey", { method: 'PATCH', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return responsePayload; } // Returns all study data async function GetStudyData(jwtAccessToken, redirectCallback) { let response = await fetch(rootEndpoint + "GetStudies", { method: 'GET', headers: { 'Content-Type': 'application/json', "Authorization": 'Bearer ' + jwtAccessToken }, signal: abortSignal }); let responsePayload = await response.json(); if (response.status == 401) { // Unauthorized so redirect redirectCallback(); } // ParseResponse(responsePayload); return responsePayload; } /** * Generic REST request function. * @param {string} endpointName - name of the method AFTER the root endpoint of the API * @param {httpMethods} httpMethod - "GET", "POST", "PATCH", etc. * @param {object} payload - Optional payload of data to send to the lambda * @param {string} jwtAccessToken - can be defined if needed for authorization * @param {method} redirectCallback - optional callback that will redirect the page on failure * @returns Parsed JSON Payload containing the response data * @public * @method */ async function RESTRequest(endpointName, httpMethod, payload = undefined, jwtAccessToken = undefined, redirectCallback = undefined) { headerValues = { "Content-Type": "application/json" }; if (jwtAccessToken !== undefined) { headerValues["Authorization"] = 'Bearer ' + jwtAccessToken; } let response = await fetch(rootEndpoint + endpointName, { method: httpMethod, headers: headerValues, body: payload === undefined ? undefined : JSON.stringify(payload), signal: abortSignal }) .catch((error) => { alert(error); if (redirectCallback !== undefined) { redirectCallback(); } return {}; }); if (redirectCallback !== undefined && response.status == 401) { // Unauthorized so redirect redirectCallback(); } let responsePayload = await response.json(); return responsePayload; } async function UnsubscribeFromStudy(emailAddress, studyID) { let payload = { "emailAddress": emailAddress, "studyID": studyID }; let response = await fetch(rootEndpoint + "UnsubscribeStudy", { method: 'PATCH', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return responsePayload; } async function GetParticipantData(jwtAccessToken, queryParams) { let response = await fetch(rootEndpoint + "StudyParticipant" + queryParams, { method: 'GET', headers: { 'Content-Type': 'application/json', "Authorization": 'Bearer ' + jwtAccessToken }, signal: abortSignal }); let responsePayload = await response.json(); // ParseResponse(responsePayload); return responsePayload; } // Returns the query parameters of a GET request // https://dev.to/ganeshmani/how-to-get-query-string-parameters-in-javascript-2019-4dm2 function GetQueryParameters(url) { let queryParams = {}; //create an anchor tag to use the property called search let anchor = document.createElement('a'); //assigning url to href of anchor tag anchor.href = url; //search property returns the query string of url let queryStrings = anchor.search.substring(1); let params = queryStrings.split('&'); for (var i = 0; i < params.length; i++) { var pair = params[i].split('='); queryParams[pair[0]] = decodeURIComponent(pair[1]); } return queryParams; } // Inserts data into RegistrationAnalytics table. async function InsertAnalytics(referrerName, referrerGUID, studyID) { let response = await fetch(rootEndpoint + "InsertAnalytics", { method: 'POST', body: JSON.stringify( { "referrerName": referrerName, "referrerGUID": referrerGUID, "didRegister": false, "didConfirmRegistration": false, "studyID": studyID } ), headers: { 'Content-Type': 'application/json' }, signal: abortSignal }); let responsePayload = await response.json(); return responsePayload; }