package eu.dnetlib.uoamonitorservice.service; import eu.dnetlib.uoaauthorizationlibrary.security.AuthorizationService; 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 findByAlias(String alias) { return this.dao.findByAlias(alias).orElseThrow(() -> new EntityNotFoundException("Stakeholder with alias: " + alias + " 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 Stakeholder findByPath(String stakeholderId) { return dao.findById(stakeholderId).orElseThrow(() -> new EntityNotFoundException("Stakeholder with id: " + stakeholderId + " not found")); } 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; } } }