From 75d002c8ba90fdcf54d4b3154de29761e88793b6 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 23 Sep 2022 14:55:25 +0200 Subject: [PATCH] form to add persintent organizations --- .../controller/AdminController.java | 28 ++++++++ .../model/PersistentOrganization.java | 34 +++++++++ .../view/PersistentOrganizationView.java | 72 +++++++++++++++++++ .../PersistentOrganizationRepository.java | 11 +++ .../PersistentOrganizationViewRepository.java | 10 +++ .../src/main/resources/sql/schema.sql | 18 +++++ .../html/pages/admin/persistentOrgs.html | 47 ++++++++++++ .../static/resources/js/organizations.js | 21 ++++++ .../src/main/resources/templates/main.html | 2 + 9 files changed, 243 insertions(+) create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/PersistentOrganization.java create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/view/PersistentOrganizationView.java create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/PersistentOrganizationRepository.java create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/readonly/PersistentOrganizationViewRepository.java create mode 100644 apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/persistentOrgs.html diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java index 0e835d19..33635269 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java @@ -20,11 +20,15 @@ import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.organizations.importer.ImportExecution; import eu.dnetlib.organizations.importer.ImportExecutor; +import eu.dnetlib.organizations.model.PersistentOrganization; import eu.dnetlib.organizations.model.SystemConfiguration; import eu.dnetlib.organizations.model.utils.VocabularyTerm; +import eu.dnetlib.organizations.model.view.PersistentOrganizationView; import eu.dnetlib.organizations.model.view.UserView; +import eu.dnetlib.organizations.repository.PersistentOrganizationRepository; import eu.dnetlib.organizations.repository.SystemConfigurationRepository; import eu.dnetlib.organizations.repository.UserRepository; +import eu.dnetlib.organizations.repository.readonly.PersistentOrganizationViewRepository; import eu.dnetlib.organizations.repository.readonly.UserViewRepository; import eu.dnetlib.organizations.utils.DatabaseUtils; import eu.dnetlib.organizations.utils.MailDispatcher; @@ -38,6 +42,12 @@ public class AdminController extends AbstractDnetController { @Autowired private UserViewRepository userViewRepository; + @Autowired + private PersistentOrganizationRepository persistentOrganizationRepository; + + @Autowired + private PersistentOrganizationViewRepository persistentOrganizationViewRepository; + @Autowired private SystemConfigurationRepository systemConfigurationRepository; @@ -202,4 +212,22 @@ public class AdminController extends AbstractDnetController { throw new RuntimeException("User not authorized"); } } + + @GetMapping("/api/persistentOrgs") + public Iterable listPersistentOrgs() { + return persistentOrganizationViewRepository.findAll(); + } + + @PostMapping("/api/persistentOrgs") + public Iterable addPersistentOrgs(@RequestBody final List ids) { + ids.forEach(id -> persistentOrganizationRepository.save(new PersistentOrganization(id))); + return persistentOrganizationViewRepository.findAll(); + } + + @DeleteMapping("/api/persistentOrgs") + public Iterable deletePersistentOrgs(@RequestParam final String id) { + persistentOrganizationRepository.deleteById(id); + return persistentOrganizationViewRepository.findAll(); + } + } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/PersistentOrganization.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/PersistentOrganization.java new file mode 100644 index 00000000..b01ea8a1 --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/PersistentOrganization.java @@ -0,0 +1,34 @@ +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 = "persistent_orgs") +public class PersistentOrganization implements Serializable { + + private static final long serialVersionUID = 7684478315366015099L; + + @Id + @Column(name = "id") + private String id; + + public PersistentOrganization() {} + + public PersistentOrganization(final String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/view/PersistentOrganizationView.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/view/PersistentOrganizationView.java new file mode 100644 index 00000000..b9a40aac --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/model/view/PersistentOrganizationView.java @@ -0,0 +1,72 @@ +package eu.dnetlib.organizations.model.view; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "persistent_orgs_view") +public class PersistentOrganizationView implements Serializable { + + private static final long serialVersionUID = -8906936709574708538L; + + @Id + @Column(name = "id") + private String id; + + @Column(name = "openaire_id") + private String openaireId; + + @Column(name = "name") + private String name; + + @Column(name = "city") + private String city; + + @Column(name = "country") + private String country; + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public String getOpenaireId() { + return openaireId; + } + + public void setOpenaireId(final String openaireId) { + this.openaireId = openaireId; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(final String city) { + this.city = city; + } + + public String getCountry() { + return country; + } + + public void setCountry(final String country) { + this.country = country; + } + +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/PersistentOrganizationRepository.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/PersistentOrganizationRepository.java new file mode 100644 index 00000000..c83fbb5a --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/PersistentOrganizationRepository.java @@ -0,0 +1,11 @@ +package eu.dnetlib.organizations.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import eu.dnetlib.organizations.model.PersistentOrganization; + +@Repository +public interface PersistentOrganizationRepository extends JpaRepository { + +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/readonly/PersistentOrganizationViewRepository.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/readonly/PersistentOrganizationViewRepository.java new file mode 100644 index 00000000..c53dd904 --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/readonly/PersistentOrganizationViewRepository.java @@ -0,0 +1,10 @@ +package eu.dnetlib.organizations.repository.readonly; + +import org.springframework.stereotype.Repository; + +import eu.dnetlib.organizations.model.view.PersistentOrganizationView; + +@Repository +public interface PersistentOrganizationViewRepository extends ReadOnlyRepository { + +} 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 cb91a260..31ffbf5f 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 @@ -5,6 +5,7 @@ DROP VIEW IF EXISTS users_view; DROP VIEW IF EXISTS conflict_groups_view; DROP VIEW IF EXISTS suggestions_info_by_country_view; DROP VIEW IF EXISTS duplicate_groups_view; +DROP VIEW IF EXISTS persistent_orgs_view; DROP TABLE IF EXISTS sysconf; DROP TABLE IF EXISTS other_ids; @@ -14,6 +15,8 @@ DROP TABLE IF EXISTS relationships; DROP TABLE IF EXISTS urls; DROP TABLE IF EXISTS oa_duplicates; DROP TABLE IF EXISTS oa_conflicts; +DROP TABLE IF EXISTS persistent_orgs; + DROP TABLE IF EXISTS organizations; DROP TABLE IF EXISTS org_types; @@ -374,6 +377,10 @@ CREATE TABLE organizations ( CREATE INDEX organizations_type_idx ON organizations(type); CREATE INDEX organizations_country_idx ON organizations(country); +CREATE TABLE persistent_orgs ( + id text PRIMARY KEY REFERENCES organizations(id) ON UPDATE CASCADE ON DELETE CASCADE +); + CREATE TABLE other_ids ( id text REFERENCES organizations(id) ON UPDATE CASCADE ON DELETE CASCADE, otherid text, @@ -674,6 +681,17 @@ WHERE GROUP BY o.id, o.name, o.city, o.country ORDER BY o.name; +CREATE VIEW persistent_orgs_view AS SELECT + po.id, + substr(po.id, 1, 14)||md5(substr(po.id,15)) as openaire_id, + o.name, + o.city, + o.country +FROM + persistent_orgs po + JOIN organizations o ON (po.id = o.id) +ORDER BY o.name; + CREATE TABLE org_index_search(id text PRIMARY KEY, txt tsvector); CREATE INDEX org_index_search_txt_gin_idx ON org_index_search USING gin(txt); diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/persistentOrgs.html b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/persistentOrgs.html new file mode 100644 index 00000000..406d155a --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/persistentOrgs.html @@ -0,0 +1,47 @@ +

Persistent Organizations

+ +

+ It is necessary to persist the identifiers of the organizations associated to an Institutional Dashboard +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDOA Graph Node IDNamePlace
{{o.id}}{{o.openaireId}}{{o.name}} {{o.city || '-'}}, {{o.country}} + +
No persistent organizazions
+ + + +
\ No newline at end of file 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 e5ec7f74..ca08e30b 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 @@ -379,6 +379,7 @@ orgsModule.config(function($routeProvider) { .when('/sysconf', { templateUrl: 'resources/html/pages/admin/sysConf.html', controller: 'sysConfCtrl' }) .when('/utils', { templateUrl: 'resources/html/pages/admin/utils.html', controller: 'utilsCtrl' }) .when('/lastImport', { templateUrl: 'resources/html/pages/admin/lastImport.html', controller: 'lastImportCtrl' }) + .when('/persistentOrgs', { templateUrl: 'resources/html/pages/admin/persistentOrgs.html', controller: 'persistentOrgsCtrl' }) .otherwise({ redirectTo: '/search' }); }); @@ -806,6 +807,26 @@ orgsModule.controller('lastImportCtrl', function ($scope, $http) { $scope.refresh(); }); +orgsModule.controller('persistentOrgsCtrl', function ($scope, $http) { + $scope.orgs = {}; + + $scope.refresh = function() { + call_http_get($http, 'api/persistentOrgs', function(res) { $scope.orgs = res.data; }); + } + + $scope.addPersistentOrg = function(id) { + call_http_post($http, 'api/persistentOrgs', [ id ], function(res) { $scope.orgs = res.data; }); + } + + $scope.deletePersistentOrg = function(id) { + if (confirm("Are you sure ?")) { + call_http_delete($http, 'api/persistentOrgs?id=' + id, function(res) { $scope.orgs = res.data; }); + } + } + + $scope.refresh(); +}); + orgsModule.controller('utilsCtrl', function ($scope, $http) { $scope.fulltextIndexMessage = ''; 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 461dab24..5c3e863a 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 @@ -117,6 +117,8 @@ fieldset > legend { font-size : 1.2rem !important; } System utilities Last import of suggestions + Configure persistent organizations + Manage users