package eu.dnetlib.uoamonitorservice.controllers; import eu.dnetlib.uoaadmintoolslibrary.entities.Portal; import eu.dnetlib.uoaadmintoolslibrary.handlers.ForbiddenException; import eu.dnetlib.uoaadmintoolslibrary.services.PortalService; import eu.dnetlib.uoamonitorservice.dto.StakeholderFull; import eu.dnetlib.uoamonitorservice.dto.TopicFull; import eu.dnetlib.uoamonitorservice.entities.Stakeholder; import eu.dnetlib.uoamonitorservice.primitives.Visibility; import eu.dnetlib.uoamonitorservice.service.StakeholderService; import eu.dnetlib.uoamonitorservice.service.TopicService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @RestController @CrossOrigin(origins = "*") public class StakeholderController { private final Logger log = LogManager.getLogger(this.getClass()); private final PortalService portalService; private final StakeholderService stakeholderService; @Autowired public StakeholderController(PortalService portalService, StakeholderService stakeholderService) { this.portalService = portalService; this.stakeholderService = stakeholderService; } @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/stakeholder/alias", method = RequestMethod.GET) public List getAllReservedStakeholderAlias() { List stakeholderAlias = this.stakeholderService.getAllAliases(); stakeholderAlias.add("all"); stakeholderAlias.add("default"); stakeholderAlias.add("alias"); return stakeholderAlias; } @PreAuthorize("hasAnyAuthority(" + "@AuthorizationService.PORTAL_ADMIN, " + "@AuthorizationService.curator(#stakeholder.getType()))") @RequestMapping(value = "/build-stakeholder", method = RequestMethod.POST) public StakeholderFull buildStakeholder(@RequestBody StakeholderFull stakeholder) { log.debug("build stakeholder"); log.debug("Alias: " + stakeholder.getAlias()); Portal portal = portalService.getPortal(stakeholder.getAlias()); if (portal == null) { portal = new Portal(); portal.setPid(stakeholder.getAlias()); portal.setName(stakeholder.getName()); portal.setType(stakeholder.getType()); portalService.insertPortal(portal); } return this.stakeholderService.buildStakeholder(stakeholder); } @PreAuthorize("hasAnyAuthority(" + "@AuthorizationService.PORTAL_ADMIN)") @RequestMapping(value = "/stakeholder/all", method = RequestMethod.GET) public List getAllStakeholders(@RequestParam(required = false) String type) { return this.stakeholderService.getAll(type); } @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/stakeholder/default", method = RequestMethod.GET) public List getAllDefaultStakeholders(@RequestParam(required = false) String type) { return this.stakeholderService.getAllDefaultByRole(type).stream() .map(this.stakeholderService::getFullStakeholder) .collect(Collectors.toList()); } @RequestMapping(value = "/stakeholder", method = RequestMethod.GET) public List getVisibleStakeholders(@RequestParam(required = false) String type, @RequestParam(required = false) String defaultId) { return stakeholderService.getStakeholdersByTypeAndRole(type, defaultId, false); } @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/my-stakeholder", method = RequestMethod.GET) public List getManagedStakeholders(@RequestParam(required = false) String type) { return stakeholderService.getStakeholdersByTypeAndRole(type, null, true); } @RequestMapping(value = "/stakeholder/{alias:.+}", method = RequestMethod.GET) public StakeholderFull getStakeholder(@PathVariable("alias") String alias) { StakeholderFull stakeholder = this.stakeholderService.getFullStakeholder(this.stakeholderService.findByAlias(alias)); if (stakeholder == null) { throw new ForbiddenException("Get stakeholder: You are not authorized to access stakeholder with alias: " + alias); } return stakeholder; } @PreAuthorize("hasAnyAuthority(" + "@AuthorizationService.PORTAL_ADMIN, " + "@AuthorizationService.curator(#stakeholder.getType()), " + "@AuthorizationService.manager(#stakeholder.getType(), #stakeholder.getAlias()) " + ")") @RequestMapping(value = "/save", method = RequestMethod.POST) public StakeholderFull saveStakeholder(@RequestBody StakeholderFull stakeholder) { log.debug("save stakeholder"); log.debug("Alias: " + stakeholder.getAlias() + " - Id: " + stakeholder.getId()); return this.stakeholderService.getFullStakeholder(this.stakeholderService.save(new Stakeholder(stakeholder))); } @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/delete", method = RequestMethod.DELETE) public boolean deleteStakeholder(@PathVariable("stakeholderId") String id) { log.debug("delete stakeholder"); log.debug("Id: " + id); Portal portal = portalService.getPortal(this.stakeholderService.delete(id)); if (portal != null) { portalService.deletePortal(portal.getId()); } return true; } @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/change-visibility", method = RequestMethod.POST) public StakeholderFull changeStakeholderVisibility(@PathVariable("stakeholderId") String stakeholderId, @RequestParam("visibility") Visibility visibility, @RequestParam(defaultValue = "false") Boolean propagate) { log.debug("change stakeholder visibility: " + visibility + " - toggle propagate: " + propagate); log.debug("Stakeholder: " + stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); return this.stakeholderService.changeVisibility(stakeholder, visibility, propagate); } }