From 2780ddc2b8afe201718585f1ec9996b8c5f62517 Mon Sep 17 00:00:00 2001 From: PaulaScharf Date: Mon, 8 Nov 2021 13:33:05 +0100 Subject: [PATCH 1/3] backend for refreshTokens; frontend partially done --- controllers/jwtHelper.js | 63 +++++++++++++++++++ controllers/jwtTokenBlacklist.js | 60 ++++++++++++++++++ controllers/login.js | 9 ++- controllers/refreshToken.js | 47 ++++++++++++++ .../controllers/overlay/createController.js | 37 +++++++++-- .../js/services/authenticationService.js | 7 +++ public/creator/js/services/locationService.js | 3 + public/creator/js/services/overlayService.js | 3 + .../js/services/relationshipService.js | 3 + public/creator/js/services/scenarioService.js | 1 + public/creator/js/services/videoService.js | 3 + routes/login.js | 3 +- server.js | 6 +- 13 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 controllers/jwtHelper.js create mode 100644 controllers/jwtTokenBlacklist.js create mode 100644 controllers/refreshToken.js diff --git a/controllers/jwtHelper.js b/controllers/jwtHelper.js new file mode 100644 index 0000000..1ef4b0a --- /dev/null +++ b/controllers/jwtHelper.js @@ -0,0 +1,63 @@ +const crypto = require('crypto'); +var jwt = require('jsonwebtoken'); +var moment = require('moment'); +var { v4: uuidv4 } = require('uuid'); + +var refreshTokens = Object.create(null); + +const jwtSignOptions = { + algorithm: "HS384" +}; + +const hashJWT = function hashJWT (jwtString) { + if (typeof jwtString !== 'string') { + throw new Error('method hashJWT expects a string parameter'); + } + + return crypto + .createHmac('sha256', 'I ALSO WANT TO BE CHANGED') + .update(jwtString) + .digest('base64'); +}; + + +const createToken = function createToken (payload) { + payload.jwtid = uuidv4(); + return new Promise(function (resolve, reject) { + jwt.sign(payload, process.env.JWT_SECRET, async (err, token) => { + if (err) { + return reject(err); + } + + try { + // JWT generation was successful + // we now create the refreshToken. + // and set the refreshTokenExpires to 1 week + // it is a HMAC of the jwt string + const refreshToken = hashJWT(token); + addRefreshToken(refreshToken); + + return resolve({ token, refreshToken }); + } catch (err) { + return reject(err); + } + }); + }); + }; + +const useRefreshToken = function useRefreshToken (refreshToken) { + const now = Date.now() / 1000; + if (typeof refreshTokens[refreshToken] !== 'undefined' && refreshTokens[refreshToken].exp > now) { + refreshTokens[refreshToken] = undefined; + return true; + } + return false; +} + +const addRefreshToken = function addRefreshToken (refreshToken) { + refreshTokens[refreshToken] = { + exp: moment().add(7, 'days').unix() + }; +} + + module.exports = { createToken, hashJWT, useRefreshToken, addRefreshToken }; \ No newline at end of file diff --git a/controllers/jwtTokenBlacklist.js b/controllers/jwtTokenBlacklist.js new file mode 100644 index 0000000..5b7c045 --- /dev/null +++ b/controllers/jwtTokenBlacklist.js @@ -0,0 +1,60 @@ +const moment = require('moment'), + { hashJWT } = require('./jwtHelper'); + +// our token blacklist is just a js object with +// jtis as keys and all claims as values +const tokenBlacklist = Object.create(null); + +const cleanupExpiredTokens = function cleanupExpiredTokens () { + const now = Date.now() / 1000; + for (const jti of Object.keys(tokenBlacklist)) { + if (tokenBlacklist[jti].exp < now) { + delete tokenBlacklist[jti]; + } + } +}; + +const isTokenBlacklisted = function isTokenBlacklisted (token, tokenString) { + cleanupExpiredTokens(); + + if (!token.jti) { // token has no id.. -> shouldn't be accepted + return true; + } + + const hash = hashJWT(tokenString); + + if (typeof tokenBlacklist[hash] !== 'undefined') { + return true; + } + + return false; +}; + +const addTokenToBlacklist = function addTokenToBlacklist (token, tokenString) { + cleanupExpiredTokens(); + + const hash = hashJWT(tokenString); + + if (token && token.jti) { + tokenBlacklist[hash] = token; + } +}; + +const addTokenHashToBlacklist = function addTokenHashToBlacklist (tokenHash) { + cleanupExpiredTokens(); + + if (typeof tokenHash === 'string') { + // just set the exp claim to now plus one week to be sure + tokenBlacklist[tokenHash] = { + exp: moment.utc() + .add(1, 'week') + .unix() + }; + } +}; + +module.exports = { + isTokenBlacklisted, + addTokenToBlacklist, + addTokenHashToBlacklist +}; \ No newline at end of file diff --git a/controllers/login.js b/controllers/login.js index 03e53b0..c315e91 100644 --- a/controllers/login.js +++ b/controllers/login.js @@ -1,10 +1,10 @@ var colors = require('colors'); var moment = require('moment'); -var jwt = require('jsonwebtoken'); +const { createToken } = require('./jwtHelper'); // LOGIN -exports.request = function(req, res) { +exports.request = async function(req, res) { // Authentication if(process.env.ADMIN_USERNAME === req.body.username && process.env.ADMIN_PASSWORD === req.body.password){ @@ -16,10 +16,13 @@ exports.request = function(req, res) { iat: moment().unix(), exp: moment().add(1, 'days').unix() }; + const { token, refreshToken } = await createToken(payload); + // Create JWT var result = { username: process.env.ADMIN_USERNAME, - token: jwt.sign(payload, process.env.JWT_SECRET) + token: token, + refreshToken: refreshToken }; res.status(200).send(result); } else { diff --git a/controllers/refreshToken.js b/controllers/refreshToken.js new file mode 100644 index 0000000..d61a2da --- /dev/null +++ b/controllers/refreshToken.js @@ -0,0 +1,47 @@ +var colors = require('colors'); +const { createToken, useRefreshToken } = require('./jwtHelper'); +const { addTokenHashToBlacklist } = require('./jwtTokenBlacklist'); +var moment = require('moment'); + +const refreshJwt = async function refreshJwt (oldRefreshToken) { + return new Promise(async function (resolve, reject) { // TODO: doesnt need to be promise anymore + if(useRefreshToken(oldRefreshToken)) { + // invalidate old token + addTokenHashToBlacklist(oldRefreshToken); + + payload = { + iss: process.env.SERVER_URL, + sub: 'Login by username and password', + username: process.env.ADMIN_USERNAME, + iat: moment().unix(), + exp: moment().add(1, 'days').unix() + }; + + const { token, refreshToken: newRefreshToken } = await createToken(payload); + + + resolve({ token, refreshToken: newRefreshToken }); + } else { + var err = "Refresh token not found or expired. Please sign in with your username and password."; + reject(err); + } + }) + +}; + + // LOGIN +exports.request = async function(req, res) { + refreshJwt(req.body.refresh) + .then(({ token, refreshToken }) => { + // Create JWT + var result = { + username: process.env.ADMIN_USERNAME, + token: token, + refreshToken: refreshToken + }; + res.status(200).send(result); + }, (err) => { + console.error(colors.red(err)); + res.status(301).send(err); // TODO: also catch 500 and so on + }); +}; \ No newline at end of file diff --git a/public/creator/js/controllers/overlay/createController.js b/public/creator/js/controllers/overlay/createController.js index 34c05eb..1962c71 100644 --- a/public/creator/js/controllers/overlay/createController.js +++ b/public/creator/js/controllers/overlay/createController.js @@ -1,7 +1,7 @@ var app = angular.module("ive.upload", ['ngFileUpload']); // Overlay create controller -app.controller("overlayCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService, Upload, $timeout) { +app.controller("overlayCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService, Upload, $timeout) { /************************************************* FUNCTIONS @@ -56,13 +56,42 @@ app.controller("overlayCreateController", function($scope, $rootScope, $routePar } }); + // TODO: this nesting of requests is kind of difficult to read and debug. could be made cleaner file.upload.then(function (response) { $timeout(function () { file.result = response.data; }); - }, function (response) { - if (response.status > 0) - $scope.errorMsg = response.status + ': ' + response.data; + }, (response) => { + if (response.status > 0) { + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + file.upload = Upload.upload({ + url: config.getApiEndpoint() + '/overlays/uploadImage', + method: 'POST', + data: {file: file}, + headers: { + 'Authorization': 'Bearer ' + res.data.token + } + }); + file.upload.then(function (response) { + $timeout(function () { + file.result = response.data; + }); + }, function (response) { + if (response.status > 0) { + $scope.errorMsg = response.status + ': ' + response.data; + } + }, function (evt) { + file.progress = Math.min(100, parseInt(100.0 * + evt.loaded / evt.total)); + }); + }) + } else { + $scope.errorMsg = response.status + ': ' + response.data; + } + } }, function (evt) { file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); diff --git a/public/creator/js/services/authenticationService.js b/public/creator/js/services/authenticationService.js index 0878a29..948f276 100644 --- a/public/creator/js/services/authenticationService.js +++ b/public/creator/js/services/authenticationService.js @@ -26,6 +26,9 @@ app.factory('$authenticationService', function($http, $log, config) { getToken: function(){ if (authenticated_user) return authenticated_user.token }, + getRefreshToken: function(){ + if (authenticated_user) return authenticated_user.refreshToken + }, login: function(data) { // NOTE: we don't handle refreshing the token, so we may store expired tokens.. // but the backend doesnt implement a route to refresh a token yet @@ -36,6 +39,10 @@ app.factory('$authenticationService', function($http, $log, config) { return res.data; }) }, + updateUser: function(data) { + authenticated_user = data; + localStorage.setItem(user_storage_key, JSON.stringify(authenticated_user)); + }, logout: function(){ authenticated_user = null; localStorage.removeItem(user_storage_key); diff --git a/public/creator/js/services/locationService.js b/public/creator/js/services/locationService.js index 423a24c..37b5f2e 100644 --- a/public/creator/js/services/locationService.js +++ b/public/creator/js/services/locationService.js @@ -245,6 +245,7 @@ app.factory('$locationService', function($http, config, $authenticationService) return $http.get(config.getApiEndpoint() + "/locations/" + location_id); }, create: function(data) { + data.refresh = $authenticationService.getRefreshToken(); return $http.post(config.getApiEndpoint() + "/locations", data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -253,6 +254,7 @@ app.factory('$locationService', function($http, config, $authenticationService) }); }, edit: function(location_id, data) { + data.refresh = $authenticationService.getRefreshToken(); return $http.put(config.getApiEndpoint() + "/locations/" + location_id, data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -261,6 +263,7 @@ app.factory('$locationService', function($http, config, $authenticationService) }); }, remove: function(location_id) { + data.refresh = $authenticationService.getRefreshToken(); return $http.delete(config.getApiEndpoint() + "/locations/" + location_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() diff --git a/public/creator/js/services/overlayService.js b/public/creator/js/services/overlayService.js index 10a1e5a..6489412 100644 --- a/public/creator/js/services/overlayService.js +++ b/public/creator/js/services/overlayService.js @@ -244,6 +244,7 @@ app.factory('$overlayService', function($http, config, $authenticationService) { return $http.get(config.getApiEndpoint() + "/overlays/" + overlay_id); }, create: function(data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.post(config.getApiEndpoint() + "/overlays", data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -252,6 +253,7 @@ app.factory('$overlayService', function($http, config, $authenticationService) { }); }, edit: function(overlay_id, data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.put(config.getApiEndpoint() + "/overlays/" + overlay_id, data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -260,6 +262,7 @@ app.factory('$overlayService', function($http, config, $authenticationService) { }); }, remove: function(overlay_id) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/overlays/" + overlay_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() diff --git a/public/creator/js/services/relationshipService.js b/public/creator/js/services/relationshipService.js index f8e3aa0..35bb861 100644 --- a/public/creator/js/services/relationshipService.js +++ b/public/creator/js/services/relationshipService.js @@ -203,6 +203,7 @@ app.factory('$relationshipService', function($http, config, $authenticationServi } }, create: function(relationship_label, data, relationship_type) { + data.body = { refresh: $authenticationService.getRefreshToken() }; if(relationship_type){ return $http.post(config.getApiEndpoint() + "/relationship/" + relationship_label + "/" + relationship_type, data, { headers: { @@ -220,6 +221,7 @@ app.factory('$relationshipService', function($http, config, $authenticationServi } }, edit: function(relationship_label, relationship_id, data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.put(config.getApiEndpoint() + "/relationship/" + relationship_label + "/" + relationship_id, data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -228,6 +230,7 @@ app.factory('$relationshipService', function($http, config, $authenticationServi }); }, remove: function(relationship_id) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/relationships/" + relationship_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() diff --git a/public/creator/js/services/scenarioService.js b/public/creator/js/services/scenarioService.js index 10676b3..a845c1b 100644 --- a/public/creator/js/services/scenarioService.js +++ b/public/creator/js/services/scenarioService.js @@ -114,6 +114,7 @@ app.factory('$scenarioService', function($http, config, $authenticationService) return $http.get(config.getApiEndpoint() + "/scenarios/" + scenario_id); }, create: function(data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.post(config.getApiEndpoint() + "/scenarios", data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), diff --git a/public/creator/js/services/videoService.js b/public/creator/js/services/videoService.js index 32bbc59..cecd9bf 100644 --- a/public/creator/js/services/videoService.js +++ b/public/creator/js/services/videoService.js @@ -225,6 +225,7 @@ app.factory('$videoService', function($http, config, $authenticationService) { return $http.get(config.getApiEndpoint() + "/videos/" + video_id); }, create: function(data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.post(config.getApiEndpoint() + "/videos", data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -233,6 +234,7 @@ app.factory('$videoService', function($http, config, $authenticationService) { }); }, edit: function(video_id, data) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.put(config.getApiEndpoint() + "/videos/" + video_id, data, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken(), @@ -241,6 +243,7 @@ app.factory('$videoService', function($http, config, $authenticationService) { }); }, remove: function(video_id) { + data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/videos/" + video_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() diff --git a/routes/login.js b/routes/login.js index 4158981..d548830 100644 --- a/routes/login.js +++ b/routes/login.js @@ -2,11 +2,12 @@ var express = require('express'); var router = express.Router(); var login = require('../controllers/login'); - +var refreshToken = require('../controllers/refreshToken'); // LOGIN router.post('/login', login.request); +router.post('/refreshToken', refreshToken.request); module.exports = router; diff --git a/server.js b/server.js index 710018d..5488d42 100644 --- a/server.js +++ b/server.js @@ -71,7 +71,11 @@ exports.isAuthenticated = function isAuthenticated(req, res, next) { // Verify token jwt.verify(token, process.env.JWT_SECRET, function(err, decoded) { if(err){ - res.status(401).send("Authentication failed!"); + if(err.name == 'TokenExpiredError') { + res.status(401).send("Token expired!"); + } else { + res.status(401).send("Authentication failed!"); + } } else { // Authorization if(decoded.username === process.env.ADMIN_USERNAME && decoded.iss === process.env.SERVER_URL){ From 372aaa454e1e98c30c51ffa6e63e021bbe6c6464 Mon Sep 17 00:00:00 2001 From: PaulaScharf Date: Sun, 21 Nov 2021 00:02:14 +0100 Subject: [PATCH 2/3] frontend done except relationship crud --- .../controllers/location/createController.js | 21 +++++++- .../controllers/location/deleteController.js | 20 ++++++- .../js/controllers/location/editController.js | 21 +++++++- .../controllers/overlay/createController.js | 51 ++++++++++++++++-- .../controllers/overlay/deleteController.js | 20 ++++++- .../js/controllers/overlay/editController.js | 21 +++++++- .../controllers/scenario/createController.js | 21 +++++++- .../controllers/scenario/deleteController.js | 20 ++++++- .../js/controllers/scenario/editController.js | 21 +++++++- .../js/controllers/video/createController.js | 53 +++++++++++++++++-- .../js/controllers/video/deleteController.js | 20 ++++++- .../js/controllers/video/editController.js | 21 +++++++- public/creator/js/services/locationService.js | 4 +- public/creator/js/services/overlayService.js | 4 +- .../js/services/relationshipService.js | 4 +- public/creator/js/services/scenarioService.js | 3 ++ public/creator/js/services/videoService.js | 4 +- 17 files changed, 298 insertions(+), 31 deletions(-) diff --git a/public/creator/js/controllers/location/createController.js b/public/creator/js/controllers/location/createController.js index f8a132c..b0584f0 100644 --- a/public/creator/js/controllers/location/createController.js +++ b/public/creator/js/controllers/location/createController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Location create controller -app.controller("locationCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { +app.controller("locationCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { /************************************************* FUNCTIONS @@ -39,7 +39,24 @@ app.controller("locationCreateController", function($scope, $rootScope, $routePa $scope.redirect("/locations/" + new_location.location_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $locationService.create($scope.location) + .then(function onSuccess(response) { + var new_location = response.data; + $scope.redirect("/locations/" + new_location.location_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/location/deleteController.js b/public/creator/js/controllers/location/deleteController.js index 7087bf6..4cf669e 100644 --- a/public/creator/js/controllers/location/deleteController.js +++ b/public/creator/js/controllers/location/deleteController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Location delete controller -app.controller("locationDeleteController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { +app.controller("locationDeleteController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { /************************************************* FUNCTIONS @@ -28,7 +28,23 @@ app.controller("locationDeleteController", function($scope, $rootScope, $routePa $scope.redirect("/locations"); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $locationService.remove($scope.location.location_id) + .then(function onSuccess(response) { + $scope.redirect("/locations"); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }; diff --git a/public/creator/js/controllers/location/editController.js b/public/creator/js/controllers/location/editController.js index 8f0c900..1140f06 100644 --- a/public/creator/js/controllers/location/editController.js +++ b/public/creator/js/controllers/location/editController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Location edit controller -app.controller("locationEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { +app.controller("locationEditController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $locationService) { /************************************************* FUNCTIONS @@ -39,7 +39,24 @@ app.controller("locationEditController", function($scope, $rootScope, $routePara $scope.redirect("/locations/" + $scope.location.location_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $locationService.edit($scope.location.location_id, $scope.location) + .then(function onSuccess(response) { + $scope.location = response.data; + $scope.redirect("/locations/" + $scope.location.location_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/overlay/createController.js b/public/creator/js/controllers/overlay/createController.js index 1962c71..33306dd 100644 --- a/public/creator/js/controllers/overlay/createController.js +++ b/public/creator/js/controllers/overlay/createController.js @@ -37,7 +37,24 @@ app.controller("overlayCreateController", function($http, $scope, $rootScope, $r $scope.redirect("/overlays/" + new_overlay.overlay_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $overlayService.create($scope.overlay) + .then(function onSuccess(response) { + var new_overlay = response.data; + $scope.redirect("/overlays/" + new_overlay.overlay_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; @@ -118,8 +135,36 @@ app.controller("overlayCreateController", function($http, $scope, $rootScope, $r file.result = response.data; }); }, function (response) { - if (response.status > 0) - $scope.errorMsg = response.status + ': ' + response.data; + if (response.status > 0) { + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + file.upload = Upload.upload({ + url: config.getApiEndpoint() + '/overlays/uploadImage', + method: 'POST', + data: {file: file}, + headers: { + 'Authorization': 'Bearer ' + res.data.token + } + }); + file.upload.then(function (response) { + $timeout(function () { + file.result = response.data; + }); + }, function (response) { + if (response.status > 0) { + $scope.errorMsg = response.status + ': ' + response.data; + } + }, function (evt) { + file.progress = Math.min(100, parseInt(100.0 * + evt.loaded / evt.total)); + }); + }) + } else { + $scope.errorMsg = response.status + ': ' + response.data; + } + } }, function (evt) { file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); diff --git a/public/creator/js/controllers/overlay/deleteController.js b/public/creator/js/controllers/overlay/deleteController.js index 0ac2bce..a8ed6d8 100644 --- a/public/creator/js/controllers/overlay/deleteController.js +++ b/public/creator/js/controllers/overlay/deleteController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Overlay delete controller -app.controller("overlayDeleteController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService) { +app.controller("overlayDeleteController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService) { /************************************************* FUNCTIONS @@ -28,7 +28,23 @@ app.controller("overlayDeleteController", function($scope, $rootScope, $routePar $scope.redirect("/overlays"); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $overlayService.remove($scope.overlay.overlay_id) + .then(function onSuccess(response) { + $scope.redirect("/overlays"); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }; diff --git a/public/creator/js/controllers/overlay/editController.js b/public/creator/js/controllers/overlay/editController.js index a4a567d..18972e0 100644 --- a/public/creator/js/controllers/overlay/editController.js +++ b/public/creator/js/controllers/overlay/editController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Overlay edit controller -app.controller("overlayEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService) { +app.controller("overlayEditController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $overlayService) { /************************************************* FUNCTIONS @@ -37,7 +37,24 @@ app.controller("overlayEditController", function($scope, $rootScope, $routeParam $scope.redirect("/overlays/" + $scope.overlay.overlay_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $overlayService.edit($scope.overlay.overlay_id, $scope.overlay) + .then(function onSuccess(response) { + $scope.overlay = response.data; + $scope.redirect("/overlays/" + $scope.overlay.overlay_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/scenario/createController.js b/public/creator/js/controllers/scenario/createController.js index 2767c5f..10835b3 100644 --- a/public/creator/js/controllers/scenario/createController.js +++ b/public/creator/js/controllers/scenario/createController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Scenario create controller -app.controller("scenarioCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { +app.controller("scenarioCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { /************************************************* FUNCTIONS @@ -35,7 +35,24 @@ app.controller("scenarioCreateController", function($scope, $rootScope, $routePa $scope.redirect("/scenarios/" + new_scenario.scenario_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $scenarioService.create($scope.scenario) + .then(function onSuccess(response) { + var new_scenario = response.data; + $scope.redirect("/scenarios/" + new_scenario.scenario_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/scenario/deleteController.js b/public/creator/js/controllers/scenario/deleteController.js index 33841e2..68686c1 100644 --- a/public/creator/js/controllers/scenario/deleteController.js +++ b/public/creator/js/controllers/scenario/deleteController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Scenario delete controller -app.controller("scenarioDeleteController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { +app.controller("scenarioDeleteController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { /************************************************* FUNCTIONS @@ -28,7 +28,23 @@ app.controller("scenarioDeleteController", function($scope, $rootScope, $routePa $scope.redirect("/scenarios"); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $scenarioService.remove($scope.scenario.scenario_id) + .then(function onSuccess(response) { + $scope.redirect("/scenarios"); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }; diff --git a/public/creator/js/controllers/scenario/editController.js b/public/creator/js/controllers/scenario/editController.js index fdaf4ae..d7f4a6b 100644 --- a/public/creator/js/controllers/scenario/editController.js +++ b/public/creator/js/controllers/scenario/editController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Scenario edit controller -app.controller("scenarioEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { +app.controller("scenarioEditController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $scenarioService) { /************************************************* FUNCTIONS @@ -35,7 +35,24 @@ app.controller("scenarioEditController", function($scope, $rootScope, $routePara $scope.redirect("/scenarios/" + $scope.scenario.scenario_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $scenarioService.edit($scope.scenario.scenario_id, $scope.scenario) + .then(function onSuccess(response) { + $scope.scenario = response.data; + $scope.redirect("/scenarios/" + $scope.scenario.scenario_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/video/createController.js b/public/creator/js/controllers/video/createController.js index 7374641..25826f0 100644 --- a/public/creator/js/controllers/video/createController.js +++ b/public/creator/js/controllers/video/createController.js @@ -1,7 +1,7 @@ var app = angular.module("ive.upload.video", ['ngFileUpload']); // Video create controller -app.controller("videoCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService, Upload, $timeout) { +app.controller("videoCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService, Upload, $timeout) { /************************************************* FUNCTIONS @@ -40,7 +40,24 @@ app.controller("videoCreateController", function($scope, $rootScope, $routeParam $scope.redirect("/videos/" + $scope.video.video_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $videoService.create($scope.video) + .then(function onSuccess(response) { + $scope.video = response.data; + $scope.redirect("/videos/" + $scope.video.video_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; @@ -65,8 +82,36 @@ app.controller("videoCreateController", function($scope, $rootScope, $routeParam file.result = response.data; }); }, function (response) { - if (response.status > 0) - $scope.errorMsg = response.status + ': ' + response.data; + if (response.status > 0) { + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + file.upload = Upload.upload({ + url: config.getApiEndpoint() + '/videos/uploadVideo/' + folderUrl, + method: 'POST', + data: {file: file}, + headers: { + 'Authorization': 'Bearer ' + $authenticationService.getToken() + } + }); + file.upload.then(function (response) { + $timeout(function () { + file.result = response.data; + }); + }, function (response) { + if (response.status > 0) { + $scope.errorMsg = response.status + ': ' + response.data; + } + }, function (evt) { + file.progress = Math.min(100, parseInt(100.0 * + evt.loaded / evt.total)); + }); + }) + } else { + $scope.errorMsg = response.status + ': ' + response.data; + } + } }, function (evt) { file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); diff --git a/public/creator/js/controllers/video/deleteController.js b/public/creator/js/controllers/video/deleteController.js index 827e843..b4e981c 100644 --- a/public/creator/js/controllers/video/deleteController.js +++ b/public/creator/js/controllers/video/deleteController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Video delete controller -app.controller("videoDeleteController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService) { +app.controller("videoDeleteController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService) { /************************************************* FUNCTIONS @@ -28,7 +28,23 @@ app.controller("videoDeleteController", function($scope, $rootScope, $routeParam $scope.redirect("/videos"); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $videoService.remove($scope.video.video_id) + .then(function onSuccess(response) { + $scope.redirect("/videos"); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }; diff --git a/public/creator/js/controllers/video/editController.js b/public/creator/js/controllers/video/editController.js index 36ba811..c3d3c15 100644 --- a/public/creator/js/controllers/video/editController.js +++ b/public/creator/js/controllers/video/editController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Video edit controller -app.controller("videoEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService) { +app.controller("videoEditController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $videoService) { /************************************************* FUNCTIONS @@ -38,7 +38,24 @@ app.controller("videoEditController", function($scope, $rootScope, $routeParams, $scope.redirect("/videos/" + $scope.video.video_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $videoService.edit($scope.video.video_id, $scope.video) + .then(function onSuccess(response) { + $scope.video = response.data; + $scope.redirect("/videos/" + $scope.video.video_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/services/locationService.js b/public/creator/js/services/locationService.js index 37b5f2e..a4eb081 100644 --- a/public/creator/js/services/locationService.js +++ b/public/creator/js/services/locationService.js @@ -263,10 +263,12 @@ app.factory('$locationService', function($http, config, $authenticationService) }); }, remove: function(location_id) { - data.refresh = $authenticationService.getRefreshToken(); return $http.delete(config.getApiEndpoint() + "/locations/" + location_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() + }, + body: { + refresh: $authenticationService.getRefreshToken() } }); } diff --git a/public/creator/js/services/overlayService.js b/public/creator/js/services/overlayService.js index 6489412..72c8ef5 100644 --- a/public/creator/js/services/overlayService.js +++ b/public/creator/js/services/overlayService.js @@ -262,10 +262,12 @@ app.factory('$overlayService', function($http, config, $authenticationService) { }); }, remove: function(overlay_id) { - data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/overlays/" + overlay_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() + }, + body: { + refresh: $authenticationService.getRefreshToken() } }); } diff --git a/public/creator/js/services/relationshipService.js b/public/creator/js/services/relationshipService.js index 35bb861..424f87f 100644 --- a/public/creator/js/services/relationshipService.js +++ b/public/creator/js/services/relationshipService.js @@ -230,10 +230,12 @@ app.factory('$relationshipService', function($http, config, $authenticationServi }); }, remove: function(relationship_id) { - data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/relationships/" + relationship_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() + }, + body: { + refresh: $authenticationService.getRefreshToken() } }); } diff --git a/public/creator/js/services/scenarioService.js b/public/creator/js/services/scenarioService.js index a845c1b..5a18d17 100644 --- a/public/creator/js/services/scenarioService.js +++ b/public/creator/js/services/scenarioService.js @@ -134,6 +134,9 @@ app.factory('$scenarioService', function($http, config, $authenticationService) return $http.delete(config.getApiEndpoint() + "/scenarios/" + scenario_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() + }, + body: { + refresh: $authenticationService.getRefreshToken() } }); } diff --git a/public/creator/js/services/videoService.js b/public/creator/js/services/videoService.js index cecd9bf..4a34f2c 100644 --- a/public/creator/js/services/videoService.js +++ b/public/creator/js/services/videoService.js @@ -243,10 +243,12 @@ app.factory('$videoService', function($http, config, $authenticationService) { }); }, remove: function(video_id) { - data.body = { refresh: $authenticationService.getRefreshToken() }; return $http.delete(config.getApiEndpoint() + "/videos/" + video_id, { headers: { 'Authorization': 'Bearer ' + $authenticationService.getToken() + }, + body: { + refresh: $authenticationService.getRefreshToken() } }); } From c9e08c395548841b8675c3f49e3716951ea16300 Mon Sep 17 00:00:00 2001 From: PaulaScharf Date: Sun, 21 Nov 2021 22:08:28 +0100 Subject: [PATCH 3/3] refreshTokens for relationship crud --- .../create/belongsToController.js | 21 ++++++++++++-- .../create/connectedToController.js | 21 ++++++++++++-- .../create/embeddedInController.js | 29 +++++++++++++++++-- .../create/hasParentLocationController.js | 21 ++++++++++++-- .../create/recordedAtController.js | 21 ++++++++++++-- .../relationship/deleteController.js | 20 +++++++++++-- .../relationship/edit/embeddedInController.js | 21 ++++++++++++-- .../edit/embeddedInPreviewController.js | 24 +++++++++++++-- .../relationship/edit/recordedAtController.js | 21 ++++++++++++-- 9 files changed, 181 insertions(+), 18 deletions(-) diff --git a/public/creator/js/controllers/relationship/create/belongsToController.js b/public/creator/js/controllers/relationship/create/belongsToController.js index 9684a43..81b51d3 100644 --- a/public/creator/js/controllers/relationship/create/belongsToController.js +++ b/public/creator/js/controllers/relationship/create/belongsToController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship belongs_to create controller -app.controller("belongsToCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService, $videoService, $overlayService) { +app.controller("belongsToCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService, $videoService, $overlayService) { /************************************************* FUNCTIONS @@ -34,7 +34,24 @@ app.controller("belongsToCreateController", function($scope, $rootScope, $routeP $scope.redirect("/relationships/belongs_to/" + $scope.relationship.relationship_id + "/" + $scope.label); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.create('belongs_to', $scope.relationship, $scope.label) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/belongs_to/" + $scope.relationship.relationship_id + "/" + $scope.label); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/create/connectedToController.js b/public/creator/js/controllers/relationship/create/connectedToController.js index f2077b7..3fe3c6d 100644 --- a/public/creator/js/controllers/relationship/create/connectedToController.js +++ b/public/creator/js/controllers/relationship/create/connectedToController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship connected_to create controller -app.controller("connectedToCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService) { +app.controller("connectedToCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService) { /************************************************* FUNCTIONS @@ -35,7 +35,24 @@ app.controller("connectedToCreateController", function($scope, $rootScope, $rout $scope.redirect("/relationships/connected_to/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.create('connected_to', $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/connected_to/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/create/embeddedInController.js b/public/creator/js/controllers/relationship/create/embeddedInController.js index 5019c1c..047d29c 100644 --- a/public/creator/js/controllers/relationship/create/embeddedInController.js +++ b/public/creator/js/controllers/relationship/create/embeddedInController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship embedded_in create controller -app.controller("embeddedInCreateController", function($scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $videoService, $overlayService, _) { +app.controller("embeddedInCreateController", function($http, $scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $videoService, $overlayService, _) { /************************************************* FUNCTIONS @@ -58,7 +58,32 @@ app.controller("embeddedInCreateController", function($scope, $rootScope, $route }); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.create('embedded_in', $scope.relationship) + .then(function onSuccess(response) { + + // Saving the BelongsTo relationship + $relationshipService.create('belongs_to', $scope.relationshipBelongsTo, 'overlay') + .then(function onSuccess(responseBelongsTo) { + $scope.relationship = response.data; + $scope.redirect("/relationships/embedded_in/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + $window.alert(response.data); + }); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/create/hasParentLocationController.js b/public/creator/js/controllers/relationship/create/hasParentLocationController.js index bfb0f62..a07bb2f 100644 --- a/public/creator/js/controllers/relationship/create/hasParentLocationController.js +++ b/public/creator/js/controllers/relationship/create/hasParentLocationController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship has_parent_location create controller -app.controller("hasParentLocationCreateController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService) { +app.controller("hasParentLocationCreateController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService) { /************************************************* FUNCTIONS @@ -35,7 +35,24 @@ app.controller("hasParentLocationCreateController", function($scope, $rootScope, $scope.redirect("/relationships/has_parent_location/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.create('has_parent_location', $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/has_parent_location/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/create/recordedAtController.js b/public/creator/js/controllers/relationship/create/recordedAtController.js index f6063d3..667cbd7 100644 --- a/public/creator/js/controllers/relationship/create/recordedAtController.js +++ b/public/creator/js/controllers/relationship/create/recordedAtController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship recorded_at create controller -app.controller("recordedAtCreateController", function($scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService, $videoService, _) { +app.controller("recordedAtCreateController", function($http, $scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService, $scenarioService, $locationService, $videoService, _) { /************************************************* FUNCTIONS @@ -34,7 +34,24 @@ app.controller("recordedAtCreateController", function($scope, $rootScope, $route $scope.redirect("/relationships/recorded_at/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.create('recorded_at', $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/recorded_at/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/deleteController.js b/public/creator/js/controllers/relationship/deleteController.js index c19032f..5e201dc 100644 --- a/public/creator/js/controllers/relationship/deleteController.js +++ b/public/creator/js/controllers/relationship/deleteController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship delete controller -app.controller("relationshipDeleteController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $relationshipService, $locationService) { +app.controller("relationshipDeleteController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $relationshipService, $locationService) { /************************************************* FUNCTIONS @@ -28,7 +28,23 @@ app.controller("relationshipDeleteController", function($scope, $rootScope, $rou $scope.redirect("/relationships/" + $scope.relationship_label); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.remove($scope.relationship.relationship_id) + .then(function onSuccess(response) { + $scope.redirect("/relationships/" + $scope.relationship_label); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }; diff --git a/public/creator/js/controllers/relationship/edit/embeddedInController.js b/public/creator/js/controllers/relationship/edit/embeddedInController.js index b3e8ce8..4174bbf 100644 --- a/public/creator/js/controllers/relationship/edit/embeddedInController.js +++ b/public/creator/js/controllers/relationship/edit/embeddedInController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship embedded_in edit controller -app.controller("embeddedInEditController", function($scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService) { +app.controller("embeddedInEditController", function($http, $scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService) { /************************************************* FUNCTIONS @@ -46,7 +46,24 @@ app.controller("embeddedInEditController", function($scope, $rootScope, $routePa $scope.redirect("/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.edit($scope.relationship_label, $scope.relationship.relationship_id, $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } }; diff --git a/public/creator/js/controllers/relationship/edit/embeddedInPreviewController.js b/public/creator/js/controllers/relationship/edit/embeddedInPreviewController.js index b81880a..73a2182 100644 --- a/public/creator/js/controllers/relationship/edit/embeddedInPreviewController.js +++ b/public/creator/js/controllers/relationship/edit/embeddedInPreviewController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship embedded_in edit in preview mode controller -app.controller("embeddedInEditPreviewController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $sce, $authenticationService, $relationshipService, $videoService, $q, $socket) { +app.controller("embeddedInEditPreviewController", function($http, $scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $sce, $authenticationService, $relationshipService, $videoService, $q, $socket) { /************************************************* FUNCTIONS @@ -73,7 +73,27 @@ app.controller("embeddedInEditPreviewController", function($scope, $rootScope, $ $scope.redirect("/edit/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.edit($scope.relationship_label, $scope.relationship.relationship_id, $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $socket.emit('/change/saveValues', { + relationship_id: $scope.relationship.relationship_id + }); + $scope.redirect("/edit/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); }) }) diff --git a/public/creator/js/controllers/relationship/edit/recordedAtController.js b/public/creator/js/controllers/relationship/edit/recordedAtController.js index 8308ca1..11549bd 100644 --- a/public/creator/js/controllers/relationship/edit/recordedAtController.js +++ b/public/creator/js/controllers/relationship/edit/recordedAtController.js @@ -1,7 +1,7 @@ var app = angular.module("ive"); // Relationship recorded_at edit controller -app.controller("recordedAtEditController", function($scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService) { +app.controller("recordedAtEditController", function($http, $scope, $rootScope, $routeParams, $interval, $filter, $translate, $location, config, $window, $authenticationService, $relationshipService) { /************************************************* FUNCTIONS @@ -34,7 +34,24 @@ app.controller("recordedAtEditController", function($scope, $rootScope, $routePa $scope.redirect("/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); }) .catch(function onError(response) { - $window.alert(response.data); + if (response.data == "Token expired!") { + $http.post(config.getApiEndpoint() + "/refreshToken", { refresh: $authenticationService.getRefreshToken() }) + .then(res => { + $authenticationService.updateUser(res.data); + $relationshipService.edit($scope.relationship_label, $scope.relationship.relationship_id, $scope.relationship) + .then(function onSuccess(response) { + $scope.relationship = response.data; + $scope.redirect("/relationships/" + $scope.relationship_label + "/" + $scope.relationship.relationship_id); + }) + .catch(function onError(response) { + if (response.status > 0) { + $window.alert(response.data); + } + }); + }) + } else { + $window.alert(response.data); + } }); } };