From 654d3fc3977afcfd4a03257f53b9fa5c94a71a59 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 28 Sep 2021 16:05:21 +0200 Subject: [PATCH] system configuration page: read-only mode, title, homepage message --- ...erController.java => AdminController.java} | 29 ++++++- .../controller/HomeController.java | 10 +++ .../model/SystemConfiguration.java | 75 +++++++++++++++++++ .../SystemConfigurationRepository.java | 9 +++ .../src/main/resources/sql/schema.sql | 9 +++ .../resources/html/pages/admin/sysConf.html | 32 ++++++++ .../resources/html/pages/admin/users.html | 2 +- .../static/resources/js/organizations.js | 17 ++++- .../templates/alreadyRegistered.html | 4 +- .../templates/authorizationRequest.html | 5 +- .../src/main/resources/templates/home.html | 9 ++- .../src/main/resources/templates/login.html | 9 ++- .../src/main/resources/templates/main.html | 44 ++++++++++- 13 files changed, 234 insertions(+), 20 deletions(-) rename apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/{UserController.java => AdminController.java} (71%) create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/SystemConfiguration.java create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/SystemConfigurationRepository.java create mode 100644 apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/sysConf.html diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java similarity index 71% rename from apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserController.java rename to apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java index 144e1c9b..b614dde6 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java @@ -17,14 +17,16 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.common.controller.AbstractDnetController; +import eu.dnetlib.organizations.model.SystemConfiguration; import eu.dnetlib.organizations.model.utils.VocabularyTerm; import eu.dnetlib.organizations.model.view.UserView; +import eu.dnetlib.organizations.repository.SystemConfigurationRepository; import eu.dnetlib.organizations.repository.UserRepository; import eu.dnetlib.organizations.repository.readonly.UserViewRepository; import eu.dnetlib.organizations.utils.DatabaseUtils; @RestController -public class UserController extends AbstractDnetController { +public class AdminController extends AbstractDnetController { @Autowired private UserRepository userRepository; @@ -32,6 +34,9 @@ public class UserController extends AbstractDnetController { @Autowired private UserViewRepository userViewRepository; + @Autowired + private SystemConfigurationRepository systemConfigurationRepository; + @Autowired private DatabaseUtils dbUtils; @@ -76,17 +81,35 @@ public class UserController extends AbstractDnetController { } @PostMapping("/api/users") - public Iterable save(@RequestBody final UserView userView, final Authentication authentication) { + public Iterable saveUser(@RequestBody final UserView userView, final Authentication authentication) { if (UserInfo.getEmail(authentication).equals(userView.getEmail())) { throw new RuntimeException("You can't edit your own user"); } dbUtils.saveUser(userView); return users(authentication); } @DeleteMapping("/api/users") - public Iterable delete(final @RequestParam String email, final Authentication authentication) { + public Iterable deleteUser(final @RequestParam String email, final Authentication authentication) { if (UserInfo.getEmail(authentication).equals(email)) { throw new RuntimeException("You can't delete your own user"); } dbUtils.deleteUser(email); return users(authentication); } + @GetMapping("/api/sysconf") + public SystemConfiguration sysConf(final Authentication authentication) { + if (UserInfo.isSuperAdmin(authentication)) { + return systemConfigurationRepository.findById(SystemConfiguration.DEFAULT_ID).get(); + } else { + throw new RuntimeException("User not authorized"); + } + } + + @PostMapping("/api/sysconf") + public SystemConfiguration saveSysConf(@RequestBody final SystemConfiguration sysConf, final Authentication authentication) { + if (UserInfo.isSuperAdmin(authentication)) { + sysConf.setId(SystemConfiguration.DEFAULT_ID); + return systemConfigurationRepository.save(sysConf); + } else { + throw new RuntimeException("User not authorized"); + } + } } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java index 3a48ac03..dd3e9b59 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java @@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import eu.dnetlib.common.controller.AbstractDnetController; +import eu.dnetlib.organizations.model.SystemConfiguration; +import eu.dnetlib.organizations.repository.SystemConfigurationRepository; @Controller public class HomeController extends AbstractDnetController { @@ -16,6 +18,9 @@ public class HomeController extends AbstractDnetController { @Autowired private Environment env; + @Autowired + private SystemConfigurationRepository systemConfigurationRepository; + @GetMapping("/") public String home() { return env.acceptsProfiles(Profiles.of("dev")) ? "redirect:main" : "home"; @@ -46,6 +51,11 @@ public class HomeController extends AbstractDnetController { return authentication != null ? UserInfo.getEmail(authentication) : null; } + @ModelAttribute("sysconf") + public SystemConfiguration getSysConf(final Authentication authentication) { + return systemConfigurationRepository.findById(SystemConfiguration.DEFAULT_ID).get(); + } + @GetMapping({ "/doc", "/swagger" }) diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/SystemConfiguration.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/SystemConfiguration.java new file mode 100644 index 00000000..a662ea17 --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/SystemConfiguration.java @@ -0,0 +1,75 @@ +package eu.dnetlib.organizations.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "sysconf") +public class SystemConfiguration implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7935575713678578023L; + + public static final String DEFAULT_ID = "default"; + + @Id + @Column(name = "id") + private String id; + + @Column(name = "title") + private String title; + + @Column(name = "homepage_msg") + private String homepageMessage; + + @Column(name = "readonly") + private Boolean readonly; + + public SystemConfiguration() {} + + public SystemConfiguration(final String id, final String title, final String homepageMessage, final Boolean readonly) { + this.id = id; + this.title = title; + this.homepageMessage = homepageMessage; + this.readonly = readonly; + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(final String title) { + this.title = title; + } + + public String getHomepageMessage() { + return homepageMessage; + } + + public void setHomepageMessage(final String homepageMessage) { + this.homepageMessage = homepageMessage; + } + + public Boolean getReadonly() { + return readonly; + } + + public void setReadonly(final Boolean readonly) { + this.readonly = readonly; + } + +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/SystemConfigurationRepository.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/SystemConfigurationRepository.java new file mode 100644 index 00000000..606018eb --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/SystemConfigurationRepository.java @@ -0,0 +1,9 @@ +package eu.dnetlib.organizations.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import eu.dnetlib.organizations.model.SystemConfiguration; + +public interface SystemConfigurationRepository extends JpaRepository { + +} diff --git a/apps/dnet-orgs-database-application/src/main/resources/sql/schema.sql b/apps/dnet-orgs-database-application/src/main/resources/sql/schema.sql index 76ec98fd..71a6c959 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/sql/schema.sql +++ b/apps/dnet-orgs-database-application/src/main/resources/sql/schema.sql @@ -6,6 +6,7 @@ DROP VIEW IF EXISTS conflict_groups_view; DROP VIEW IF EXISTS suggestions_info_by_country_view; DROP VIEW IF EXISTS duplicate_groups_view; +DROP TABLE IF EXISTS sysconf; DROP TABLE IF EXISTS other_ids; DROP TABLE IF EXISTS other_names; DROP TABLE IF EXISTS acronyms; @@ -26,6 +27,14 @@ DROP TABLE IF EXISTS languages; DROP SEQUENCE IF EXISTS organizations_id_seq; +CREATE TABLE sysconf ( + id text PRIMARY KEY DEFAULT 'default', + title text NOT NULL DEFAULT 'OpenOrgs Database', + homepage_msg text NOT NULL DEFAULT '', + readonly boolean NOT NULL DEFAULT false +); +INSERT INTO sysconf(id) VALUES ('default'); + CREATE TABLE org_types (val text PRIMARY KEY, name text); INSERT INTO org_types(val) VALUES ('Archive'), ('Company'), ('Education'), ('Facility'), ('Government'), ('Healthcare'), ('Nonprofit'), ('Other'), ('UNKNOWN'); UPDATE org_types SET name = val; diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/sysConf.html b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/sysConf.html new file mode 100644 index 00000000..c29e0293 --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/sysConf.html @@ -0,0 +1,32 @@ +

System configuration

+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/users.html b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/users.html index 23b75f51..af693259 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/users.html +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/users.html @@ -95,7 +95,7 @@
Countries
- +
diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js b/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js index 612fbe86..d3762a29 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js @@ -380,6 +380,7 @@ orgsModule.config(function($routeProvider) { .when('/duplicates/:country', { templateUrl: 'resources/html/pages/advanced/duplicates.html', controller: 'duplicatesCtrl' }) .when('/conflicts/:country', { templateUrl: 'resources/html/pages/advanced/conflicts.html', controller: 'conflictsCtrl' }) .when('/users', { templateUrl: 'resources/html/pages/admin/users.html', controller: 'usersCtrl' }) + .when('/sysconf', { templateUrl: 'resources/html/pages/admin/sysConf.html', controller: 'sysConfCtrl' }) .otherwise({ redirectTo: '/search' }); }); @@ -778,7 +779,21 @@ orgsModule.controller('conflictsCtrl', function ($scope, $http, $routeParams, $l $scope.refresh(); }); - +orgsModule.controller('sysConfCtrl', function ($scope, $http, $timeout, $route) { + $scope.sysconf = {}; + + call_http_get($http, 'api/sysconf', function(res) { $scope.sysconf = res.data; }); + + $scope.saveConf = function() { + // I use force_http_post because call_http_post could be disabled if the system is in readonly mode + force_http_post($http, 'api/sysconf', $scope.sysconf, function(res) { + $scope.sysconf = res.data; + alert("Configuration saved !"); + window.location.reload(); + }); + } + +}); orgsModule.controller('usersCtrl', function ($scope, $http, $timeout, $route, vocabulariesService) { $scope.users = []; diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/alreadyRegistered.html b/apps/dnet-orgs-database-application/src/main/resources/templates/alreadyRegistered.html index 6a3d0192..75e06c0c 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/alreadyRegistered.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/alreadyRegistered.html @@ -13,7 +13,7 @@ - Organizations Database: user already registered + @@ -21,7 +21,7 @@
diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html b/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html index bb37e50d..88ed5491 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html @@ -13,7 +13,7 @@ - Organizations Database: authorization request + @@ -21,8 +21,7 @@
diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/home.html b/apps/dnet-orgs-database-application/src/main/resources/templates/home.html index fb1c691d..39783e3b 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/home.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/home.html @@ -15,7 +15,7 @@ -Organizations Database: Login + @@ -23,8 +23,7 @@ @@ -41,6 +40,10 @@
diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/login.html b/apps/dnet-orgs-database-application/src/main/resources/templates/login.html index 8e04c60f..b2e3c6a4 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/login.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/login.html @@ -15,7 +15,7 @@ -Organizations Database: Login + @@ -23,8 +23,7 @@ @@ -40,6 +39,10 @@
+
+ +
+
Invalid username and password.
diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/main.html b/apps/dnet-orgs-database-application/src/main/resources/templates/main.html index 9f7c6b72..c693aac8 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/main.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/main.html @@ -45,7 +45,7 @@ fieldset > legend { font-size : 1.2rem !important; } -Organizations Database + @@ -57,8 +57,8 @@ fieldset > legend { font-size : 1.2rem !important; }
+ +
The portal is running in READ-ONLY mode.
+
@@ -192,7 +197,7 @@ fieldset > legend { font-size : 1.2rem !important; } spinnerTarget.style.visibility = 'hidden'; spinner.stop(); } - + function call_http_get($http, url, onSuccess) { showSpinner(); @@ -208,7 +213,38 @@ fieldset > legend { font-size : 1.2rem !important; } alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')'); }); } + + function force_http_post($http, url, obj, onSuccess) { + showSpinner(); + $http.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"; + $http.post(url, obj).then(function successCallback(res) { + hideSpinner(); + if ((typeof res.data) == 'string') { + alert("Session expired !"); location.reload(true); + } else { + onSuccess(res); + } + }, function errorCallback(res) { + hideSpinner(); + alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')'); + }); + } + + + + + + +