From d9a67626a8e890ef4632425f6f7b23dc8471bc30 Mon Sep 17 00:00:00 2001 From: "k.triantafyllou" Date: Mon, 30 May 2022 11:11:28 +0300 Subject: [PATCH] Finish migration process abouts users dataset profiles and dmps --- .../eudat/migration/DMPRoadmapMigration.java | 19 +- .../migration/entities/Organization.java | 15 ++ .../eu/eudat/migration/entities/User.java | 19 ++ .../properties/ConfigProperties.java | 9 - .../migration/properties/DefaultEntities.java | 9 + .../eu/eudat/migration/properties/User.java | 22 +++ .../migration/services/ArgosService.java | 187 +++++++++++------- .../migration/services/DMPRoadmapService.java | 120 ++++++++--- .../src/main/resources/application.properties | 10 +- .../main/java/eu/eudat/controllers/Admin.java | 35 +--- .../logic/managers/DatasetProfileManager.java | 66 ++++++- 11 files changed, 336 insertions(+), 175 deletions(-) create mode 100644 dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/User.java diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/DMPRoadmapMigration.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/DMPRoadmapMigration.java index 173cbade9..4a2f48330 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/DMPRoadmapMigration.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/DMPRoadmapMigration.java @@ -3,20 +3,19 @@ package eu.eudat.migration; import eu.eudat.migration.services.DMPRoadmapService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.actuate.autoconfigure.elasticsearch.ElasticSearchRestHealthContributorAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication( - scanBasePackages = "eu.eudat.migration", - exclude = ElasticSearchRestHealthContributorAutoConfiguration.class + scanBasePackages = "eu.eudat" ) @ConfigurationPropertiesScan("eu.eudat.migration.properties") public class DMPRoadmapMigration implements CommandLineRunner { private final DMPRoadmapService service; + private static ConfigurableApplicationContext context; @Autowired public DMPRoadmapMigration(DMPRoadmapService service) { @@ -24,21 +23,15 @@ public class DMPRoadmapMigration implements CommandLineRunner { } public static void main(String[] args) { - new SpringApplicationBuilder(DMPRoadmapMigration.class) - .web(WebApplicationType.NONE).run(args); - + context = new SpringApplicationBuilder(DMPRoadmapMigration.class).run(args); + context.close(); } @Override public void run(String... args) throws Exception { - System.out.println("Logging in as administrator"); - this.service.login(); - System.out.println("Migration Started"); + this.service.migrateUsers(); this.service.migrate(); - System.out.println("Migration Finished. Logging out"); Thread.sleep(20000); this.service.clear(); - this.service.logout(); - System.out.println("Done"); } } diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/Organization.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/Organization.java index 7ef21625e..d373bb678 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/Organization.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/Organization.java @@ -3,9 +3,13 @@ package eu.eudat.migration.entities; import eu.eudat.migration.utils.JsonTypeConverter; import eu.eudat.migration.utils.OrganizationTypeConverter; +import org.hibernate.annotations.LazyCollection; +import org.hibernate.annotations.LazyCollectionOption; import javax.persistence.*; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Map; @Entity @@ -53,6 +57,10 @@ public class Organization { @Column(name = "helpdesk_email") private String helpdeskEmail; private Boolean managed; + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "org_id") + @LazyCollection(LazyCollectionOption.FALSE) + private List users = new ArrayList<>(); public enum Type { INSTITUTION, @@ -256,4 +264,11 @@ public class Organization { this.managed = managed; } + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } } diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/User.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/User.java index d1dc20525..7b35b1698 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/User.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/entities/User.java @@ -1,12 +1,19 @@ package eu.eudat.migration.entities; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserToken; +import eu.eudat.logic.builders.entity.UserTokenBuilder; +import eu.eudat.logic.services.ApiContext; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; import javax.persistence.*; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.Date; import java.util.HashSet; import java.util.Set; +import java.util.UUID; @Entity @Table(name = "users") @@ -123,4 +130,16 @@ public class User { public void setPerms(Set perms) { this.perms = perms; } + + public UserInfo buildUserInfo() { + UserInfo userInfo = new UserInfo(); + userInfo.setEmail(getEmail()); + userInfo.setName(getFirstname() + " " + getSurname()); + userInfo.setUsertype((short) 0); + userInfo.setUserStatus((short) 0); + userInfo.setAuthorization_level((short) 1); + userInfo.setVerified_email(false); + userInfo.setCreated(getCreatedAt()); + return userInfo; + } } diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/ConfigProperties.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/ConfigProperties.java index f5f0ef7c8..017799b9e 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/ConfigProperties.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/ConfigProperties.java @@ -5,7 +5,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "roadmap") public class ConfigProperties { private Database database; - private Argos argos; private DefaultEntities entities; public Database getDatabase() { @@ -16,14 +15,6 @@ public class ConfigProperties { this.database = database; } - public Argos getArgos() { - return argos; - } - - public void setArgos(Argos argos) { - this.argos = argos; - } - public DefaultEntities getEntities() { return entities; } diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/DefaultEntities.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/DefaultEntities.java index 920fdbe56..f784437cd 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/DefaultEntities.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/DefaultEntities.java @@ -3,6 +3,7 @@ package eu.eudat.migration.properties; public class DefaultEntities { private Entity funder; private Entity grant; + private User user; public Entity getFunder() { return funder; @@ -19,4 +20,12 @@ public class DefaultEntities { public void setGrant(Entity grant) { this.grant = grant; } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } } diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/User.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/User.java new file mode 100644 index 000000000..39365872b --- /dev/null +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/properties/User.java @@ -0,0 +1,22 @@ +package eu.eudat.migration.properties; + +public class User { + private String email; + private String name; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/ArgosService.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/ArgosService.java index 2069d27e4..4a7e0c069 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/ArgosService.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/ArgosService.java @@ -1,132 +1,169 @@ package eu.eudat.migration.services; -import eu.eudat.migration.properties.Argos; -import eu.eudat.migration.properties.ConfigProperties; +import eu.eudat.controllers.Datasets; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserRole; +import eu.eudat.data.entities.UserToken; +import eu.eudat.logic.builders.entity.UserTokenBuilder; +import eu.eudat.logic.managers.AdminManager; +import eu.eudat.logic.managers.DataManagementPlanManager; +import eu.eudat.logic.managers.DatasetProfileManager; +import eu.eudat.logic.managers.UserManager; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.authentication.NonVerifiedUserEmailAuthenticationService; import eu.eudat.models.data.admin.composite.DatasetProfile; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.dmp.DataManagementPlanEditorModel; -import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.models.data.login.Credentials; -import eu.eudat.models.data.principal.PrincipalModel; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; +import eu.eudat.queryable.QueryableList; +import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; +import javax.transaction.Transactional; +import java.io.IOException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; import java.util.Objects; import java.util.UUID; @Service public class ArgosService { - private final Argos argos; + private final ApiContext context; + private final NonVerifiedUserEmailAuthenticationService authenticationService; + private final DataManagementPlanManager dataManagementPlanManager; + private final DatasetProfileManager datasetProfileManager; + private final Datasets datasets; private UUID token; - private final RestTemplate restTemplate = new RestTemplate(); @Autowired - public ArgosService(ConfigProperties properties) { - this.argos = properties.getArgos(); + public ArgosService(ApiContext context, + NonVerifiedUserEmailAuthenticationService authenticationService, + DatasetProfileManager datasetProfileManager, + DataManagementPlanManager dataManagementPlanManager, + Datasets datasets) { + this.context = context; + this.authenticationService = authenticationService; + this.datasetProfileManager = datasetProfileManager; + this.dataManagementPlanManager = dataManagementPlanManager; + this.datasets = datasets; } /** * Auth methods - * */ - public void login() { - Credentials credentials = new Credentials(); - credentials.setUsername(argos.getUsername()); - credentials.setSecret(argos.getPassword()); - HttpEntity request = new HttpEntity<>(credentials, setHeaders()); - PrincipalModel principal = Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/auth/nativelogin", - HttpMethod.POST, request, new ParameterizedTypeReference>() { - }).getBody()).getPayload(); - this.token = principal.getToken(); + */ + @Transactional + public UserInfo getUserInfo(String email) { + QueryableList query = context.getOperationsContext().getDatabaseRepository().getUserInfoDao().asQueryable(); + query.where((builder, root) -> builder.equal(root.get("email"), email)); + return query.getSingleOrDefault(); } - public void logout() { - HttpEntity request = new HttpEntity<>(null, setHeaders()); - this.restTemplate.exchange(argos.getUrl() + "/api/auth/logout", HttpMethod.POST, request, new ParameterizedTypeReference>() {}); - this.token = null; + @Transactional + public void createUserInfo(UserInfo userInfo) { + if (getUserInfo(userInfo.getEmail()) == null) { + context.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + } + } + + @Transactional + public Principal login(UserInfo userInfo) { + QueryableList query = context.getOperationsContext().getDatabaseRepository().getUserTokenDao().asQueryable(); + query.where((builder, root) -> builder.equal(root.get("user").get("id"), userInfo.getId())); + query.where((builder, root) -> builder.greaterThan(root.get("expiresAt"), new Date())); + UserToken userToken = query.getSingleOrDefault(); + if(userToken == null) { + userToken = this.context.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) + .issuedAt(new Date()).user(userInfo) + .token(UUID.randomUUID()).expiresAt(Timestamp.valueOf(LocalDateTime.now().plusDays(10))) + .build(); + userToken = context.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); + } + return authenticationService.Touch(userToken); + } + + @Transactional + public void assignRole(UserInfo userInfo, Authorities authority) { + QueryableList query = context.getOperationsContext().getDatabaseRepository().getUserRoleDao().asQueryable(); + query.where((builder, root) -> builder.equal(root.get("userInfo").get("id"), userInfo.getId())); + if(query.getSingleOrDefault() == null) { + UserRole role = new UserRole(); + role.setUserInfo(userInfo); + role.setRole(authority.getValue()); + context.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); + } } /** * Dataset Profiles - * */ - public UUID createDatasetProfile(DatasetProfile datasetProfile) { - HttpEntity request = new HttpEntity<>(datasetProfile, setHeaders()); - return Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/admin/addDmp", - HttpMethod.POST, request, new ParameterizedTypeReference() { - }).getBody()); + */ + @Transactional + public UUID createDatasetProfile(DatasetProfile datasetProfile, Principal principal) { + return this.datasetProfileManager.addDmp(datasetProfile, principal, false).getId(); } - public UUID createNewVersionDatasetProfile(UUID id, DatasetProfile datasetProfile) { - HttpEntity request = new HttpEntity<>(datasetProfile, setHeaders()); - return Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/admin/newVersion/" + id, - HttpMethod.POST, request, new ParameterizedTypeReference() { - }).getBody()); + @Transactional + public UUID createNewVersionDatasetProfile(UUID id, DatasetProfile datasetProfile) throws Exception { + return this.datasetProfileManager.createNewVersionDatasetProfile(id.toString(), datasetProfile, false).getId(); } + @Transactional public void deleteDatasetProfile(UUID id) { - HttpEntity request = new HttpEntity<>(null, setHeaders()); - this.restTemplate.exchange(argos.getUrl() + "/api/admin/" + id, HttpMethod.DELETE, request, Object.class); + AdminManager.inactivate(context.getOperationsContext().getDatabaseRepository().getDatasetProfileDao(), context.getOperationsContext().getDatabaseRepository().getDatasetDao(), id.toString()); } /** * DMP methods - * */ - public DataManagementPlan createDMP(DataManagementPlanEditorModel model) { - HttpEntity request = new HttpEntity<>(model, setHeaders()); - return Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/dmps/", - HttpMethod.POST, request, new ParameterizedTypeReference>() { - }).getBody()).getPayload(); + * @return + */ + @Transactional + public DataManagementPlan createDMP(DataManagementPlanEditorModel model, Principal principal) throws Exception { + return new eu.eudat.models.data.dmp.DataManagementPlan(). + fromDataModel(this.dataManagementPlanManager.createOrUpdate(model, principal)); } + @Transactional + public void updateUsers(UUID id, List users, Principal principal) throws Exception { + this.dataManagementPlanManager.updateUsers(id, users, principal); + } + + @Transactional public void deleteDMP(UUID id) { - HttpEntity request = new HttpEntity<>(null, setHeaders()); - this.restTemplate.exchange(argos.getUrl() + "/api/dmps/" + id, HttpMethod.DELETE, request, Object.class); + try { + this.dataManagementPlanManager.delete(id); + } catch (IOException e) { + e.printStackTrace(); + } } /** * Dataset Methods - * */ + */ + @Transactional public PagedDatasetProfile getDataset(UUID id) { - HttpEntity request = new HttpEntity<>(null, setHeaders()); - return Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/datasets/get/" + id, - HttpMethod.GET, request, new ParameterizedTypeReference>() { - }).getBody()).getPayload(); + return Objects.requireNonNull(this.datasets.getSingle(id.toString()).getBody()).getPayload(); } - public DatasetWizardModel createDataset(DatasetWizardModel model) { - HttpEntity request = new HttpEntity<>(model, setHeaders()); - return Objects.requireNonNull(this.restTemplate.exchange(argos.getUrl() + "/api/datasets/", - HttpMethod.POST, request, new ParameterizedTypeReference>() { - }).getBody()).getPayload(); + @Transactional + public DatasetWizardModel createDataset(DatasetWizardModel model, Principal principal) throws Exception { + return Objects.requireNonNull(this.datasets.createOrUpdate(model, principal).getBody()).getPayload(); } - public void deleteDataset(UUID id) { - HttpEntity request = new HttpEntity<>(null, setHeaders()); - this.restTemplate.exchange(argos.getUrl() + "/api/datasets/delete/" + id, HttpMethod.DELETE, request, Object.class); - } - - public HttpHeaders setHeaders() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - if(this.token != null) { - headers.add("AuthToken", this.token.toString()); + @Transactional + public void deleteDataset(UUID id, Principal principal) { + try { + this.datasets.delete(id, principal); + } catch (Exception e) { + e.printStackTrace(); } - return headers; - } - - public UUID getToken() { - return token; } public void setToken(UUID token) { diff --git a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/DMPRoadmapService.java b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/DMPRoadmapService.java index 1c102c6a1..68899366a 100644 --- a/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/DMPRoadmapService.java +++ b/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/DMPRoadmapService.java @@ -1,37 +1,55 @@ package eu.eudat.migration.services; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserInfo; import eu.eudat.migration.dao.TemplateRepository; import eu.eudat.migration.dao.UserRepository; +import eu.eudat.migration.entities.Perm; +import eu.eudat.migration.entities.Plan; import eu.eudat.migration.entities.Template; +import eu.eudat.migration.entities.User; import eu.eudat.migration.properties.ConfigProperties; import eu.eudat.migration.properties.DefaultEntities; import eu.eudat.models.data.admin.composite.DatasetProfile; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.dmp.DataManagementPlanEditorModel; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.models.data.userinfo.UserListingModel; +import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; @Service @ConditionalOnProperty(prefix = "roadmap", name = "database.url") public class DMPRoadmapService { - /** DMPRoadmap Repositories*/ + /** + * DMPRoadmap Repositories + */ private final TemplateRepository templateRepository; private final UserRepository userRepository; - /** Default Entities*/ + /** + * Default Entities + */ private final DefaultEntities defaultEntities; - /** Services */ + /** + * Services + */ private final ArgosService argosService; - /** Metadata */ + /** + * Metadata + */ private final List datasetProfiles = new ArrayList<>(); private final List dmps = new ArrayList<>(); private final List datasets = new ArrayList<>(); + private Principal principal; @Autowired public DMPRoadmapService(TemplateRepository templateRepository, UserRepository userRepository, ArgosService argosService, ConfigProperties properties) { @@ -41,48 +59,90 @@ public class DMPRoadmapService { this.argosService = argosService; } - public void login() { - this.argosService.login(); - } - - public void logout() { - this.argosService.logout(); + public void migrateUsers() { + this.argosService.createUserInfo(Objects.requireNonNull(defaultUser())); + List users = this.userRepository.findAll(); + users.forEach(user -> { + this.argosService.createUserInfo(user.buildUserInfo()); + }); } public void migrate() { try { - templateRepository.findAllGroups().forEach(group -> { + List users = this.userRepository.findAll().stream().filter(user -> + user.getPerms().stream().map(Perm::getName).collect(Collectors.toList()).contains("modify_templates")).map(user -> + this.argosService.getUserInfo(user.getEmail()) + ).collect(Collectors.toList()); + UserInfo userInfo = this.argosService.getUserInfo(users.size() > 0 ? users.get(0).getEmail() : defaultEntities.getUser().getEmail()); + for (Long group : templateRepository.findAllGroups()) { List