137 lines
6.1 KiB
Java
137 lines
6.1 KiB
Java
package eu.dnetlib.uoamonitorservice.service;
|
|
|
|
import eu.dnetlib.uoaadmintoolslibrary.handlers.ForbiddenException;
|
|
import eu.dnetlib.uoamonitorservice.dao.StakeholderDAO;
|
|
import eu.dnetlib.uoamonitorservice.dto.StakeholderFull;
|
|
import eu.dnetlib.uoamonitorservice.entities.Stakeholder;
|
|
import eu.dnetlib.uoamonitorservice.handlers.EntityNotFoundException;
|
|
import eu.dnetlib.uoamonitorservice.primitives.Visibility;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Service
|
|
public class StakeholderService {
|
|
|
|
private final StakeholderDAO dao;
|
|
|
|
private final CommonService commonService;
|
|
private final TopicService topicService;
|
|
|
|
@Autowired
|
|
public StakeholderService(StakeholderDAO dao, CommonService commonService, TopicService topicService) {
|
|
this.dao = dao;
|
|
this.commonService = commonService;
|
|
this.topicService = topicService;
|
|
}
|
|
|
|
public Stakeholder findById(String id) {
|
|
return this.dao.findById(id).orElseThrow(() -> new EntityNotFoundException("Stakeholder with id: " + id + " not found"));
|
|
}
|
|
|
|
public Stakeholder findByAlias(String alias) {
|
|
return this.dao.findByAlias(alias).orElseThrow(() -> new EntityNotFoundException("Stakeholder with alias: " + alias + " not found"));
|
|
}
|
|
|
|
public List<Stakeholder> findByDefaultId(String id ){
|
|
return this.dao.findByDefaultId(id);
|
|
}
|
|
|
|
public Stakeholder findByPath(String stakeholderId) {
|
|
return dao.findById(stakeholderId).orElseThrow(() -> new EntityNotFoundException("Stakeholder with id: " + stakeholderId + " not found"));
|
|
}
|
|
|
|
public List<String> getAllAliases() {
|
|
return this.dao.findAll().stream().map(Stakeholder::getAlias).collect(Collectors.toList());
|
|
}
|
|
|
|
public List<Stakeholder> getAll(String type) {
|
|
if(type != null) {
|
|
return this.dao.findByType(type);
|
|
}
|
|
return this.dao.findAll();
|
|
}
|
|
|
|
public List<Stakeholder> getAllDefaultByRole(String type) {
|
|
return (type == null?this.dao.findByDefaultId(null):this.dao.findByDefaultIdAndType(null, type)).stream()
|
|
.filter(stakeholder -> this.commonService.hasAccessAuthority(stakeholder.getType(), stakeholder.getAlias(), true))
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public List<Stakeholder> getStakeholdersByTypeAndRole(String type, String defaultId, boolean manage) {
|
|
List<Stakeholder> stakeholders;
|
|
if(type != null && defaultId != null) {
|
|
stakeholders = dao.findByDefaultIdAndType(defaultId, type);
|
|
} else if(defaultId != null) {
|
|
stakeholders = dao.findByDefaultId(defaultId);
|
|
} else if(type != null) {
|
|
stakeholders = dao.findByDefaultIdNotAndType(null, type);
|
|
} else {
|
|
stakeholders = dao.findByDefaultIdNot(null);
|
|
}
|
|
return stakeholders.stream().filter(stakeholder ->
|
|
(!manage && (stakeholder.getVisibility() == Visibility.PUBLIC || stakeholder.getVisibility() == Visibility.RESTRICTED))
|
|
|| this.commonService.hasAccessAuthority(stakeholder.getType(), stakeholder.getAlias(), false))
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public StakeholderFull getFullStakeholder(Stakeholder stakeholder) {
|
|
if(this.commonService.hasAccessAuthority(stakeholder.getType(), stakeholder.getAlias(), stakeholder.getDefaultId() == null) ||
|
|
(stakeholder.getDefaultId() != null && this.commonService.hasVisibilityAuthority(stakeholder.getType(), stakeholder.getAlias(), stakeholder))) {
|
|
return new StakeholderFull(stakeholder,
|
|
stakeholder.getTopics().stream()
|
|
.map(topicId -> topicService.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), topicId))
|
|
.collect(Collectors.toList()));
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public StakeholderFull buildStakeholder(StakeholderFull stakeholderFull) {
|
|
stakeholderFull.setTopics(stakeholderFull.getTopics().stream().map(this.topicService::buildTopic).collect(Collectors.toList()));
|
|
stakeholderFull.update(this.save(new Stakeholder(stakeholderFull)));
|
|
return stakeholderFull;
|
|
}
|
|
|
|
public Stakeholder save(Stakeholder stakeholder) {
|
|
stakeholder.getTopics().forEach(this.topicService::find);
|
|
return this.dao.save(stakeholder);
|
|
}
|
|
|
|
public String delete(String id) {
|
|
Stakeholder stakeholder = this.findById(id);
|
|
if(this.commonService.hasDeleteAuthority(stakeholder.getType())) {
|
|
this.dao.findByDefaultId(stakeholder.getId()).forEach(child -> {
|
|
this.delete(child.getId());
|
|
});
|
|
stakeholder.getTopics().forEach(topicId -> {
|
|
this.topicService.delete(stakeholder.getType(), topicId, false);
|
|
});
|
|
this.dao.delete(id);
|
|
return stakeholder.getAlias();
|
|
} else {
|
|
throw new ForbiddenException("Delete stakeholder: You are not authorized to delete stakeholder with id: " + id);
|
|
}
|
|
}
|
|
|
|
public StakeholderFull changeVisibility(String id, Visibility visibility, Boolean propagate) {
|
|
Stakeholder stakeholder = this.findById(id);
|
|
stakeholder.setVisibility(visibility);
|
|
if(this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
|
|
StakeholderFull stakeholderFull = this.getFullStakeholder(stakeholder);
|
|
if(propagate) {
|
|
stakeholderFull.setTopics(stakeholderFull.getTopics().stream().
|
|
map(topic -> this.topicService.changeVisibility(stakeholderFull.getType(), stakeholderFull.getAlias(), topic.getId(), visibility, true))
|
|
.collect(Collectors.toList()));
|
|
}
|
|
stakeholder = this.save(stakeholder);
|
|
stakeholderFull.update(stakeholder);
|
|
return stakeholderFull;
|
|
} else {
|
|
throw new ForbiddenException("Change stakeholder visibility: You are not authorized to update stakeholder with id: " + id);
|
|
}
|
|
}
|
|
}
|