Add a field overrides in stakeholder in order to override inside entitities fields in case of references. Currently used only for visibilities.

This commit is contained in:
Konstantinos Triantafyllou 2024-11-05 15:58:11 +02:00
parent d599b7bb2d
commit 6e68a5ece8
15 changed files with 329 additions and 118 deletions

View File

@ -84,8 +84,14 @@ public class CategoryController {
log.debug("change category visibility: " + visibility + " - toggle propagate: " + propagate); log.debug("change category visibility: " + visibility + " - toggle propagate: " + propagate);
log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
Topic topic = this.topicService.findByPath(stakeholder, topicId); if(stakeholder.isCopy() || stakeholder.getDefaultId() == null) {
Category category = this.categoryService.findByPath(topic, categoryId); Topic topic = this.topicService.findByPath(stakeholder, topicId);
return ResponseEntity.ok(this.categoryService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), category, visibility, propagate)); Category category = this.categoryService.findByPath(topic, categoryId);
return ResponseEntity.ok(this.categoryService.changeVisibility(stakeholder, category, visibility, propagate));
} else {
Topic topic = this.topicService.findByPath(this.stakeholderService.findByPath(stakeholder.getDefaultId()), topicId);
Category category = this.categoryService.findByPath(topic, categoryId);
return ResponseEntity.ok(this.categoryService.changeVisibility(stakeholder, category, visibility, propagate, stakeholderService));
}
} }
} }

View File

@ -127,11 +127,20 @@ public class IndicatorController {
log.debug("change indicator visibility: " + visibility); log.debug("change indicator visibility: " + visibility);
log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId + " - SubCategory: " + subcategoryId + " - Section: " + sectionId + " - Indicator: " + indicatorId); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId + " - SubCategory: " + subcategoryId + " - Section: " + sectionId + " - Indicator: " + indicatorId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
Topic topic = this.topicService.findByPath(stakeholder, topicId); if(stakeholder.isCopy() || stakeholder.getDefaultId() == null) {
Category category = this.categoryService.findByPath(topic, categoryId); Topic topic = this.topicService.findByPath(stakeholder, topicId);
SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId); Category category = this.categoryService.findByPath(topic, categoryId);
Section section = this.sectionService.findByPath(subCategory, sectionId); SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId);
Indicator indicator = this.indicatorService.findByPath(section, indicatorId); Section section = this.sectionService.findByPath(subCategory, sectionId);
return ResponseEntity.ok(this.indicatorService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), indicator, visibility)); Indicator indicator = this.indicatorService.findByPath(section, indicatorId);
return ResponseEntity.ok(this.indicatorService.changeVisibility(stakeholder, indicator, visibility));
} else {
Topic topic = this.topicService.findByPath(this.stakeholderService.findByPath(stakeholder.getDefaultId()), topicId);
Category category = this.categoryService.findByPath(topic, categoryId);
SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId);
Section section = this.sectionService.findByPath(subCategory, sectionId);
Indicator indicator = this.indicatorService.findByPath(section, indicatorId);
return ResponseEntity.ok(this.indicatorService.changeVisibility(stakeholder, indicator, visibility, stakeholderService));
}
} }
} }

View File

@ -47,7 +47,7 @@ public class SubCategoryController {
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
Topic topic = this.topicService.findByPath(stakeholder, topicId); Topic topic = this.topicService.findByPath(stakeholder, topicId);
Category category = this.categoryService.findByPath(topic, categoryId); Category category = this.categoryService.findByPath(topic, categoryId);
if(subcategoryFull.getId() != null) { if (subcategoryFull.getId() != null) {
this.subCategoryService.findByPath(category, subcategoryFull.getId()); this.subCategoryService.findByPath(category, subcategoryFull.getId());
} }
return ResponseEntity.ok(this.subCategoryService.save(stakeholder, category, new SubCategory(subcategoryFull))); return ResponseEntity.ok(this.subCategoryService.save(stakeholder, category, new SubCategory(subcategoryFull)));
@ -56,10 +56,10 @@ public class SubCategoryController {
@PreAuthorize("isAuthenticated()") @PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/{subcategoryId}/delete", method = RequestMethod.DELETE) @RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/{subcategoryId}/delete", method = RequestMethod.DELETE)
public ResponseEntity<Boolean> deleteSubCategory(@PathVariable("stakeholderId") String stakeholderId, public ResponseEntity<Boolean> deleteSubCategory(@PathVariable("stakeholderId") String stakeholderId,
@PathVariable("topicId") String topicId, @PathVariable("topicId") String topicId,
@PathVariable("categoryId") String categoryId, @PathVariable("categoryId") String categoryId,
@PathVariable("subcategoryId") String subcategoryId, @PathVariable("subcategoryId") String subcategoryId,
@RequestParam(required = false, name = "children") String children) { @RequestParam(required = false, name = "children") String children) {
log.debug("delete subcategory"); log.debug("delete subcategory");
log.debug("Id: " + subcategoryId + " - Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId); log.debug("Id: " + subcategoryId + " - Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
@ -73,9 +73,9 @@ public class SubCategoryController {
@PreAuthorize("isAuthenticated()") @PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/reorder", method = RequestMethod.POST) @RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/reorder", method = RequestMethod.POST)
public ResponseEntity<List<SubCategoryFull>> reorderSubCategories(@PathVariable("stakeholderId") String stakeholderId, public ResponseEntity<List<SubCategoryFull>> reorderSubCategories(@PathVariable("stakeholderId") String stakeholderId,
@PathVariable("topicId") String topicId, @PathVariable("topicId") String topicId,
@PathVariable("categoryId") String categoryId, @PathVariable("categoryId") String categoryId,
@RequestBody List<String> subCategories) { @RequestBody List<String> subCategories) {
log.debug("reorder subCategories"); log.debug("reorder subCategories");
log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
@ -87,17 +87,24 @@ public class SubCategoryController {
@PreAuthorize("isAuthenticated()") @PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/{subcategoryId}/change-visibility", method = RequestMethod.POST) @RequestMapping(value = "/{stakeholderId}/{topicId}/{categoryId}/{subcategoryId}/change-visibility", method = RequestMethod.POST)
public ResponseEntity<SubCategoryFull> changeSubCategoryVisibility(@PathVariable("stakeholderId") String stakeholderId, public ResponseEntity<SubCategoryFull> changeSubCategoryVisibility(@PathVariable("stakeholderId") String stakeholderId,
@PathVariable("topicId") String topicId, @PathVariable("topicId") String topicId,
@PathVariable("categoryId") String categoryId, @PathVariable("categoryId") String categoryId,
@PathVariable("subcategoryId") String subcategoryId, @PathVariable("subcategoryId") String subcategoryId,
@RequestParam("visibility") Visibility visibility, @RequestParam("visibility") Visibility visibility,
@RequestParam(defaultValue = "false", name = "propagate") Boolean propagate) { @RequestParam(defaultValue = "false", name = "propagate") Boolean propagate) {
log.debug("change subCategory visibility: " + visibility + " - toggle propagate: " + propagate); log.debug("change subCategory visibility: " + visibility + " - toggle propagate: " + propagate);
log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId + " - SubCategory: " + subcategoryId); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId + " - Category: " + categoryId + " - SubCategory: " + subcategoryId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
Topic topic = this.topicService.findByPath(stakeholder, topicId); if (stakeholder.isCopy() || stakeholder.getDefaultId() == null) {
Category category = this.categoryService.findByPath(topic, categoryId); Topic topic = this.topicService.findByPath(stakeholder, topicId);
SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId); Category category = this.categoryService.findByPath(topic, categoryId);
return ResponseEntity.ok(this.subCategoryService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), subCategory, visibility, propagate)); SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId);
return ResponseEntity.ok(this.subCategoryService.changeVisibility(stakeholder, subCategory, visibility, propagate));
} else {
Topic topic = this.topicService.findByPath(this.stakeholderService.findByPath(stakeholder.getDefaultId()), topicId);
Category category = this.categoryService.findByPath(topic, categoryId);
SubCategory subCategory = this.subCategoryService.findByPath(category, subcategoryId);
return ResponseEntity.ok(this.subCategoryService.changeVisibility(stakeholder, subCategory, visibility, propagate, stakeholderService));
}
} }
} }

View File

@ -72,7 +72,12 @@ public class TopicController {
log.debug("change topic visibility: " + visibility + " - toggle propagate: " + propagate); log.debug("change topic visibility: " + visibility + " - toggle propagate: " + propagate);
log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId); log.debug("Stakeholder: " + stakeholderId + " - Topic: " + topicId);
Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId); Stakeholder stakeholder = this.stakeholderService.findByPath(stakeholderId);
Topic topic = this.topicService.findByPath(stakeholder, topicId); if(stakeholder.isCopy() || stakeholder.getDefaultId() == null) {
return ResponseEntity.ok(this.topicService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), topic, visibility, propagate)); Topic topic = this.topicService.findByPath(stakeholder, topicId);
return ResponseEntity.ok(this.topicService.changeVisibility(stakeholder, topic, visibility, propagate));
} else {
Topic topic = this.topicService.findByPath(this.stakeholderService.findByPath(stakeholder.getDefaultId()), topicId);
return ResponseEntity.ok(this.topicService.changeVisibility(stakeholder, topic, visibility, propagate, stakeholderService));
}
} }
} }

View File

@ -3,7 +3,6 @@ package eu.dnetlib.uoamonitorservice.entities;
import eu.dnetlib.uoamonitorservice.dto.CategoryFull; import eu.dnetlib.uoamonitorservice.dto.CategoryFull;
import eu.dnetlib.uoamonitorservice.generics.CategoryGeneric; import eu.dnetlib.uoamonitorservice.generics.CategoryGeneric;
import eu.dnetlib.uoamonitorservice.generics.Common; import eu.dnetlib.uoamonitorservice.generics.Common;
import eu.dnetlib.uoamonitorservice.generics.TopicGeneric;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,15 +1,10 @@
package eu.dnetlib.uoamonitorservice.entities; package eu.dnetlib.uoamonitorservice.entities;
import eu.dnetlib.uoamonitorservice.dto.StakeholderFull; import eu.dnetlib.uoamonitorservice.dto.StakeholderFull;
import eu.dnetlib.uoamonitorservice.generics.Common;
import eu.dnetlib.uoamonitorservice.generics.StakeholderGeneric; import eu.dnetlib.uoamonitorservice.generics.StakeholderGeneric;
import eu.dnetlib.uoamonitorservice.primitives.Umbrella;
import eu.dnetlib.uoamonitorservice.service.StakeholderService; import eu.dnetlib.uoamonitorservice.service.StakeholderService;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Objects;
import java.util.stream.Collectors;
@Document @Document
public class Stakeholder extends StakeholderGeneric<String, String> { public class Stakeholder extends StakeholderGeneric<String, String> {

View File

@ -1,12 +1,15 @@
package eu.dnetlib.uoamonitorservice.generics; package eu.dnetlib.uoamonitorservice.generics;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import eu.dnetlib.uoamonitorservice.entities.Stakeholder;
import eu.dnetlib.uoamonitorservice.primitives.Visibility; import eu.dnetlib.uoamonitorservice.primitives.Visibility;
import eu.dnetlib.uoamonitorservice.utils.GenericAccessor;
import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.annotation.LastModifiedDate;
import java.util.Date; import java.util.Date;
import java.util.Map;
public class Common { public class Common {
@Id @Id
@ -20,7 +23,7 @@ public class Common {
protected String name; protected String name;
protected String description; protected String description;
protected String alias; protected String alias;
protected Visibility visibility = Visibility.PRIVATE; protected Visibility visibility;
public void update(Common common) { public void update(Common common) {
this.id = common.getId(); this.id = common.getId();
@ -104,4 +107,8 @@ public class Common {
public void setVisibility(Visibility visibility) { public void setVisibility(Visibility visibility) {
this.visibility = visibility; this.visibility = visibility;
} }
public void override(Stakeholder stakeholder) {
stakeholder.getOverride(this.id).forEach((field, value) -> GenericAccessor.setField(this, field, value));
}
} }

View File

@ -5,10 +5,7 @@ import eu.dnetlib.uoamonitorservice.primitives.Locale;
import eu.dnetlib.uoamonitorservice.primitives.StakeholderType; import eu.dnetlib.uoamonitorservice.primitives.StakeholderType;
import eu.dnetlib.uoamonitorservice.primitives.Umbrella; import eu.dnetlib.uoamonitorservice.primitives.Umbrella;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Optional;
public class StakeholderGeneric<T, S> extends Common { public class StakeholderGeneric<T, S> extends Common {
protected StakeholderType type; protected StakeholderType type;
@ -25,6 +22,7 @@ public class StakeholderGeneric<T, S> extends Common {
protected Boolean copy; protected Boolean copy;
protected List<T> topics = new ArrayList<>(); protected List<T> topics = new ArrayList<>();
protected Umbrella<S> umbrella; protected Umbrella<S> umbrella;
protected Map<String, Map<String, Object>> overrides;
public StakeholderGeneric() { public StakeholderGeneric() {
} }
@ -45,10 +43,13 @@ public class StakeholderGeneric<T, S> extends Common {
defaultId = stakeholder.getDefaultId(); defaultId = stakeholder.getDefaultId();
setLocale(stakeholder.getLocale()); setLocale(stakeholder.getLocale());
setVisibility(stakeholder.getVisibility()); setVisibility(stakeholder.getVisibility());
this.funderType = stakeholder.getFunderType(); funderType = stakeholder.getFunderType();
this.copy = stakeholder.isCopy(); copy = stakeholder.isCopy();
this.standalone = stakeholder.isStandalone(); if(!copy) {
this.overrides = new HashMap<>();
}
creationDate = stakeholder.getCreationDate(); creationDate = stakeholder.getCreationDate();
standalone = stakeholder.isStandalone();
updateDate = stakeholder.getUpdateDate(); updateDate = stakeholder.getUpdateDate();
} }
@ -171,6 +172,15 @@ public class StakeholderGeneric<T, S> extends Common {
this.topics = topics; this.topics = topics;
} }
@JsonIgnore
public Map<String, Map<String, Object>> getOverrides() {
return overrides;
}
public void setOverrides(Map<String, Map<String, Object>> overrides) {
this.overrides = overrides;
}
public Umbrella<S> getUmbrella() { public Umbrella<S> getUmbrella() {
return umbrella; return umbrella;
} }
@ -183,4 +193,17 @@ public class StakeholderGeneric<T, S> extends Common {
public void setUmbrella(Umbrella<S> umbrella) { public void setUmbrella(Umbrella<S> umbrella) {
this.umbrella =umbrella; this.umbrella =umbrella;
} }
public Map<String, Object> getOverride(String id) {
if(this.overrides == null) {
this.overrides = new HashMap<>();
}
return this.overrides.computeIfAbsent(id, k -> new HashMap<>());
}
public <V> void setOverride(String id, String field, V value) {
if(!this.copy && this.defaultId != null) {
this.getOverride(id).put(field, value);
}
}
} }

View File

@ -14,7 +14,6 @@ import eu.dnetlib.uoamonitorservice.primitives.Visibility;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -49,19 +48,20 @@ public class CategoryService {
return this.dao.findById(categoryId).orElseThrow(() -> new NotFoundException("Category with id: " + categoryId + " not found")); return this.dao.findById(categoryId).orElseThrow(() -> new NotFoundException("Category with id: " + categoryId + " not found"));
} }
public CategoryFull getFullCategory(String type, String alias, Category category) { public CategoryFull getFullCategory(Stakeholder stakeholder, Category category) {
if (commonService.hasVisibilityAuthority(type, alias, category)) { category.override(stakeholder);
if (commonService.hasVisibilityAuthority(stakeholder.getType(), stakeholder.getAlias(), category)) {
return new CategoryFull(category, category.getSubCategories().stream() return new CategoryFull(category, category.getSubCategories().stream()
.map(subCategoryId -> this.subCategoryService.getFullSubCategory(type, alias, subCategoryId)) .map(subCategoryId -> this.subCategoryService.getFullSubCategory(stakeholder, subCategoryId))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} else { } else {
return null; return null;
} }
} }
public CategoryFull getFullCategory(String type, String alias, String categoryId) { public CategoryFull getFullCategory(Stakeholder stakeholder, String categoryId) {
Category category = this.find(categoryId); Category category = this.find(categoryId);
return this.getFullCategory(type, alias, category); return this.getFullCategory(stakeholder, category);
} }
public String build(String id) { public String build(String id) {
@ -81,7 +81,7 @@ public class CategoryService {
} }
public Category save(Category category) { public Category save(Category category) {
if(category.getId() != null) { if (category.getId() != null) {
category.setSubCategories(this.find(category.getId()).getSubCategories()); category.setSubCategories(this.find(category.getId()).getSubCategories());
} else { } else {
category.setCreationDate(new Date()); category.setCreationDate(new Date());
@ -108,7 +108,7 @@ public class CategoryService {
if (this.commonService.hasCreateAuthority(stakeholder.getType())) { if (this.commonService.hasCreateAuthority(stakeholder.getType())) {
category = this.save(category); category = this.save(category);
this.createChildren(topic, category); this.createChildren(topic, category);
if(createOverview) { if (createOverview) {
this.subCategoryService.save(stakeholder, category, category.createOverview()); this.subCategoryService.save(stakeholder, category, category.createOverview());
} }
this.addCategory(topic, category.getId()); this.addCategory(topic, category.getId());
@ -116,7 +116,7 @@ public class CategoryService {
this.commonService.unauthorized("You are not authorized to create a category in stakeholder with id: " + stakeholder.getId()); this.commonService.unauthorized("You are not authorized to create a category in stakeholder with id: " + stakeholder.getId());
} }
} }
return this.getFullCategory(stakeholder.getType(), stakeholder.getAlias(), category); return this.getFullCategory(stakeholder, category);
} }
public void createChildren(Topic defaultTopic, Category category) { public void createChildren(Topic defaultTopic, Category category) {
@ -134,13 +134,13 @@ public class CategoryService {
} }
public CategoryFull reorderSubCategories(Stakeholder stakeholder, Category category, List<String> subcategories) { public CategoryFull reorderSubCategories(Stakeholder stakeholder, Category category, List<String> subcategories) {
if(this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
subcategories.forEach(this.subCategoryService::find); subcategories.forEach(this.subCategoryService::find);
if (category.getSubCategories().size() == subcategories.size() && new HashSet<>(category.getSubCategories()).containsAll(subcategories)) { if (category.getSubCategories().size() == subcategories.size() && new HashSet<>(category.getSubCategories()).containsAll(subcategories)) {
category.setSubCategories(subcategories); category.setSubCategories(subcategories);
category.setUpdateDate(new Date()); category.setUpdateDate(new Date());
this.reorderChildren(stakeholder, category, subcategories); this.reorderChildren(stakeholder, category, subcategories);
return this.getFullCategory(stakeholder.getType(), stakeholder.getAlias(), this.dao.save(category)); return this.getFullCategory(stakeholder, this.dao.save(category));
} else { } else {
throw new NotFoundException("Some subCategories dont exist in the category with id " + category.getId()); throw new NotFoundException("Some subCategories dont exist in the category with id " + category.getId());
} }
@ -152,7 +152,7 @@ public class CategoryService {
public void reorderChildren(Stakeholder defaultStakeholder, Category defaultCategory, List<String> defaultSubCategories) { public void reorderChildren(Stakeholder defaultStakeholder, Category defaultCategory, List<String> defaultSubCategories) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> { this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> {
this.dao.findByDefaultId(defaultCategory.getId()).stream().map(category -> this.getFullCategory(stakeholder.getType(), stakeholder.getAlias(), category)).forEach(category -> { this.dao.findByDefaultId(defaultCategory.getId()).stream().map(category -> this.getFullCategory(stakeholder, category)).forEach(category -> {
this.reorderSubCategories(stakeholder, new Category(category), this.reorderSubCategories(stakeholder, new Category(category),
this.commonService.reorder(defaultSubCategories, category.getSubCategories().stream().map(subCategory -> (Common) subCategory).collect(Collectors.toList()))); this.commonService.reorder(defaultSubCategories, category.getSubCategories().stream().map(subCategory -> (Common) subCategory).collect(Collectors.toList())));
}); });
@ -195,12 +195,12 @@ public class CategoryService {
}); });
} }
public CategoryFull changeVisibility(String type, String alias, CategoryFull category, Visibility visibility, Boolean propagate) { public CategoryFull changeVisibility(Stakeholder stakeholder, CategoryFull category, Visibility visibility, Boolean propagate) {
if (this.commonService.hasEditAuthority(type, alias)) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
category.setVisibility(visibility); category.setVisibility(visibility);
if (propagate) { if (propagate) {
category.setSubCategories(category.getSubCategories().stream() category.setSubCategories(category.getSubCategories().stream()
.map(subCategory -> this.subCategoryService.changeVisibility(type, alias, subCategory, visibility, true)) .map(subCategory -> this.subCategoryService.changeVisibility(stakeholder, subCategory, visibility, true))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
category.update(this.save(new Category(category))); category.update(this.save(new Category(category)));
@ -211,8 +211,30 @@ public class CategoryService {
return null; return null;
} }
public CategoryFull changeVisibility(String type, String alias, Category category, Visibility visibility, Boolean propagate) { public CategoryFull changeVisibility(Stakeholder stakeholder, Category category, Visibility visibility, Boolean propagate) {
CategoryFull categoryFull = this.getFullCategory(type, alias, category); CategoryFull categoryFull = this.getFullCategory(stakeholder, category);
return this.changeVisibility(type, alias, categoryFull, visibility, propagate); return this.changeVisibility(stakeholder, categoryFull, visibility, propagate);
}
public CategoryFull changeVisibility(Stakeholder stakeholder, CategoryFull category, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
category.setVisibility(visibility);
stakeholder.setOverride(category.getId(), "visibility", visibility);
Stakeholder saved = stakeholderService.save(stakeholder);
if (propagate) {
category.setSubCategories(category.getSubCategories().stream()
.map(subCategory -> this.subCategoryService.changeVisibility(saved, subCategory, visibility, true, stakeholderService))
.collect(Collectors.toList()));
}
return category;
} else {
this.commonService.unauthorized("Change category visibility: You are not authorized to update category with id: " + category.getId());
}
return null;
}
public CategoryFull changeVisibility(Stakeholder stakeholder, Category category, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
CategoryFull categoryFull = this.getFullCategory(stakeholder, category);
return this.changeVisibility(stakeholder, categoryFull, visibility, propagate, stakeholderService);
} }
} }

View File

@ -26,7 +26,7 @@ public class IndicatorService {
private final CommonService commonService; private final CommonService commonService;
@Autowired @Autowired
public IndicatorService(StakeholderDAO stakeholderDAO, TopicDAO topicDAO, CategoryDAO categoryDAO,SubCategoryDAO subCategoryDAO, public IndicatorService(StakeholderDAO stakeholderDAO, TopicDAO topicDAO, CategoryDAO categoryDAO, SubCategoryDAO subCategoryDAO,
SectionDAO sectionDAO, IndicatorDAO dao, CommonService commonService) { SectionDAO sectionDAO, IndicatorDAO dao, CommonService commonService) {
this.stakeholderDAO = stakeholderDAO; this.stakeholderDAO = stakeholderDAO;
this.topicDAO = topicDAO; this.topicDAO = topicDAO;
@ -48,9 +48,10 @@ public class IndicatorService {
return this.dao.findById(indicatorId).orElseThrow(() -> new NotFoundException("Indicator with id: " + indicatorId + " not found")); return this.dao.findById(indicatorId).orElseThrow(() -> new NotFoundException("Indicator with id: " + indicatorId + " not found"));
} }
public Indicator getIndicator(String type, String alias, String id) { public Indicator getIndicator(Stakeholder stakeholder, String id) {
Indicator indicator = this.find(id); Indicator indicator = this.find(id);
if(this.commonService.hasVisibilityAuthority(type, alias, indicator)) { indicator.override(stakeholder);
if (this.commonService.hasVisibilityAuthority(stakeholder.getType(), stakeholder.getAlias(), indicator)) {
return indicator; return indicator;
} else { } else {
return null; return null;
@ -68,7 +69,7 @@ public class IndicatorService {
} }
public Indicator save(Indicator indicator) { public Indicator save(Indicator indicator) {
if(indicator.getId() == null) { if (indicator.getId() == null) {
indicator.setCreationDate(new Date()); indicator.setCreationDate(new Date());
} }
indicator.setUpdateDate(new Date()); indicator.setUpdateDate(new Date());
@ -76,7 +77,7 @@ public class IndicatorService {
} }
public Indicator save(Stakeholder stakeholder, Section section, Indicator indicator) { public Indicator save(Stakeholder stakeholder, Section section, Indicator indicator) {
if(indicator.getId() != null) { if (indicator.getId() != null) {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
this.updateChildren(indicator); this.updateChildren(indicator);
indicator = this.save(indicator); indicator = this.save(indicator);
@ -118,11 +119,11 @@ public class IndicatorService {
} }
public void delete(String type, Indicator indicator, boolean remove) { public void delete(String type, Indicator indicator, boolean remove) {
if(this.commonService.hasDeleteAuthority(type)) { if (this.commonService.hasDeleteAuthority(type)) {
this.dao.findByDefaultId(indicator.getId()).forEach(child -> { this.dao.findByDefaultId(indicator.getId()).forEach(child -> {
this.delete(type, child.getId(), remove); this.delete(type, child.getId(), remove);
}); });
if(remove) { if (remove) {
this.removeIndicator(indicator.getId()); this.removeIndicator(indicator.getId());
} }
this.dao.delete(indicator); this.dao.delete(indicator);
@ -144,15 +145,15 @@ public class IndicatorService {
} }
public void removeIndicator(String id) { public void removeIndicator(String id) {
this.sectionDAO.findByIndicator(id).forEach(section -> { this.sectionDAO.findByIndicator(id).forEach(section -> {
section.removeIndicator(id); section.removeIndicator(id);
section.setUpdateDate(new Date()); section.setUpdateDate(new Date());
this.sectionDAO.save(section); this.sectionDAO.save(section);
}); });
} }
public Indicator changeVisibility(String type, String alias, Indicator indicator, Visibility visibility) { public Indicator changeVisibility(Stakeholder stakeholder, Indicator indicator, Visibility visibility) {
if(this.commonService.hasEditAuthority(type, alias)) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
indicator.setVisibility(visibility); indicator.setVisibility(visibility);
return this.save(indicator); return this.save(indicator);
} else { } else {
@ -160,4 +161,16 @@ public class IndicatorService {
} }
return null; return null;
} }
public Indicator changeVisibility(Stakeholder stakeholder, Indicator indicator, Visibility visibility, StakeholderService stakeholderService) {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
indicator.setVisibility(visibility);
stakeholder.setOverride(indicator.getId(), "visibility", visibility);
stakeholderService.save(stakeholder);
return indicator;
} else {
this.commonService.unauthorized("Change section visibility: You are not authorized to update section with id: " + indicator.getId());
}
return null;
}
} }

View File

@ -51,15 +51,16 @@ public class SectionService {
return this.dao.findById(sectionId).orElseThrow(() -> new NotFoundException("Section with id: " + sectionId + " not found")); return this.dao.findById(sectionId).orElseThrow(() -> new NotFoundException("Section with id: " + sectionId + " not found"));
} }
public SectionFull getFullSection(String type, String alias, Section section) { public SectionFull getFullSection(Stakeholder stakeholder, Section section) {
section.override(stakeholder);
return new SectionFull(section, section.getIndicators().stream() return new SectionFull(section, section.getIndicators().stream()
.map(indicatorId -> this.indicatorService.getIndicator(type, alias, indicatorId)) .map(indicatorId -> this.indicatorService.getIndicator(stakeholder, indicatorId))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
public SectionFull getFullSection(String type, String alias, String id) { public SectionFull getFullSection(Stakeholder stakeholder, String id) {
Section section = this.find(id); Section section = this.find(id);
return this.getFullSection(type, alias, section); return this.getFullSection(stakeholder, section);
} }
public SectionFull saveFull(SectionFull sectionFull) { public SectionFull saveFull(SectionFull sectionFull) {
@ -125,7 +126,7 @@ public class SectionService {
this.commonService.unauthorized("You are not authorized to create a section in stakeholder with id: " + stakeholder.getId()); this.commonService.unauthorized("You are not authorized to create a section in stakeholder with id: " + stakeholder.getId());
} }
} }
return this.getFullSection(stakeholder.getType(), stakeholder.getAlias(), section); return this.getFullSection(stakeholder, section);
} }
public void createChildren(SubCategory defaultSubCategory, Section section, int index) { public void createChildren(SubCategory defaultSubCategory, Section section, int index) {
@ -162,7 +163,7 @@ public class SectionService {
if (reorderChildren) { if (reorderChildren) {
this.reorderChildren(stakeholder, section, indicators); this.reorderChildren(stakeholder, section, indicators);
} }
return this.getFullSection(stakeholder.getType(), stakeholder.getAlias(), this.dao.save(section)); return this.getFullSection(stakeholder, this.dao.save(section));
} else { } else {
throw new NotFoundException("Some indicators dont exist in the section with id " + section.getId()); throw new NotFoundException("Some indicators dont exist in the section with id " + section.getId());
} }
@ -174,7 +175,7 @@ public class SectionService {
public void reorderChildren(Stakeholder defaultStakeholder, Section defaultSection, List<String> defaultIndicators) { public void reorderChildren(Stakeholder defaultStakeholder, Section defaultSection, List<String> defaultIndicators) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder ->
this.dao.findByDefaultId(defaultSection.getId()).stream().map(section -> this.getFullSection(stakeholder.getType(), stakeholder.getAlias(), section)).forEach(section -> this.dao.findByDefaultId(defaultSection.getId()).stream().map(section -> this.getFullSection(stakeholder, section)).forEach(section ->
this.reorderIndicators(stakeholder, new Section(section), this.commonService.reorder(defaultIndicators, section.getIndicators().stream().map(indicator -> (Common) indicator).collect(Collectors.toList()))) this.reorderIndicators(stakeholder, new Section(section), this.commonService.reorder(defaultIndicators, section.getIndicators().stream().map(indicator -> (Common) indicator).collect(Collectors.toList())))
) )
); );
@ -229,10 +230,10 @@ public class SectionService {
}); });
} }
public SectionFull changeVisibility(String type, String alias, SectionFull section, Visibility visibility) { public SectionFull changeVisibility(Stakeholder stakeholder, SectionFull section, Visibility visibility) {
if (this.commonService.hasEditAuthority(type, alias)) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
section.setIndicators(section.getIndicators().stream() section.setIndicators(section.getIndicators().stream()
.map(indicator -> this.indicatorService.changeVisibility(type, alias, indicator, visibility)) .map(indicator -> this.indicatorService.changeVisibility(stakeholder, indicator, visibility))
.collect(Collectors.toList())); .collect(Collectors.toList()));
section.update(this.save(new Section(section))); section.update(this.save(new Section(section)));
return section; return section;
@ -241,4 +242,16 @@ public class SectionService {
} }
return null; return null;
} }
public SectionFull changeVisibility(Stakeholder stakeholder, SectionFull section, Visibility visibility, StakeholderService stakeholderService) {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
section.setIndicators(section.getIndicators().stream()
.map(indicator -> this.indicatorService.changeVisibility(stakeholder, indicator, visibility, stakeholderService))
.collect(Collectors.toList()));
return section;
} else {
this.commonService.unauthorized("Change section visibility: You are not authorized to update section with id: " + section.getId());
}
return null;
}
} }

View File

@ -88,13 +88,13 @@ public class StakeholderService {
public StakeholderFull getFullStakeholder(Stakeholder stakeholder) { public StakeholderFull getFullStakeholder(Stakeholder stakeholder) {
List<TopicFull> topics = stakeholder.getTopics().stream() List<TopicFull> topics = stakeholder.getTopics().stream()
.map(topicId -> topicService.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), topicId)) .map(topicId -> topicService.getFullTopic(stakeholder, topicId))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!stakeholder.isCopy() && stakeholder.getDefaultId() != null) { if (!stakeholder.isCopy() && stakeholder.getDefaultId() != null) {
Stakeholder defaultStakeholder = this.findByPath(stakeholder.getDefaultId()); Stakeholder defaultStakeholder = this.findByPath(stakeholder.getDefaultId());
if (defaultStakeholder != null) { if (defaultStakeholder != null) {
topics = defaultStakeholder.getTopics().stream() topics = defaultStakeholder.getTopics().stream()
.map(topicId -> topicService.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), topicId)) .map(topicId -> topicService.getFullTopic(stakeholder, topicId))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
} }
@ -148,6 +148,9 @@ public class StakeholderService {
public Stakeholder save(Stakeholder stakeholder) { public Stakeholder save(Stakeholder stakeholder) {
if (stakeholder.getId() != null) { if (stakeholder.getId() != null) {
Stakeholder old = this.findByPath(stakeholder.getId()); Stakeholder old = this.findByPath(stakeholder.getId());
if(stakeholder.getOverrides() == null) {
stakeholder.setOverrides(old.getOverrides());
}
stakeholder.setUmbrella(old.getUmbrella()); stakeholder.setUmbrella(old.getUmbrella());
stakeholder.setStandalone(old.isStandalone()); stakeholder.setStandalone(old.isStandalone());
stakeholder.setDefaultId(old.getDefaultId()); stakeholder.setDefaultId(old.getDefaultId());
@ -162,6 +165,7 @@ public class StakeholderService {
if (defaultStakeholder != null) { if (defaultStakeholder != null) {
stakeholder.setTopics(defaultStakeholder.getTopics().stream().map(this.topicService::build).collect(Collectors.toList())); stakeholder.setTopics(defaultStakeholder.getTopics().stream().map(this.topicService::build).collect(Collectors.toList()));
} }
stakeholder.setOverrides(new HashMap<>());
} }
stakeholder.getTopics().forEach(this.topicService::find); stakeholder.getTopics().forEach(this.topicService::find);
} }
@ -224,7 +228,7 @@ public class StakeholderService {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
if (propagate) { if (propagate) {
stakeholder.setTopics(stakeholder.getTopics().stream(). stakeholder.setTopics(stakeholder.getTopics().stream().
map(topic -> this.topicService.changeVisibility(stakeholder.getType(), stakeholder.getAlias(), topic, visibility, true)) map(topic -> this.topicService.changeVisibility(new Stakeholder(stakeholder, this), topic, visibility, true))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
stakeholder.setVisibility(visibility); stakeholder.setVisibility(visibility);

View File

@ -53,22 +53,23 @@ public class SubCategoryService {
return this.dao.findById(subcategoryId).orElseThrow(() -> new NotFoundException("SubCategory with id: " + subcategoryId + " not found")); return this.dao.findById(subcategoryId).orElseThrow(() -> new NotFoundException("SubCategory with id: " + subcategoryId + " not found"));
} }
public SubCategoryFull getFullSubCategory(String type, String alias, SubCategory subCategory) { public SubCategoryFull getFullSubCategory(Stakeholder stakeholder, SubCategory subCategory) {
if(commonService.hasVisibilityAuthority(type, alias, subCategory)) { subCategory.override(stakeholder);
if(commonService.hasVisibilityAuthority(stakeholder.getType(), stakeholder.getAlias(), subCategory)) {
return new SubCategoryFull(subCategory, subCategory.getNumbers().stream() return new SubCategoryFull(subCategory, subCategory.getNumbers().stream()
.map(sectionId -> this.sectionService.getFullSection(type, alias, sectionId)) .map(sectionId -> this.sectionService.getFullSection(stakeholder, sectionId))
.collect(Collectors.toList()), .collect(Collectors.toList()),
subCategory.getCharts().stream() subCategory.getCharts().stream()
.map(sectionId -> this.sectionService.getFullSection(type, alias, sectionId)) .map(sectionId -> this.sectionService.getFullSection(stakeholder, sectionId))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} else { } else {
return null; return null;
} }
} }
public SubCategoryFull getFullSubCategory(String type, String alias, String subCategoryId) { public SubCategoryFull getFullSubCategory(Stakeholder stakeholder, String subCategoryId) {
SubCategory subCategory = this.find(subCategoryId); SubCategory subCategory = this.find(subCategoryId);
return this.getFullSubCategory(type, alias, subCategory); return this.getFullSubCategory(stakeholder, subCategory);
} }
public String build(String id) { public String build(String id) {
@ -122,7 +123,7 @@ public class SubCategoryService {
this.commonService.unauthorized("You are not authorized to create a subCategory in stakeholder with id: " + stakeholder.getId()); this.commonService.unauthorized("You are not authorized to create a subCategory in stakeholder with id: " + stakeholder.getId());
} }
} }
return this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), subCategory); return this.getFullSubCategory(stakeholder, subCategory);
} }
public void createChildren(Category defaultCategory, SubCategory subCategory) { public void createChildren(Category defaultCategory, SubCategory subCategory) {
@ -150,7 +151,7 @@ public class SubCategoryService {
this.sectionService.reorderIndicators(stakeholder, from, moveIndicator.getFrom().getIndicators(), false); this.sectionService.reorderIndicators(stakeholder, from, moveIndicator.getFrom().getIndicators(), false);
this.sectionService.reorderIndicators(stakeholder, to, moveIndicator.getTo().getIndicators(), false); this.sectionService.reorderIndicators(stakeholder, to, moveIndicator.getTo().getIndicators(), false);
this.moveIndicatorChildren(stakeholder, subCategory, moveIndicator); this.moveIndicatorChildren(stakeholder, subCategory, moveIndicator);
return this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), subCategory); return this.getFullSubCategory(stakeholder, subCategory);
} else { } else {
this.commonService.unauthorized("You are not authorized to move indicators in subCategory with id: " + subCategory.getId()); this.commonService.unauthorized("You are not authorized to move indicators in subCategory with id: " + subCategory.getId());
} }
@ -160,8 +161,8 @@ public class SubCategoryService {
public void moveIndicatorChildren(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, MoveIndicator moveIndicator) { public void moveIndicatorChildren(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, MoveIndicator moveIndicator) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> { this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> {
this.dao.findByDefaultId(defaultSubCategory.getId()).stream() this.dao.findByDefaultId(defaultSubCategory.getId()).stream()
.map(subCategory -> this.getFullSubCategory(stakeholder.getType(), stakeholder. getAlias(), subCategory)) .map(subCategory -> this.getFullSubCategory(stakeholder, subCategory))
.collect(Collectors.toList()).forEach(subCategory -> { .toList().forEach(subCategory -> {
SectionFull from = subCategory.getSectionByDefaultId(moveIndicator.getFrom().getId()).orElse(null); SectionFull from = subCategory.getSectionByDefaultId(moveIndicator.getFrom().getId()).orElse(null);
SectionFull to = subCategory.getSectionByDefaultId(moveIndicator.getTo().getId()).orElse(null); SectionFull to = subCategory.getSectionByDefaultId(moveIndicator.getTo().getId()).orElse(null);
if(from != null && to != null) { if(from != null && to != null) {
@ -186,7 +187,7 @@ public class SubCategoryService {
subCategory.setNumbers(numbers); subCategory.setNumbers(numbers);
subCategory.setUpdateDate(new Date()); subCategory.setUpdateDate(new Date());
this.reorderChildrenNumbers(stakeholder, subCategory, numbers); this.reorderChildrenNumbers(stakeholder, subCategory, numbers);
return this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), this.dao.save(subCategory)); return this.getFullSubCategory(stakeholder, this.dao.save(subCategory));
} else { } else {
throw new NotFoundException("Some sections dont exist in the subCategory with id " + subCategory.getId()); throw new NotFoundException("Some sections dont exist in the subCategory with id " + subCategory.getId());
} }
@ -202,7 +203,7 @@ public class SubCategoryService {
if (subCategory.getCharts().size() == charts.size() && new HashSet<>(subCategory.getCharts()).containsAll(charts)) { if (subCategory.getCharts().size() == charts.size() && new HashSet<>(subCategory.getCharts()).containsAll(charts)) {
subCategory.setCharts(charts); subCategory.setCharts(charts);
this.reorderChildrenCharts(stakeholder, subCategory, charts); this.reorderChildrenCharts(stakeholder, subCategory, charts);
return this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), this.dao.save(subCategory)); return this.getFullSubCategory(stakeholder, this.dao.save(subCategory));
} else { } else {
throw new NotFoundException("Some sections dont exist in the subCategory with id " + subCategory.getId()); throw new NotFoundException("Some sections dont exist in the subCategory with id " + subCategory.getId());
} }
@ -214,7 +215,7 @@ public class SubCategoryService {
public void reorderChildrenNumbers(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, List<String> defaultSections) { public void reorderChildrenNumbers(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, List<String> defaultSections) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> { this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> {
this.dao.findByDefaultId(defaultSubCategory.getId()).stream().map(subCategory -> this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), subCategory)).forEach(subCategory -> { this.dao.findByDefaultId(defaultSubCategory.getId()).stream().map(subCategory -> this.getFullSubCategory(stakeholder, subCategory)).forEach(subCategory -> {
this.reorderNumbers(stakeholder, new SubCategory(subCategory), this.reorderNumbers(stakeholder, new SubCategory(subCategory),
this.commonService.reorder(defaultSections, subCategory.getNumbers().stream().map(section -> (Common) section).collect(Collectors.toList()))); this.commonService.reorder(defaultSections, subCategory.getNumbers().stream().map(section -> (Common) section).collect(Collectors.toList())));
}); });
@ -223,7 +224,7 @@ public class SubCategoryService {
public void reorderChildrenCharts(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, List<String> defaultSections) { public void reorderChildrenCharts(Stakeholder defaultStakeholder, SubCategory defaultSubCategory, List<String> defaultSections) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> { this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> {
this.dao.findByDefaultId(defaultSubCategory.getId()).stream().map(subCategory -> this.getFullSubCategory(stakeholder.getType(), stakeholder.getAlias(), subCategory)).forEach(subCategory -> { this.dao.findByDefaultId(defaultSubCategory.getId()).stream().map(subCategory -> this.getFullSubCategory(stakeholder, subCategory)).forEach(subCategory -> {
this.reorderCharts(stakeholder, new SubCategory(subCategory), this.reorderCharts(stakeholder, new SubCategory(subCategory),
this.commonService.reorder(defaultSections, subCategory.getCharts().stream().map(section -> (Common) section).collect(Collectors.toList()))); this.commonService.reorder(defaultSections, subCategory.getCharts().stream().map(section -> (Common) section).collect(Collectors.toList())));
}); });
@ -270,15 +271,15 @@ public class SubCategoryService {
}); });
} }
public SubCategoryFull changeVisibility(String type, String alias, SubCategoryFull subCategory, Visibility visibility, Boolean propagate) { public SubCategoryFull changeVisibility(Stakeholder stakeholder, SubCategoryFull subCategory, Visibility visibility, Boolean propagate) {
if(this.commonService.hasEditAuthority(type, alias)) { if(this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
subCategory.setVisibility(visibility); subCategory.setVisibility(visibility);
if(propagate) { if(propagate) {
subCategory.setNumbers(subCategory.getNumbers().stream() subCategory.setNumbers(subCategory.getNumbers().stream()
.map(section -> this.sectionService.changeVisibility(type, alias, section, visibility)) .map(section -> this.sectionService.changeVisibility(stakeholder, section, visibility))
.collect(Collectors.toList())); .collect(Collectors.toList()));
subCategory.setCharts(subCategory.getCharts().stream() subCategory.setCharts(subCategory.getCharts().stream()
.map(section -> this.sectionService.changeVisibility(type, alias, section, visibility)) .map(section -> this.sectionService.changeVisibility(stakeholder, section, visibility))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
subCategory.update(this.save(new SubCategory(subCategory))); subCategory.update(this.save(new SubCategory(subCategory)));
@ -289,8 +290,33 @@ public class SubCategoryService {
return null; return null;
} }
public SubCategoryFull changeVisibility(String type, String alias, SubCategory subCategory, Visibility visibility, Boolean propagate) { public SubCategoryFull changeVisibility(Stakeholder stakeholder, SubCategory subCategory, Visibility visibility, Boolean propagate) {
SubCategoryFull subCategoryFull = this.getFullSubCategory(type, alias, subCategory); SubCategoryFull subCategoryFull = this.getFullSubCategory(stakeholder, subCategory);
return this.changeVisibility(type, alias, subCategoryFull, visibility, propagate); return this.changeVisibility(stakeholder, subCategoryFull, visibility, propagate);
}
public SubCategoryFull changeVisibility(Stakeholder stakeholder, SubCategoryFull subCategory, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
if(this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
subCategory.setVisibility(visibility);
stakeholder.setOverride(subCategory.getId(), "visibility", visibility);
Stakeholder saved = stakeholderService.save(stakeholder);
if(propagate) {
subCategory.setNumbers(subCategory.getNumbers().stream()
.map(section -> this.sectionService.changeVisibility(saved, section, visibility, stakeholderService))
.collect(Collectors.toList()));
subCategory.setCharts(subCategory.getCharts().stream()
.map(section -> this.sectionService.changeVisibility(saved, section, visibility, stakeholderService))
.collect(Collectors.toList()));
}
return subCategory;
} else {
this.commonService.unauthorized("Change subCategory visibility: You are not authorized to update subCategory with id: " + subCategory.getId());
}
return null;
}
public SubCategoryFull changeVisibility(Stakeholder stakeholder, SubCategory subCategory, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
SubCategoryFull subCategoryFull = this.getFullSubCategory(stakeholder, subCategory);
return this.changeVisibility(stakeholder, subCategoryFull, visibility, propagate, stakeholderService);
} }
} }

View File

@ -45,19 +45,20 @@ public class TopicService {
return this.dao.findById(topicId).orElseThrow(() -> new NotFoundException("Topic with id: " + topicId + " not found")); return this.dao.findById(topicId).orElseThrow(() -> new NotFoundException("Topic with id: " + topicId + " not found"));
} }
public TopicFull getFullTopic(String type, String alias, Topic topic) { public TopicFull getFullTopic(Stakeholder stakeholder, Topic topic) {
if (commonService.hasVisibilityAuthority(type, alias, topic)) { topic.override(stakeholder);
if (commonService.hasVisibilityAuthority(stakeholder.getType(), stakeholder.getAlias(), topic)) {
return new TopicFull(topic, topic.getCategories().stream() return new TopicFull(topic, topic.getCategories().stream()
.map(categoryId -> this.categoryService.getFullCategory(type, alias, categoryId)) .map(categoryId -> this.categoryService.getFullCategory(stakeholder, categoryId))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} else { } else {
return null; return null;
} }
} }
public TopicFull getFullTopic(String type, String alias, String id) { public TopicFull getFullTopic(Stakeholder stakeholder, String id) {
Topic topic = this.find(id); Topic topic = this.find(id);
return this.getFullTopic(type, alias, topic); return this.getFullTopic(stakeholder, topic);
} }
public String build(String id) { public String build(String id) {
@ -104,7 +105,7 @@ public class TopicService {
this.commonService.unauthorized("You are not authorized to create a topic in stakeholder with id: " + stakeholder.getId()); this.commonService.unauthorized("You are not authorized to create a topic in stakeholder with id: " + stakeholder.getId());
} }
} }
return this.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), topic); return this.getFullTopic(stakeholder, topic);
} }
public void createChildren(Stakeholder defaultStakeholder, Topic topic) { public void createChildren(Stakeholder defaultStakeholder, Topic topic) {
@ -126,7 +127,7 @@ public class TopicService {
topic.setCategories(categories); topic.setCategories(categories);
this.reorderChildren(stakeholder, topic, categories); this.reorderChildren(stakeholder, topic, categories);
topic.setUpdateDate(new Date()); topic.setUpdateDate(new Date());
return this.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), this.dao.save(topic)); return this.getFullTopic(stakeholder, this.dao.save(topic));
} else { } else {
throw new NotFoundException("Some categories dont exist in the topic with id " + topic.getId()); throw new NotFoundException("Some categories dont exist in the topic with id " + topic.getId());
} }
@ -138,7 +139,7 @@ public class TopicService {
public void reorderChildren(Stakeholder defaultStakeholder, Topic defaultTopic, List<String> defaultCategories) { public void reorderChildren(Stakeholder defaultStakeholder, Topic defaultTopic, List<String> defaultCategories) {
this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> { this.stakeholderDAO.findByDefaultIdAndCopyIsTrue(defaultStakeholder.getId()).forEach(stakeholder -> {
this.dao.findByDefaultId(defaultTopic.getId()).stream().map(topic -> this.getFullTopic(stakeholder.getType(), stakeholder.getAlias(), topic)).forEach(topic -> { this.dao.findByDefaultId(defaultTopic.getId()).stream().map(topic -> this.getFullTopic(stakeholder, topic)).forEach(topic -> {
this.reorderCategories(stakeholder, new Topic(topic), this.reorderCategories(stakeholder, new Topic(topic),
this.commonService.reorder(defaultCategories, topic.getCategories().stream().map(category -> (Common) category).collect(Collectors.toList()))); this.commonService.reorder(defaultCategories, topic.getCategories().stream().map(category -> (Common) category).collect(Collectors.toList())));
}); });
@ -181,12 +182,12 @@ public class TopicService {
}); });
} }
public TopicFull changeVisibility(String type, String alias, TopicFull topic, Visibility visibility, Boolean propagate) { public TopicFull changeVisibility(Stakeholder stakeholder, TopicFull topic, Visibility visibility, Boolean propagate) {
if (this.commonService.hasEditAuthority(type, alias)) { if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
topic.setVisibility(visibility); topic.setVisibility(visibility);
if (propagate) { if (propagate) {
topic.setCategories(topic.getCategories().stream() topic.setCategories(topic.getCategories().stream()
.map(category -> this.categoryService.changeVisibility(type, alias, category, visibility, true)) .map(category -> this.categoryService.changeVisibility(stakeholder, category, visibility, true))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
topic.update(this.save(new Topic(topic))); topic.update(this.save(new Topic(topic)));
@ -197,8 +198,30 @@ public class TopicService {
return null; return null;
} }
public TopicFull changeVisibility(String type, String alias, Topic topic, Visibility visibility, Boolean propagate) { public TopicFull changeVisibility(Stakeholder stakeholder, Topic topic, Visibility visibility, Boolean propagate) {
TopicFull topicFull = this.getFullTopic(type, alias, topic); TopicFull topicFull = this.getFullTopic(stakeholder, topic);
return this.changeVisibility(type, alias, topicFull, visibility, propagate); return this.changeVisibility(stakeholder, topicFull, visibility, propagate);
}
public TopicFull changeVisibility(Stakeholder stakeholder, TopicFull topic, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
if (this.commonService.hasEditAuthority(stakeholder.getType(), stakeholder.getAlias())) {
topic.setVisibility(visibility);
stakeholder.setOverride(topic.getId(), "visibility", visibility);
Stakeholder saved = stakeholderService.save(stakeholder);
if (propagate) {
topic.setCategories(topic.getCategories().stream()
.map(category -> this.categoryService.changeVisibility(saved, category, visibility, true, stakeholderService))
.collect(Collectors.toList()));
}
return topic;
} else {
this.commonService.unauthorized("Change topic visibility: You are not authorized to update topic with id: " + topic.getId());
}
return null;
}
public TopicFull changeVisibility(Stakeholder stakeholder, Topic topic, Visibility visibility, Boolean propagate, StakeholderService stakeholderService) {
TopicFull topicFull = this.getFullTopic(stakeholder, topic);
return this.changeVisibility(stakeholder, topicFull, visibility, propagate, stakeholderService);
} }
} }

View File

@ -0,0 +1,59 @@
package eu.dnetlib.uoamonitorservice.utils;
import java.lang.reflect.Field;
public class GenericAccessor {
public static <T> void setField(Object obj, String fieldName, T value) {
try {
Field field = findField(obj.getClass(), fieldName);
field.setAccessible(true); // Allows access to private fields
if (field.getType().isEnum()) {
if (value instanceof String stringValue) {
Enum<?> enumValue = getEnumValue(field.getType(), stringValue);
field.set(obj, enumValue);
} else if (field.getType().isAssignableFrom(value.getClass())) {
// Directly assign if types match
field.set(obj, value);
} else {
throw new IllegalArgumentException("Incompatible types: cannot assign " + value.getClass().getName() +
" to " + field.getType().getName());
}
} else {
// Handle other field types normally
field.set(obj, value);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
System.err.println("Error setting field: " + e.getMessage());
}
}
public static Object getField(Object obj, String fieldName) {
try {
Field field = findField(obj.getClass(), fieldName); // Updated to search in superclasses
field.setAccessible(true); // Allows access to private fields
return field.get(obj);
} catch (NoSuchFieldException | IllegalAccessException e) {
System.err.println("Error getting field: " + e.getMessage());
return null;
}
}
private static Field findField(Class<?> clazz, String fieldName) throws NoSuchFieldException {
Class<?> currentClass = clazz;
while (currentClass != null) {
try {
return currentClass.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
currentClass = currentClass.getSuperclass();
}
}
throw new NoSuchFieldException("Field '" + fieldName + "' not found in class hierarchy of " + clazz.getName());
}
// Safely get the Enum value using generics
@SuppressWarnings("unchecked")
private static <E extends Enum<E>> E getEnumValue(Class<?> enumClass, String value) {
return Enum.valueOf((Class<E>) enumClass, value);
}
}