// set up AWS end point var mysfitsApiEndpoint = 'https://tdrw8ktff7.execute-api.ap-southeast-2.amazonaws.com/prod'; var streamingApiEndpoint = 'https://cffe0tzmd9.execute-api.ap-southeast-2.amazonaws.com/prod'; // define AWS cognito User PoolId var cognitoUserPoolId = 'ap-southeast-2_ydiIfkgMO'; // define AWS cognito User Pool Client Id var cognitoUserPoolClientId = '7ec4dkl83t5303e01081i0p95h'; //define the application region var awsRegion = 'ap-southeast-2'; // define angular module var app = angular.module('mysfitsApp', []); var gridScope; var filterScope; var profileScope; initializeStorage(); var configString = localStorage.getItem("awsConfig"); var config = JSON.parse(configString); if(config != null) { refreshAWSCredentials(); loggedInDisplay(); } function loggedInDisplay() { $("#loginModal").modal("hide"); $("#logInButton").addClass("d-none"); $("#logOutButton").removeClass("d-none"); } function initializeStorage() { var identityPoolId = cognitoUserPoolId; var userPoolId = cognitoUserPoolId; var clientId = cognitoUserPoolClientId; var loginPrefix = 'cognito-idp.' + awsRegion + '.amazonaws.com/' + identityPoolId; localStorage.setItem('identityPoolId', identityPoolId); localStorage.setItem('userPoolId', userPoolId); localStorage.setItem('clientId', clientId); localStorage.setItem('loginPrefix', loginPrefix); } $(document).on('click', '#logOutButton', function(event) { localStorage.clear(); document.location.reload(); }); function loginUser() { var userPoolId = localStorage.getItem('userPoolId'); var clientId = localStorage.getItem('clientId'); var identityPoolId = localStorage.getItem('identityPoolId'); var loginPrefix = localStorage.getItem('loginPrefix'); var poolData = { UserPoolId : userPoolId, // user pool id here ClientId : clientId // client id here }; var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); var email = document.getElementById('email').value; var pwd = document.getElementById('pwd').value; var authenticationData = { 'UserName': email, 'Password': pwd } var userData = { Username : email, Pool : userPool }; var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData); var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function (result) { console.log('access token + \n' + result.getAccessToken().getJwtToken()); var sessionTokens = { IdToken: result.getIdToken(), AccessToken: result.getAccessToken(), RefreshToken: result.getRefreshToken() }; localStorage.setItem('sessionTokens', JSON.stringify(sessionTokens)); //POTENTIAL: Region needs to be set if not already set previously elsewhere. AWS.config.region = 'ap-southeast-2'; AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId : identityPoolId, Logins : { // Change the key below according to the specific region your user pool is in. loginPrefix : sessionTokens.IdToken.jwtToken } }); localStorage.setItem('awsConfig', JSON.stringify(AWS.config)); localStorage.setItem('email', email); cognitoUser.getUserAttributes(function(err, result) { if (err) { alert(err); return; } for (i = 0; i < result.length; i++) { console.log('attribute ' + result[i].getName() + ' has value ' + result[i].getValue()); if (result[i].getName() == 'sub') { console.log('Overwriting userId into local storage'); localStorage.setItem('userId', result[i].getValue()); } } }); loggedInDisplay(); }, onFailure: function(err) { alert(err.message); }, }); } function refreshAWSCredentials() { var userPoolId = localStorage.getItem('userPoolId'); var clientId = localStorage.getItem('clientId'); var identityPoolId = localStorage.getItem('identityPoolId'); var loginPrefix = localStorage.getItem('loginPrefix'); var poolData = { UserPoolId : userPoolId, // Your user pool id here ClientId : clientId // Your client id here }; var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); var cognitoUser = userPool.getCurrentUser(); if (cognitoUser != null) { cognitoUser.getSession(function(err, result) { if (result) { console.log('You are now logged in.'); cognitoUser.refreshSession(result.getRefreshToken(), function(err, result) { if (err) {//throw err; console.log('In the err: '+err); } else{ localStorage.setItem('awsConfig', JSON.stringify(AWS.config)); var sessionTokens = { IdToken: result.getIdToken(), AccessToken: result.getAccessToken(), RefreshToken: result.getRefreshToken() }; localStorage.setItem("sessionTokens", JSON.stringify(sessionTokens)); } }); } }); } } $("#loginForm").submit(function(event) { event.preventDefault(); loginUser(); }); app.controller('clearFilterController', function($scope) { }); app.controller('mysfitsFilterController', function($scope) { filterScope = $scope; // The possible options for Mysfits to populate the dropdown filters. $scope.filterOptionsList = { "categories": [ { "title": "Good/Evil", "selections": [ "Good", "Neutral", "Evil" ] }, { "title": "Lawful/Chaotic", "selections": [ "Lawful", "Neutral", "Chaotic" ] } ] }; $scope.removeFilter = function() { allMysfits = getAllMysfits(applyGridScope); } $scope.queryMysfits = function(filterCategory, filterValue) { var filterCategoryQS = ""; if (filterCategory==="Good/Evil") { filterCategoryQS = "GoodEvil"; } else { filterCategoryQS = "LawChaos" } var mysfitsApi = mysfitsApiEndpoint + '/mysfits?' + 'filter=' + filterCategoryQS + "&value=" + filterValue; $.ajax({ url : mysfitsApi, type : 'GET', success : function(response) { applyGridScope(response.mysfits) }, error : function(response) { console.log("could not retrieve mysfits list."); if (response.status == "401") { refreshAWSCredentials(); } } }); } }); app.controller('mysfitsListController', function($scope) { gridScope = $scope; getAllMysfits(applyGridScope); $scope.likeClicked = function(mysfitId) { console.log("clicked: " + mysfitId); likeMysfit(mysfitId, updateLikeIcons); } }); app.controller('mysfitProfileController', function($scope) { profileScope = $scope; $scope.adoptClicked = function(mysfitId) { console.log("adopt clicked: " + mysfitId); adoptMysfit(mysfitId, markAdopted); } }); /* A new event handling funciton if the profile modal is triggered, to record that click event and sent it to our new streaming service backend. */ $('#profileModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget); var mysfitId = button.data('mysfitid'); getMysfit(mysfitId, updateModalText); recordProfileClick(mysfitId) }); function updateModalText(profileMysfit) { applyProfileScope(profileMysfit); if (profileMysfit.adopted == true) { markAdopted(); } else { markNotAdopted(); } } function markAdopted() { $("#adoptButton").addClass("d-none"); $("#alreadyAdoptedButton").removeClass("d-none"); } function markNotAdopted() { $("#adoptButton").removeClass("d-none"); $("#alreadyAdoptedButton").addClass("d-none"); } function updateLikeIcons(mysfitId) { likeIconId = "#" + mysfitId + "LikeIcon"; $(likeIconId).addClass("d-none"); alreadyLikedIconId = "#" + mysfitId + "AlreadyLikedIcon"; $(alreadyLikedIconId).removeClass("d-none"); } function applyGridScope(mysfitsList) { gridScope.mysfits = mysfitsList; gridScope.$apply(); } function applyProfileScope(mysfit) { profileScope.profileMysfit = mysfit; profileScope.$apply(); } function likeMysfit(mysfitId, callback) { try { var mysfitsApi = mysfitsApiEndpoint + '/mysfits/' + mysfitId + "/like"; var sessionTokensString = localStorage.getItem('sessionTokens'); var sessionTokens = JSON.parse(sessionTokensString); var IdToken = sessionTokens.IdToken; var idJwt = IdToken.jwtToken; $.ajax({ url : mysfitsApi, type : 'POST', headers : {'Authorization' : idJwt }, success : function(response) { console.log("here" + mysfitId); callback(mysfitId); }, error : function(response) { console.log("could not like mysfit"); console.log(response); if (response.status == "401") { refreshAWSCredentials(); } } }); } catch(err) { alert("You must be logged in to like a mysfit"); console.log(err.message); } } function adoptMysfit(mysfitId, callback) { try { var mysfitsApi = mysfitsApiEndpoint + '/mysfits/' + mysfitId + "/adopt"; var sessionTokensString = localStorage.getItem('sessionTokens'); var sessionTokens = JSON.parse(sessionTokensString); var IdToken = sessionTokens.IdToken; var idJwt = IdToken.jwtToken; $.ajax({ url : mysfitsApi, async : false, type : 'POST', headers : {'Authorization' : idJwt }, success : function(response) { callback(); }, error : function(response) { console.log("could not adopt mysfit"); if (response.status == "401") { refreshAWSCredentials(); } } }); } catch(err) { alert("You must be logged in to adopt a mysfit"); console.log(err.message); } } function getAllMysfits(callback) { var mysfitsApi = mysfitsApiEndpoint + '/mysfits'; $.ajax({ url : mysfitsApi, type : 'GET', success : function(response) { callback(response.mysfits); }, error : function(response) { console.log("could not retrieve mysfits list."); if (response.status == "401") { refreshAWSCredentials(); } } }); } function getMysfit(mysfitId, callback) { var mysfitsApi = mysfitsApiEndpoint + '/mysfits/' + mysfitId; $.ajax({ url : mysfitsApi, type : 'GET', success : function(response) { callback(response); }, error : function(response) { console.log("could not retrieve mysfits list."); if (response.status == "401") { refreshAWSCredentials(); } } }); } /* The new JavaScript function created that records profile clicks. */ function recordProfileClick(clickedMysfitId) { var clicksApi = streamingApiEndpoint + '/clicks'; var userClick; currentUserId = localStorage.getItem('userId'); if (currentUserId == null) { currentUserId = 'guest'; } userClick = { userId: currentUserId, mysfitId: clickedMysfitId } console.log('Recording profile click: ' + userClick); $.ajax({ url : clicksApi, type : 'PUT', headers : {'Content-Type': 'application/json'}, dataType: 'json', data : JSON.stringify(userClick), success : function(response) { console.log("click recorded!") }, error : function(response) { console.log("could not record click"); console.log(response); } }); } $(document).on('click', '.btn-info', function(event) { event.preventDefault(); var poolData = { UserPoolId : cognitoUserPoolId, ClientId : cognitoUserPoolClientId }; var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); var attributeList = []; var email = document.getElementById('email').value; var pw = document.getElementById('pwd').value; var confirmPw = document.getElementById('confirmPwd').value; var dataEmail = { Name : 'email', Value : email }; var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail); attributeList.push(attributeEmail); if (pw === confirmPw) { userPool.signUp(email, pw, attributeList, null, function(err, result){ if (err) { alert(err.message); return; } cognitoUser = result.user; console.log(cognitoUser); localStorage.setItem('email', email); window.location.replace('confirm.html'); }); } else { alert('Passwords do not match.') } }); $(document).on('click', '.btn-success', function(event) { event.preventDefault(); var confirmCode = document.getElementById('confirmCode').value; var poolData = { UserPoolId : cognitoUserPoolId, ClientId : cognitoUserPoolClientId }; var userName = localStorage.getItem('email'); var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); var userData = { Username : userName, Pool : userPool }; var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); cognitoUser.confirmRegistration(confirmCode, true, function(err, result) { if (err) { alert(err.message); return; } window.location.replace("index.html"); }); });