1. clone public plan and description

2. fixed orcid links on public entities
This commit is contained in:
Sofia Papacharalampous 2024-07-12 16:52:08 +03:00
parent f4ff317c68
commit 50e38c6854
7 changed files with 70 additions and 5 deletions

View File

@ -15,6 +15,9 @@ public final class Permission {
public static String PublicBrowseDashboardStatistics = "PublicBrowseDashboardStatistics";
public static String PublicSendContactSupport = "PublicSendContactSupport";
public static String PublicBrowseReferenceType = "PublicBrowseReferenceType";
public static String PublicClonePlan = "PublicClonePlan";
public static String PublicCloneDescription = "PublicCloneDescription";
//Elastic
public static String ManageElastic = "ManageElastic";
//Queue Events

View File

@ -1,5 +1,7 @@
package org.opencdmp.model;
import org.opencdmp.commons.enums.ReferenceSourceType;
import java.util.UUID;
public class PublicReference {
@ -19,6 +21,13 @@ public class PublicReference {
private String reference;
public static final String _reference = "reference";
private String source;
public static final String _source = "source";
private ReferenceSourceType sourceType;
public static final String _sourceType = "sourceType";
public UUID getId() {
return id;
}
@ -58,6 +67,22 @@ public class PublicReference {
public void setReference(String reference) {
this.reference = reference;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public ReferenceSourceType getSourceType() {
return sourceType;
}
public void setSourceType(ReferenceSourceType sourceType) {
this.sourceType = sourceType;
}
}

View File

@ -13,6 +13,7 @@ import org.opencdmp.convention.ConventionService;
import org.opencdmp.data.ReferenceEntity;
import org.opencdmp.model.PublicReference;
import org.opencdmp.model.PublicReferenceType;
import org.opencdmp.model.reference.Reference;
import org.opencdmp.query.ReferenceTypeQuery;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -62,6 +63,8 @@ public class PublicReferenceBuilder extends BaseBuilder<PublicReference, Referen
if (fields.hasField(this.asIndexer(PublicReference._label))) m.setLabel(d.getLabel());
if (fields.hasField(this.asIndexer(PublicReference._reference))) m.setReference(d.getReference());
if (fields.hasField(this.asIndexer(PublicReference._description))) m.setDescription(d.getDescription());
if (fields.hasField(this.asIndexer(PublicReference._source))) m.setSource(d.getSource());
if (!typeFields.isEmpty() && typeItemsMap != null && typeItemsMap.containsKey(d.getTypeId())) m.setType(typeItemsMap.get(d.getTypeId()));
models.add(m);
}

View File

@ -71,6 +71,7 @@ import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEvent;
import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEventHandler;
import org.opencdmp.model.PlanUser;
import org.opencdmp.model.PlanValidationResult;
import org.opencdmp.model.PublicPlan;
import org.opencdmp.model.builder.PlanUserBuilder;
import org.opencdmp.model.builder.description.DescriptionBuilder;
import org.opencdmp.model.builder.plan.PlanBuilder;
@ -91,6 +92,7 @@ import org.opencdmp.model.planblueprint.PlanBlueprint;
import org.opencdmp.model.planreference.PlanReferenceData;
import org.opencdmp.model.reference.Reference;
import org.opencdmp.model.referencetype.ReferenceType;
import org.opencdmp.model.result.QueryResult;
import org.opencdmp.query.*;
import org.opencdmp.service.actionconfirmation.ActionConfirmationService;
import org.opencdmp.service.description.DescriptionService;
@ -125,6 +127,8 @@ import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
import static org.opencdmp.authorization.AuthorizationFlags.Public;
@Service
public class PlanServiceImpl implements PlanService {
@ -568,10 +572,12 @@ public class PlanServiceImpl implements PlanService {
public void cloneDescription(UUID planId, Map<UUID, UUID> planDescriptionTemplateRemap, UUID descriptionId, UUID newPlanDescriptionTemplateId) throws InvalidApplicationException, IOException {
logger.debug("cloning description: {} with description: {}", descriptionId, planId);
this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.CloneDescription);
PlanEntity descriptionPlan = this.queryFactory.query(PlanQuery.class).disableTracking().ids(planId).isActive(IsActive.Active).first();
if (!descriptionPlan.getAccessType().equals(PlanAccessType.Public)) this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.CloneDescription);
else this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.PublicCloneDescription);
DescriptionEntity existing = this.queryFactory.query(DescriptionQuery.class).disableTracking().ids(descriptionId).isActive(IsActive.Active).first();
DescriptionEntity newDescription = new DescriptionEntity();
newDescription.setId(UUID.randomUUID());
newDescription.setLabel(existing.getLabel());
@ -673,12 +679,15 @@ public class PlanServiceImpl implements PlanService {
@Override
public Plan buildClone(ClonePlanPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, IOException, InvalidApplicationException {
this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.planAffiliation( model.getId())), Permission.ClonePlan);
PlanEntity existingPlanEntity = this.queryFactory.query(PlanQuery.class).disableTracking().authorize(AuthorizationFlags.AllExceptPublic).ids(model.getId()).firstAs(fields);
PlanEntity existingPlanEntity = this.queryFactory.query(PlanQuery.class).disableTracking().ids(model.getId()).firstAs(fields);
if (!this.conventionService.isValidGuid(model.getId()) || existingPlanEntity == null)
throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Plan.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (!existingPlanEntity.getAccessType().equals(PlanAccessType.Public)) this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.planAffiliation( model.getId())), Permission.ClonePlan);
else this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.planAffiliation( model.getId())), Permission.PublicClonePlan);
PlanEntity newPlan = new PlanEntity();
newPlan.setId(UUID.randomUUID());
newPlan.setIsActive(IsActive.Active);
@ -711,6 +720,20 @@ public class PlanServiceImpl implements PlanService {
.isActive(IsActive.Active)
.collect();
UUID currentUserId = this.userScope.getUserId();
boolean currentUserIsInPlan = planUsers.stream().anyMatch(u -> u.getUserId() == currentUserId);
if (!currentUserIsInPlan) {
PlanUserEntity newUser = new PlanUserEntity();
newUser.setId(UUID.randomUUID());
newUser.setPlanId(newPlan.getId());
newUser.setUserId(currentUserId);
newUser.setRole(PlanUserRole.Owner);
newUser.setCreatedAt(Instant.now());
newUser.setUpdatedAt(Instant.now());
newUser.setIsActive(IsActive.Active);
this.entityManager.persist(newUser);
}
for (PlanUserEntity planUser : planUsers) {
PlanUserEntity newUser = new PlanUserEntity();
newUser.setId(UUID.randomUUID());

View File

@ -69,6 +69,16 @@ permissions:
clients: [ ]
allowAnonymous: true
allowAuthenticated: true
PublicClonePlan:
roles: [ ]
clients: [ ]
allowAnonymous: false
allowAuthenticated: true
PublicCloneDescription:
roles: [ ]
clients: [ ]
allowAnonymous: false
allowAuthenticated: true
BrowsePublicStatistics:
roles: [ ]
clients: [ ]

View File

@ -13,6 +13,7 @@ export enum AppPermission {
PublicBrowseDashboardStatistics = "PublicBrowseDashboardStatistics",
PublicSendContactSupport = "PublicSendContactSupport",
PublicBrowseReferenceType = "PublicBrowseReferenceType",
PublicClonePlan = "PublicClonePlan",
//Elastic
ManageElastic = "ManageElastic",
//Queue Events

View File

@ -248,7 +248,7 @@ export class PlanListingItemComponent extends BaseComponent implements OnInit {
}
canClonePlan(): boolean {
return this.plan.authorizationFlags?.some(x => x === AppPermission.ClonePlan) || this.authentication.hasPermission(AppPermission.ClonePlan);
return this.plan.authorizationFlags?.some(x => x === AppPermission.ClonePlan) || this.authentication.hasPermission(AppPermission.ClonePlan) || (this.authentication.hasPermission(AppPermission.PublicClonePlan) && this.isPublic);
}
canFinalizePlan(): boolean {