package eu.dnetlib.uoamonitorservice.controllers; import eu.dnetlib.uoamonitorservice.dto.CategoryFull; import eu.dnetlib.uoamonitorservice.entities.Category; import eu.dnetlib.uoamonitorservice.entities.Stakeholder; import eu.dnetlib.uoamonitorservice.entities.Topic; import eu.dnetlib.uoamonitorservice.primitives.Visibility; import eu.dnetlib.uoamonitorservice.service.CategoryService; 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.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @RestController @CrossOrigin(origins = "*") public class CategoryController { private final Logger log = LogManager.getLogger(this.getClass()); private final StakeholderService stakeholderService; private final TopicService topicService; private final CategoryService categoryService; @Autowired public CategoryController(StakeholderService stakeholderService, TopicService topicService, CategoryService categoryService) { this.stakeholderService = stakeholderService; this.topicService = topicService; this.categoryService = categoryService; } /*@PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/{topicId}/save", method = RequestMethod.POST) public Category saveCategory(@PathVariable("stakeholderId") String stakeholderId, @PathVariable("topicId") String topicId, @RequestBody Category categoryFull) { log.debug("save category"); log.debug("Alias: " + categoryFull.getAlias() + " - Id: " + categoryFull.getId() + " - Stakeholder: " + stakeholderId + " - Topic: " + topicId); Stakeholder stakeholder = stakeholderDAO.findById(stakeholderId); if (stakeholder != null) { if (!rolesUtils.hasUpdateAuthority(stakeholder.getType(), stakeholder.getAlias())) { // EXCEPTION - Access denied throw new ForbiddenException("Save Category: You are not authorized to update stakeholder with id: " + stakeholderId); } Category oldCategory = null; if (categoryFull.getId() != null) { oldCategory = categoryDAO.findById(categoryFull.getId()); if (oldCategory == null) { // EXCEPTION - Category not found throw new EntityNotFoundException("save category: Category with id: " + categoryFull.getId() + " not found"); } } Topic topic = topicDAO.findById(topicId); if (topic != null) { if (stakeholder.getTopics().contains(topicId)) { Category category = new Category<>(categoryFull); Date date = new Date(); category.setUpdateDate(date); categoryFull.setUpdateDate(date); List subCategories = new ArrayList<>(); // if category not exists (no id), create a new default subcategory, identical to category if (categoryFull.getId() == null) { category.setCreationDate(date); categoryFull.setCreationDate(date); SubCategory subCategory = new SubCategory<>(); subCategory.createOverviewSubCategory(categoryFull); subCategoryDAO.save(subCategory); List subCategoriesFull = categoryFull.getSubCategories(); subCategoriesFull.add(subCategory); for (SubCategory oldSubCategory : subCategoriesFull) { subCategories.add(oldSubCategory.getId()); } } else { for (String subCategoryId : oldCategory.getSubCategories()) { SubCategory subCategory = subCategoryDAO.findById(subCategoryId); if (subCategory == null) { // EXCEPTION - SubCategory not found throw new EntityNotFoundException("Save category: SubCategory with id: " + subCategoryId + " not found (subcategory exists in category: " + category.getId() + ")"); } subCategories.add(subCategory.getId()); } } category.setSubCategories(subCategories); if (stakeholder.getDefaultId() == null) { if (categoryFull.getId() == null) { categoryDAO.save(category); onSaveDefaultCategory(category, topicId); } else { onUpdateDefaultCategory(category, oldCategory); categoryDAO.save(category); } } else { categoryDAO.save(category); } List categories = topic.getCategories(); int index = categories.indexOf(category.getId()); if (index == -1) { categories.add(category.getId()); topicDAO.save(topic); log.debug("Category saved!"); categoryFull.setId(category.getId()); } } else { // EXCEPTION - Topic not found in Stakeholder: stakeholder.getAlias(); throw new PathNotValidException("Save category: Topic with id: " + topicId + " not found in Stakeholder: " + stakeholderId); } } else { // EXCEPTION - Topic not found throw new EntityNotFoundException("Save category: Topic with id: " + topicId + " not found"); } } else { // EXCEPTION - Stakeholder not found throw new EntityNotFoundException("Save category: Stakeholder with id: " + stakeholderId + " not found"); } return categoryFull; }*/ /*public void onSaveDefaultCategory(Category category, String topicId) { log.debug("On save default category"); List topics = topicDAO.findByDefaultId(topicId); for (Topic topic : topics) { Category categoryNew = new Category(); categoryNew.copyFromDefault(category); categoryDAO.save(categoryNew); List categories = topic.getCategories(); categories.add(categoryNew.getId()); topicDAO.save(topic); } String subCategoryOverviewId = category.getSubCategories().get(0); SubCategory subCategoryOverview = subCategoryDAO.findById(subCategoryOverviewId); subCategoryController.onSaveDefaultSubCategory(subCategoryOverview, category.getId()); }*/ /*public void onUpdateDefaultCategory(Category category, Category oldCategory) { log.debug("On update default category"); List categories = categoryDAO.findByDefaultId(category.getId()); boolean changed = false; for (Category categoryBasedOnDefault : categories) { if (category.getName() != null && !category.getName().equals(categoryBasedOnDefault.getName()) && (oldCategory.getName() == null || oldCategory.getName().equals(categoryBasedOnDefault.getName()))) { categoryBasedOnDefault.setName(category.getName()); categoryBasedOnDefault.setAlias(category.getAlias()); changed = true; } if (category.getDescription() != null && !category.getDescription().equals(categoryBasedOnDefault.getDescription()) && (oldCategory.getDescription() == null || oldCategory.getDescription().equals(categoryBasedOnDefault.getDescription()))) { categoryBasedOnDefault.setDescription(category.getDescription()); changed = true; } if (!changed) { continue; } categoryBasedOnDefault.setUpdateDate(category.getUpdateDate()); categoryDAO.save(categoryBasedOnDefault); } }*/ @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/delete", method = RequestMethod.DELETE) public boolean deleteCategory(@PathVariable("stakeholderId") String stakeholderId, @PathVariable("topicId") String topicId, @PathVariable("categoryId") String categoryId, @RequestParam(required = false) String children) { log.debug("delete category"); log.debug("Id: " + categoryId + " - Stakeholder: " + stakeholderId + " - Topic: " + topicId); Stakeholder stakeholder = this.stakeholderService.findById(stakeholderId); Topic topic = this.topicService.findByPath(stakeholder, topicId); Category category = this.categoryService.findByPath(topic, categoryId); this.categoryService.delete(stakeholder.getType(), category, true); return true; } /*@PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/{topicId}/reorder", method = RequestMethod.POST) public List reorderCategories(@PathVariable("stakeholderId") String stakeholderId, @PathVariable("topicId") String topicId, @RequestBody List categories) { log.debug("reorder categories"); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId); Topic topic = checkForExceptions(stakeholderId, topicId); List oldCategories = topic.getCategories(); for (String categoryId : oldCategories) { if (!categories.contains(categoryId)) { categories.add(categoryId); } } topic.setCategories(categories); List categoriesFull = new ArrayList<>(); for (String categoryId : categories) { Category category = categoryDAO.findById(categoryId); if (category == null) { // EXCEPTION - Category not found throw new EntityNotFoundException("Reorder Categories: Category with id: " + categoryId + " not found"); } categoriesFull.add(category); } topicDAO.save(topic); log.debug("Categories reordered!"); return categoriesFull; }*/ @PreAuthorize("isAuthenticated()") @RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/change-visibility", method = RequestMethod.POST) public CategoryFull changeCategoryVisibility(@PathVariable("stakeholderId") String stakeholderId, @PathVariable("topicId") String topicId, @PathVariable("categoryId") String categoryId, @RequestParam("visibility") Visibility visibility, @RequestParam(defaultValue = "false") Boolean propagate) { log.debug("change category visibility: " + visibility + " - toggle propagate: " + propagate); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId); Stakeholder stakeholder = this.stakeholderService.findById(stakeholderId); Topic topic = this.topicService.findByPath(stakeholder, topicId); Category category = this.categoryService.findByPath(topic, categoryId); return this.categoryService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), category, visibility, propagate); } }