RED-7439 - single transaction write for ace entries of a dossier

This commit is contained in:
Timo Bejan 2023-08-24 21:10:03 +03:00
parent e9eb0a5171
commit 9d084c57c0
5 changed files with 29 additions and 6 deletions

View File

@ -17,11 +17,11 @@ public abstract class AbstractACLService<ID extends Serializable> {
public MutableAcl getOrCreateACL(Serializable id) { public MutableAcl getOrCreateACL(Serializable id) {
ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), id); var objectIdentity = new ObjectIdentityImpl(getIdentifier(), id);
try { try {
return (MutableAcl) mutableAclService.readAclById(dossierIdentity); return (MutableAcl) mutableAclService.readAclById(objectIdentity);
} catch (NotFoundException e) { } catch (NotFoundException e) {
return mutableAclService.createAcl(dossierIdentity); return mutableAclService.createAcl(objectIdentity);
} }
} }

View File

@ -53,6 +53,11 @@ public abstract class ICustomPermissionService<T, ID extends Serializable> exten
} }
public void applyCustomPermissions(CustomPermissionMappingModel customPermissionMappingModel, MutableAcl acl){
applyAces(acl, customPermissionMappingModel);
}
protected void applyAces(MutableAcl acl, CustomPermissionMappingModel model) { protected void applyAces(MutableAcl acl, CustomPermissionMappingModel model) {
clearAces(acl); clearAces(acl);

View File

@ -123,12 +123,12 @@ public class DossierACLService extends AbstractACLService<String> {
} }
members.forEach(member -> acl.insertAce(0, RedPermission.REVIEW, new PrincipalSid(member), true)); members.forEach(member -> acl.insertAce(0, RedPermission.REVIEW, new PrincipalSid(member), true));
approvers.forEach(member -> acl.insertAce(0, RedPermission.APPROVE, new PrincipalSid(member), true)); approvers.forEach(member -> acl.insertAce(0, RedPermission.APPROVE, new PrincipalSid(member), true));
customPermissionService.applyCustomPermissions(getIdentifier(), acl);
mutableAclService.updateAcl(acl); mutableAclService.updateAcl(acl);
customPermissionService.applyCustomPermissions(getIdentifier(), dossierId);
} }
} }

View File

@ -13,6 +13,7 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.security.acls.model.MutableAcl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -110,6 +111,20 @@ public class CustomPermissionService {
} }
public void applyCustomPermissions(String targetObject, MutableAcl acl) {
var mappings = getCustomPermissionMappings(targetObject);
applyToAcl(mappings, acl);
}
public void applyToAcl(List<CustomPermissionMappingModel> customPermissionMappingModels, MutableAcl acl) {
customPermissionMappingModels.forEach(p -> customPermissionServices.forEach(s -> {
if (p.getTargetPermission().getMask() == s.forPermission().getMask()) {
s.applyCustomPermissions(p, acl);
}
}));
}
public void apply(List<CustomPermissionMappingModel> customPermissionMappingModels, Serializable objectId) { public void apply(List<CustomPermissionMappingModel> customPermissionMappingModels, Serializable objectId) {
customPermissionMappingModels.forEach(p -> customPermissionServices.forEach(s -> { customPermissionMappingModels.forEach(p -> customPermissionServices.forEach(s -> {
@ -199,4 +214,7 @@ public class CustomPermissionService {
this.apply(getCustomPermissionMappings(targetObject)); this.apply(getCustomPermissionMappings(targetObject));
} }
} }