argos/dmp-backend/roadmap/src/main/java/eu/eudat/migration/services/DMPRoadmapService.java

169 lines
8.3 KiB
Java

package eu.eudat.migration.services;
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.types.Authorities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service
public class DMPRoadmapService {
private static final Logger logger = LoggerFactory.getLogger(DMPRoadmapService.class);
/**
* DMPRoadmap Repositories
*/
private final TemplateRepository templateRepository;
private final UserRepository userRepository;
/**
* Default Entities
*/
private final DefaultEntities defaultEntities;
/**
* Services
*/
private final ArgosService argosService;
/**
* Metadata
*/
private final List<UUID> datasetProfiles = new ArrayList<>();
private final List<UUID> dmps = new ArrayList<>();
private final List<UUID> datasets = new ArrayList<>();
private Principal principal;
@Autowired
public DMPRoadmapService(TemplateRepository templateRepository, UserRepository userRepository, ArgosService argosService, ConfigProperties properties) {
this.templateRepository = templateRepository;
this.userRepository = userRepository;
this.defaultEntities = properties.getEntities();
this.argosService = argosService;
}
public void migrateUsers() {
this.argosService.createUserInfo(Objects.requireNonNull(defaultUser()));
List<User> users = this.userRepository.findAll();
users.forEach(user -> {
logger.info("Create user with email: " + user.getEmail());
this.argosService.createUserInfo(user.buildUserInfo());
});
}
public void migrate() {
try {
List<UserInfo> 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<Template> templates = templateRepository.findAllByFamilyId(group, Sort.by(Sort.Direction.ASC, "version"));
UUID id = null;
for (Template template : templates) {
this.argosService.assignRole(userInfo, Authorities.DATASET_PROFILE_MANAGER);
this.principal = this.argosService.login(userInfo);
DatasetProfile datasetProfile = template.buildDatasetProfile();
if (id == null) {
if (users.size() > 1) {
datasetProfile.setUsers(users.subList(1, users.size()).stream().map(info -> {
UserInfoListingModel model = new UserInfoListingModel();
model.setId(info.getId());
return model;
}).collect(Collectors.toList()));
}
logger.info("Create Dataset Profile with label: " + datasetProfile.getLabel());
id = this.argosService.createDatasetProfile(datasetProfile, principal);
} else {
if (users.size() > 0) {
datasetProfile.setUsers(users.stream().map(info -> {
UserInfoListingModel model = new UserInfoListingModel();
model.setId(info.getId());
return model;
}).collect(Collectors.toList()));
} else {
datasetProfile.setUsers(Stream.of(userInfo).map(info -> {
UserInfoListingModel model = new UserInfoListingModel();
model.setId(info.getId());
return model;
}).collect(Collectors.toList()));
}
logger.info("Create a new version of Dataset Profiles with label: " + datasetProfile.getLabel());
id = this.argosService.createNewVersionDatasetProfile(id, datasetProfile);
}
this.datasetProfiles.add(id);
for (Plan plan : template.getPlans()) {
DataManagementPlanEditorModel dataManagementPlanEditorModel = plan.buildDMP(id, datasetProfile.getLabel(), defaultEntities.getFunder(), defaultEntities.getGrant());
List<UserInfo> collaborators = plan.getUsers().stream().map(user -> this.argosService.getUserInfo(user.getEmail())).collect(Collectors.toList());
Principal principal = this.principal;
if (collaborators.size() > 0) {
principal = this.argosService.login(collaborators.get(0));
}
logger.info("Create DMP and its Dataset with label: " + dataManagementPlanEditorModel.getLabel());
DataManagementPlan dmp = this.argosService.createDMP(dataManagementPlanEditorModel, principal);
this.dmps.add(dmp.getId());
if (collaborators.size() > 1) {
List<UserInfoListingModel> modelList = collaborators.subList(1, collaborators.size()).stream().map(user -> {
UserInfoListingModel model = new UserInfoListingModel();
model.setId(user.getId());
return model;
}).collect(Collectors.toList());
this.argosService.updateUsers(dmp.getId(), modelList, principal);
}
DatasetWizardModel dataset = plan.buildDataset(id, datasetProfile.getLabel(), dmp, this.argosService.getDataset(id));
dataset = this.argosService.createDataset(dataset, principal);
this.datasets.add(dataset.getId());
}
}
}
} catch (Exception e) {
logger.error("Migration Failed. All data will be deleted.");
this.clear();
}
}
public void clear() {
logger.info("Deleting Datasets");
this.datasets.forEach(id -> this.argosService.deleteDataset(id, this.principal));
logger.info("Deleting DMPs");
this.dmps.forEach(this.argosService::deleteDMP);
logger.info("Deleting Dataset Profiles");
this.datasetProfiles.forEach(this.argosService::deleteDatasetProfile);
}
private UserInfo defaultUser() {
eu.eudat.migration.properties.User user = defaultEntities.getUser();
if (user != null && user.getEmail() != null && user.getName() != null) {
UserInfo userInfo = new UserInfo();
userInfo.setEmail(user.getEmail());
userInfo.setName(user.getName());
userInfo.setUsertype((short) 0);
userInfo.setUserStatus((short) 0);
userInfo.setAuthorization_level((short) 1);
userInfo.setVerified_email(false);
userInfo.setCreated(new Date());
return userInfo;
}
return null;
}
}