From dc752f73cad3ed5e5b6f5f523196802da3419e96 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 18 Oct 2023 18:15:52 +0300 Subject: [PATCH] Partially fix Deposit Logic and add support for upcomming micro-services --- dmp-backend/core/pom.xml | 5 +++ .../configurations/DepositConfiguration.java | 35 +++++++++++++++++ .../configurations/DepositProperties.java | 25 ++++++++++++ .../eudat/repository/DepositRepository.java | 39 +++++++++++++++++++ .../managers/DataManagementPlanManager.java | 2 + .../eudat/logic/managers/DepositManager.java | 19 ++++++--- .../mapper/DMPToDepositMapper.java | 3 ++ .../eudat/models/rda/mapper/DmpRDAMapper.java | 26 +++++++------ .../src/main/resources/config/application.yml | 5 ++- .../web/src/main/resources/config/deposit.yml | 3 ++ 10 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/repository/DepositRepository.java create mode 100644 dmp-backend/web/src/main/resources/config/deposit.yml diff --git a/dmp-backend/core/pom.xml b/dmp-backend/core/pom.xml index 09e82047c..2275a1d4f 100644 --- a/dmp-backend/core/pom.xml +++ b/dmp-backend/core/pom.xml @@ -35,6 +35,11 @@ oidc-authz 2.1.0 + + gr.cite.opendmp + repositorydepositbase + 1.0.4 + diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java new file mode 100644 index 000000000..cf208d12b --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java @@ -0,0 +1,35 @@ +package eu.eudat.configurations; + +import eu.eudat.depositinterface.repository.RepositoryDeposit; +import eu.eudat.repository.DepositRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.ArrayList; +import java.util.List; + +@Configuration +@EnableConfigurationProperties({DepositProperties.class}) +public class DepositConfiguration { + + private final DepositProperties properties; + + @Autowired + public DepositConfiguration(DepositProperties properties) { + this.properties = properties; + } + + @Bean + @Qualifier("depositClients") + public List depositClients() { + List clients = new ArrayList<>(); + for (String url: properties.getUrls()) { + clients.add(new DepositRepository(WebClient.builder().baseUrl(url + "/api/deposit").build())); + } + return clients; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java new file mode 100644 index 000000000..aa7a37f40 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java @@ -0,0 +1,25 @@ +package eu.eudat.configurations; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.bind.ConstructorBinding; + +import java.util.List; + +@ConfigurationProperties(prefix = "deposit") +public class DepositProperties { + + private List urls; + + @ConstructorBinding + public DepositProperties(List urls) { + this.urls = urls; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/repository/DepositRepository.java b/dmp-backend/core/src/main/java/eu/eudat/repository/DepositRepository.java new file mode 100644 index 000000000..c0dd332b3 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/repository/DepositRepository.java @@ -0,0 +1,39 @@ +package eu.eudat.repository; + +import eu.eudat.depositinterface.models.DMPDepositModel; +import eu.eudat.depositinterface.repository.RepositoryDeposit; +import eu.eudat.depositinterface.repository.RepositoryDepositConfiguration; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.List; + +public class DepositRepository implements RepositoryDeposit { + + private final WebClient depositClient; + + public DepositRepository(WebClient depositClient) { + this.depositClient = depositClient; + } + + + @Override + public String deposit(String repositoryId, DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception { + return depositClient.post().uri("/" + repositoryId, uriBuilder -> uriBuilder.queryParam("authToken", repositoryAccessToken).build()).bodyValue(dmpDepositModel).exchangeToMono(mono -> mono.bodyToMono(String.class)).block(); + } + + @Override + public String authenticate(String repositoryId, String code) { + return depositClient.get().uri("/authenticate/" + repositoryId, uriBuilder -> uriBuilder.queryParam("authToken", code).build()).exchangeToMono(mono -> mono.bodyToMono(String.class)).block(); + } + + @Override + public List getConfiguration() { + return depositClient.get().uri("/configuration").exchangeToMono(mono -> mono.bodyToMono(new ParameterizedTypeReference>() {})).block(); + } + + @Override + public String getLogo(String repositoryId) { + return depositClient.get().uri("/logo/" + repositoryId).exchangeToMono(mono -> mono.bodyToMono(String.class)).block(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 37dca6d08..2148b5f81 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1960,6 +1960,7 @@ public class DataManagementPlanManager { return fileEnvelope; } + @Transactional public FileEnvelope getRDAJsonDocument(String id, Principal principal) throws Exception { DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); if (!dmp.isPublic() && dmp.getUsers().stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId())) @@ -2464,6 +2465,7 @@ public class DataManagementPlanManager { return null; } + @Transactional public Doi createDoi(DepositRequest depositRequest, Principal principal) throws Exception { DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(UUID.fromString(depositRequest.getDmpId())); if (!isUserOwnerOfDmp(dmp, principal)) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DepositManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DepositManager.java index fa8e20d42..a1208e747 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DepositManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DepositManager.java @@ -6,10 +6,14 @@ import eu.eudat.models.data.doi.DepositRequest; import eu.eudat.models.data.doi.Doi; import eu.eudat.models.data.doi.RepositoryConfig; import eu.eudat.models.data.security.Principal; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; import java.util.ArrayList; import java.util.List; @@ -19,18 +23,20 @@ import java.util.Optional; public class DepositManager { private static final Logger logger = LoggerFactory.getLogger(DepositManager.class); - private List repositories; + //private List repositories; private DataManagementPlanManager dataManagementPlanManager; + private final List depositClients; @Autowired - public DepositManager(List repositories, DataManagementPlanManager dataManagementPlanManager){ - this.repositories = repositories; + public DepositManager(/*List repositories,*/ DataManagementPlanManager dataManagementPlanManager, @Qualifier("depositClients") List depositClients){ + //this.repositories = repositories; this.dataManagementPlanManager = dataManagementPlanManager; + this.depositClients = depositClients; } public List getAvailableRepos() { List reposConfigModel = new ArrayList<>(); - for (RepositoryDeposit r: this.repositories) { + for (RepositoryDeposit r: this.depositClients) { List repoConf = r.getConfiguration(); if(repoConf != null) { for(RepositoryDepositConfiguration cf: repoConf){ @@ -43,7 +49,7 @@ public class DepositManager { } public String authenticate(String id, String code) { - for(RepositoryDeposit r: this.repositories){ + for(RepositoryDeposit r: this.depositClients){ if(r.getConfiguration().stream().anyMatch(x -> x.getRepositoryId().equals(id))){ return r.authenticate(id, code); } @@ -51,12 +57,13 @@ public class DepositManager { return null; } + @Transactional public Doi deposit(DepositRequest depositRequest, Principal principal) throws Exception { return this.dataManagementPlanManager.createDoi(depositRequest, principal); } public String getRepositoryLogo(String repositoryId){ - for(RepositoryDeposit r: this.repositories){ + for(RepositoryDeposit r: this.depositClients){ Optional cf = r.getConfiguration().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst(); if(cf.isPresent()){ return cf.get().isHasLogo() ? r.getLogo(repositoryId) : null; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java index db21be3e7..ccb614755 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.old.*; import eu.eudat.depositinterface.models.*; import eu.eudat.logic.utilities.builders.XmlBuilder; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -25,6 +26,7 @@ public class DMPToDepositMapper { private static final Logger logger = LoggerFactory.getLogger(DMPToDepositMapper.class); private static final ObjectMapper mapper = new ObjectMapper(); + @Transactional public static DMPDepositModel fromDMP(DMP entity, FileEnvelope pdfFile, FileEnvelope jsonFile, File supportingFilesZip, String previousDOI) { DMPDepositModel deposit = new DMPDepositModel(); deposit.setId(entity.getId()); @@ -49,6 +51,7 @@ public class DMPToDepositMapper { return deposit; } + @Transactional private static DatasetDepositModel fromDataset(Dataset entity){ DatasetDepositModel deposit = new DatasetDepositModel(); deposit.setLabel(entity.getLabel()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 6ac1c3a02..b2c061b15 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -88,20 +88,24 @@ public class DmpRDAMapper { rda.getCost().add(CostRDAMapper.toRDA((Map)costl)); }); } - UserInfo contactDb = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(UUID.fromString((String) extraProperties.get("contact"))); - UserInfo contact = new UserInfo(); - contact.setId(contactDb.getId()); - contact.setName(contactDb.getName()); - contact.setEmail(contactDb.getEmail()); - if(contact.getEmail() == null){ - for(UserDMP userDMP: dmp.getUsers()){ - if(userDMP.getDmp().getId() == dmp.getId() && userDMP.getUser().getEmail() != null){ - contact.setEmail(userDMP.getUser().getEmail()); - break; + try { + UserInfo contactDb = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(UUID.fromString((String) extraProperties.get("contact"))); + UserInfo contact = new UserInfo(); + contact.setId(contactDb.getId()); + contact.setName(contactDb.getName()); + contact.setEmail(contactDb.getEmail()); + if (contact.getEmail() == null) { + for (UserDMP userDMP : dmp.getUsers()) { + if (userDMP.getDmp().getId() == dmp.getId() && userDMP.getUser().getEmail() != null) { + contact.setEmail(userDMP.getUser().getEmail()); + break; + } } } + rda.setContact(ContactRDAMapper.toRDA(contact)); + } catch (NoResultException e) { + logger.error(e.getMessage(), e); } - rda.setContact(ContactRDAMapper.toRDA(contact)); } /*UserInfo creator; diff --git a/dmp-backend/web/src/main/resources/config/application.yml b/dmp-backend/web/src/main/resources/config/application.yml index ced49fdd3..e795cc7d6 100644 --- a/dmp-backend/web/src/main/resources/config/application.yml +++ b/dmp-backend/web/src/main/resources/config/application.yml @@ -14,5 +14,6 @@ spring: optional:classpath:config/elasticsearch.yml[.yml], optional:classpath:config/elasticsearch-${spring.profiles.active}.yml[.yml], optional:file:../config/elasticsearch-${spring.profiles.active}.yml[.yml], optional:classpath:config/file-path.yml[.yml], optional:classpath:config/file-path-${spring.profiles.active}.yml[.yml], optional:file:../config/file-path-${spring.profiles.active}.yml[.yml], optional:classpath:config/idpclaims.yml[.yml], optional:classpath:config/idpclaims-${spring.profiles.active}.yml[.yml], optional:file:../config/idpclaims-${spring.profiles.active}.yml[.yml], - optional:classpath:config/external.yml[.yml], optional:classpath:config/external-${spring.profiles.active}.yml[.yml], optional:file:../config/external-${spring.profiles.active}.yml[.yml] - optional:classpath:config/swagger.yml[.yml], optional:classpath:config/swagger-${spring.profiles.active}.yml[.yml], optional:file:../config/swagger-${spring.profiles.active}.yml[.yml] + optional:classpath:config/external.yml[.yml], optional:classpath:config/external-${spring.profiles.active}.yml[.yml], optional:file:../config/external-${spring.profiles.active}.yml[.yml], + optional:classpath:config/swagger.yml[.yml], optional:classpath:config/swagger-${spring.profiles.active}.yml[.yml], optional:file:../config/swagger-${spring.profiles.active}.yml[.yml], + optional:classpath:config/deposit.yml[.yml], optional:classpath:config/deposit-${spring.profiles.active}.yml[.yml], optional:file:../config/deposit-${spring.profiles.active}.yml[.yml] diff --git a/dmp-backend/web/src/main/resources/config/deposit.yml b/dmp-backend/web/src/main/resources/config/deposit.yml new file mode 100644 index 000000000..bf19ffbd5 --- /dev/null +++ b/dmp-backend/web/src/main/resources/config/deposit.yml @@ -0,0 +1,3 @@ +deposit: + urls: + - http://localhost:8080 \ No newline at end of file