From 2ea17d875b14a8c9cfaeedaa0005a35926918860 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 28 May 2018 11:18:47 +0200 Subject: [PATCH] there is requirement to agree to terms of use --- frontend-js/src/main/js/ServerConnector.js | 11 +++++ frontend-js/src/main/js/map/data/User.js | 9 ++++ frontend-js/src/main/js/minerva.js | 44 +++++++++++++++++++ .../mapviewer/api/users/UserController.java | 12 +++++ .../mapviewer/api/users/UserRestImpl.java | 17 ++++++- 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index f75bd1ded4..5b9ab60c62 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -652,6 +652,17 @@ ServerConnector.getModels = function (projectId) { return models; }); }; + +/** + * TODO REMOVE when API v12 appears (this is just a workaround) + */ +ServerConnector.updateTermsOfUse = function (user, value) { + var self = this; + var url = ServerConnector.getUserUrl({login:user.getLogin()}); + url += "/updateTermsOfUse?value=" + value; + return self.readFile(url); +}; + ServerConnector.getProject = function (projectId) { var queryParams = {}; var filterParams = {}; diff --git a/frontend-js/src/main/js/map/data/User.js b/frontend-js/src/main/js/map/data/User.js index cd41f7d7f9..2828e4175e 100644 --- a/frontend-js/src/main/js/map/data/User.js +++ b/frontend-js/src/main/js/map/data/User.js @@ -14,6 +14,7 @@ function User(javaObject) { this.setMinColor(javaObject.minColor); this.setMaxColor(javaObject.maxColor); this.setSimpleColor(javaObject.simpleColor); + this.setTermsOfUseConsent(javaObject.termsOfUseConsent); } User.prototype.setLogin = function(login) { @@ -88,4 +89,12 @@ User.prototype.getPrivileges = function() { return this._privileges; }; +User.prototype.setTermsOfUseConsent = function(termsOfUseConsent) { + this._termsOfUseConsent = termsOfUseConsent; +}; + +User.prototype.isTermsOfUseConsent = function() { + return this._termsOfUseConsent; +}; + module.exports = User; diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index 5d8ba60ef5..f7b57d5a12 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -57,6 +57,45 @@ function processUrlGetParams(params) { } +function requestConsent(user, termsOfUseUrl) { + var dialog = document.createElement("div"); + var dialogContent = document.createElement("div"); + dialogContent.appendChild(functions.createElement({ + type: "span", + content: "I agree to the minerva <a href='" + termsOfUseUrl + "' target='_blank'>Terms of Use</a>." + })); + var checkbox = functions.createElement({type: "input", inputType: "checkbox", style: "float: left"}); + var okButton = functions.createElement({ + type: "button", + content: "OK", + className: "ui-button ui-corner-all ui-widget", + onclick: function () { + return ServerConnector.updateTermsOfUse(user, $(checkbox).is(':checked')).then(function () { + $(dialog).dialog("close"); + }).catch(GuiConnector.alert); + } + }); + $(okButton).prop("disabled", true); + $(checkbox).change(function () { + $(okButton).prop("disabled", !$(checkbox).is(':checked')); + }); + dialogContent.appendChild(checkbox); + dialogContent.appendChild(okButton); + + dialog.appendChild(dialogContent); + document.body.appendChild(dialog); + $(dialog).dialog({ + classes: { + "ui-dialog": "ui-state-error" + }, + modal: true, + closeOnEscape: false, + title: "Terms of Use" + }).siblings('.ui-dialog-titlebar').css("background", "red"); + $(".ui-dialog-titlebar-close", $(dialog).dialog().siblings('.ui-dialog-titlebar')).hide(); + $(dialog).dialog("open"); +} + function insertGoogleAnalyticsCode() { return ServerConnector.getConfigurationParam(ConfigurationType.GOOGLE_ANALYTICS_IDENTIFIER).then( function (identifier) { @@ -553,9 +592,14 @@ function create(params) { return customMap.openSubmap(submapId); } }).then(function () { + return ServerConnector.getLoggedUser(); + }).then(function (user) { if (leftPanel.isGoogleLicenseConsentRequired()) { GuiConnector.alert("Some data overlays doesn't have consent to the terms of the <a href='https://cloud.google.com/maps-platform/terms/' target='_blank'>license of Google Maps Platform</a>. To be able to visualize them you must edit data overlay. ") } + if (user.getLogin() !== "anonymous" && !user.isTermsOfUseConsent()) { + requestConsent(user); + } var result = createResult(customMap); if (params.isDebug()) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java index ac97009a28..023ba7de7e 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserController.java @@ -91,6 +91,18 @@ public class UserController extends BaseController { result.put("status", "OK"); return result; } + + /** + * TODO remove when API 12 will be released!!! + */ + @RequestMapping(value = "/users/{login:.+}/updateTermsOfUse", method = { RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> updateTermsOfUse(@CookieValue(value = Configuration.AUTH_TOKEN) String token, + @PathVariable(value = "login") String login, // + @RequestParam(value = "value") String value, // + HttpServletResponse response // + ) throws SecurityException, ObjectNotFoundException { + return userRest.updateTermsOfUse(token, login, value); + } /** * @return the userService diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java index d5194da508..bf94bdf6be 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java @@ -111,7 +111,7 @@ public class UserRestImpl { value = user.getSimpleColor(); } else if (column.equals("removed")) { value = user.isRemoved(); - } else if (column.equals("termsOfUseConsent")) { + } else if (column.equals("termsofuseconsent")) { value = user.isTermsOfUseConsent(); } else if (column.equals("privileges") && admin) { value = preparePrivileges(user); @@ -175,4 +175,19 @@ public class UserRestImpl { this.layoutService = layoutService; } + public Map<String, Object> updateTermsOfUse(String token, String login, String value) throws SecurityException, ObjectNotFoundException { + User ownUserData = userService.getUserByToken(token); + if (ownUserData == null || ownUserData.getLogin().equals("anonymous")) { + throw new ObjectNotFoundException("User doesn't exist"); + } + if (!ownUserData.getLogin().equals(login)) { + throw new SecurityException("Access denied"); + } + ownUserData.setTermsOfUseConsent(value.equalsIgnoreCase("true")); + userService.updateUser(ownUserData); + Set<String> columnSet = createUserColumnSet(""); + + return prepareUse(ownUserData, columnSet, true); + } + } -- GitLab