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 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 getAllAliases() { return this.dao.findAll().stream().map(Stakeholder::getAlias).collect(Collectors.toList()); } public List getAll(String type) { if(type != null) { return this.dao.findByType(type); } return this.dao.findAll(); } public List 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 getStakeholdersByTypeAndRole(String type, String defaultId, boolean manage) { List 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); } } }