diff --git a/annotation-service/annotation-web/src/main/resources/config/queue.yml b/annotation-service/annotation-web/src/main/resources/config/queue.yml index 903a00663..919162228 100644 --- a/annotation-service/annotation-web/src/main/resources/config/queue.yml +++ b/annotation-service/annotation-web/src/main/resources/config/queue.yml @@ -42,9 +42,10 @@ queue: options: exchange: null tenant-removal-topic: tenant.remove - tenant-touched-topic: tenant.touch + tenant-touch-topic: tenant.touch user-removal-topic: user.remove - user-touched-topic: user.touch + user-touch-topic: user.touch + annotation-entity-touch-topic: annotation.entity.touch rabbitmq: enable: false interval-seconds: 30 diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/audit/AuditableAction.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/audit/AuditableAction.java index 6d65a7a31..14f1c57a6 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/audit/AuditableAction.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/audit/AuditableAction.java @@ -51,4 +51,9 @@ public class AuditableAction { public static final EventId Annotation_Persist = new EventId(24002, "Annotation_Persist"); public static final EventId Annotation_Delete = new EventId(24003, "Annotation_Delete"); + public static final EventId Entity_User_Query = new EventId(25000, "Entity_User_Query"); + public static final EventId Entity_User_Lookup = new EventId(25001, "Entity_User_Lookup"); + public static final EventId Entity_User_Persist = new EventId(25002, "Entity_User_Persist"); + public static final EventId Entity_User_Delete = new EventId(25003, "Entity_User_Delete"); + } diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/common/validation/UuidValidator.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/common/validation/UuidValidator.java new file mode 100644 index 000000000..f0512728c --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/common/validation/UuidValidator.java @@ -0,0 +1,43 @@ +package gr.cite.annotation.common.validation; + +import gr.cite.annotation.convention.ConventionService; +import gr.cite.annotation.errorcode.ErrorThesaurusProperties; +import gr.cite.annotation.integrationevent.inbox.annotationentitytouch.AnnotationEntityTouchedIntegrationEvent; +import gr.cite.tools.validation.specification.Specification; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +@Component(UuidValidator.ValidatorName) +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class UuidValidator extends BaseValidator { + + public static final String ValidatorName = "UuidValidator"; + + private final MessageSource messageSource; + + protected UuidValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { + super(conventionService, errors); + this.messageSource = messageSource; + } + + @Override + protected Class modelClass() { + return UUID.class; + } + + @Override + protected List specifications(UUID item) { + return Arrays.asList( + this.spec() + .must(() -> this.isValidGuid(item)) + .failOn("uuid").failWith(messageSource.getMessage("Validation_Required", new Object[]{"uuid"}, LocaleContextHolder.getLocale())) + ); + } +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java index 0c0a17413..146650d20 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java @@ -19,7 +19,6 @@ public class AnnotationEntity { public static final String _id = "id"; - @Id @Column(name = "entity_id", columnDefinition = "uuid", nullable = false) private UUID entityId; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/EntityUserEntity.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/EntityUserEntity.java index 49deda357..d03602122 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/EntityUserEntity.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/EntityUserEntity.java @@ -12,19 +12,17 @@ import java.util.UUID; public class EntityUserEntity { @Id - @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) + @Column(name = "\"id\"", columnDefinition = "uuid", updatable = false, nullable = false) private UUID id; public static final String _id = "id"; - @Id - @Column(name = "id", columnDefinition = "uuid", nullable = false) + @Column(name = "\"entity_id\"", columnDefinition = "uuid", nullable = false) private UUID entityId; public static final String _entityId = "entityId"; - @Id - @Column(name = "id", columnDefinition = "uuid", nullable = false) + @Column(name = "\"user_id\"", columnDefinition = "uuid", nullable = false) private UUID userId; public static final String _userId = "userId"; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/AppRabbitConfigurer.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/AppRabbitConfigurer.java index 15448a5fa..a9390e3b0 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/AppRabbitConfigurer.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/AppRabbitConfigurer.java @@ -33,9 +33,10 @@ public class AppRabbitConfigurer extends RabbitConfigurer { public InboxBindings inboxBindingsCreator() { List bindingItems = new ArrayList<>(); bindingItems.addAll(this.inboxProperties.getTenantRemovalTopic()); - bindingItems.addAll(this.inboxProperties.getTenantTouchedTopic()); + bindingItems.addAll(this.inboxProperties.getTenantTouchTopic()); bindingItems.addAll(this.inboxProperties.getUserRemovalTopic()); - bindingItems.addAll(this.inboxProperties.getUserTouchedTopic()); + bindingItems.addAll(this.inboxProperties.getUserTouchTopic()); + bindingItems.addAll(this.inboxProperties.getAnnotationEntityTouchTopic()); return new InboxBindings(bindingItems); } diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxProperties.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxProperties.java index 331216d0a..a2b133711 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxProperties.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxProperties.java @@ -11,39 +11,47 @@ public class InboxProperties { private final List tenantRemovalTopic; - private final List tenantTouchedTopic; + private final List tenantTouchTopic; private final List userRemovalTopic; - private final List userTouchedTopic; + private final List userTouchTopic; + + private final List annotationEntityTouchTopic; public InboxProperties( String exchange, List tenantRemovalTopic, - List tenantTouchedTopic, + List tenantTouchTopic, List userRemovalTopic, - List userTouchedTopic) { + List userTouchTopic, + List annotationEntityTouchTopic) { this.exchange = exchange; this.tenantRemovalTopic = tenantRemovalTopic; - this.tenantTouchedTopic = tenantTouchedTopic; + this.tenantTouchTopic = tenantTouchTopic; this.userRemovalTopic = userRemovalTopic; - this.userTouchedTopic = userTouchedTopic; + this.userTouchTopic = userTouchTopic; + this.annotationEntityTouchTopic = annotationEntityTouchTopic; } public List getTenantRemovalTopic() { return tenantRemovalTopic; } - public List getTenantTouchedTopic() { - return tenantTouchedTopic; + public List getTenantTouchTopic() { + return tenantTouchTopic; } public List getUserRemovalTopic() { return userRemovalTopic; } - public List getUserTouchedTopic() { - return userTouchedTopic; + public List getUserTouchTopic() { + return userTouchTopic; + } + + public List getAnnotationEntityTouchTopic() { + return annotationEntityTouchTopic; } public String getExchange() { diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxRepositoryImpl.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxRepositoryImpl.java index 1be479469..b3822c478 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxRepositoryImpl.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/InboxRepositoryImpl.java @@ -5,10 +5,11 @@ import gr.cite.annotation.common.enums.IsActive; import gr.cite.annotation.common.scope.fake.FakeRequestScope; import gr.cite.annotation.data.QueueInboxEntity; import gr.cite.annotation.integrationevent.TrackedEvent; +import gr.cite.annotation.integrationevent.inbox.annotationentitytouch.AnnotationEntityTouchedIntegrationEventHandler; import gr.cite.annotation.integrationevent.inbox.tenantremoval.TenantRemovalIntegrationEventHandler; -import gr.cite.annotation.integrationevent.inbox.tenanttouched.TenantTouchedIntegrationEventHandler; +import gr.cite.annotation.integrationevent.inbox.tenanttouch.TenantTouchedIntegrationEventHandler; import gr.cite.annotation.integrationevent.inbox.userremoval.UserRemovalIntegrationEventHandler; -import gr.cite.annotation.integrationevent.inbox.usertouched.UserTouchedIntegrationEventHandler; +import gr.cite.annotation.integrationevent.inbox.usertouch.UserTouchedIntegrationEventHandler; import gr.cite.annotation.query.QueueInboxQuery; import gr.cite.queueinbox.entity.QueueInbox; import gr.cite.queueinbox.entity.QueueInboxStatus; @@ -325,12 +326,14 @@ public class InboxRepositoryImpl implements InboxRepository { logger.debug("Processing message with routing key '{}'", routingKey); if (this.routingKeyMatched(routingKey, this.inboxProperties.getTenantRemovalTopic())) handler = this.applicationContext.getBean(TenantRemovalIntegrationEventHandler.class); - else if (this.routingKeyMatched(routingKey, this.inboxProperties.getTenantTouchedTopic())) + else if (this.routingKeyMatched(routingKey, this.inboxProperties.getTenantTouchTopic())) handler = this.applicationContext.getBean(TenantTouchedIntegrationEventHandler.class); else if (this.routingKeyMatched(routingKey, this.inboxProperties.getUserRemovalTopic())) handler = this.applicationContext.getBean(UserRemovalIntegrationEventHandler.class); - else if (this.routingKeyMatched(routingKey, this.inboxProperties.getUserTouchedTopic())) + else if (this.routingKeyMatched(routingKey, this.inboxProperties.getUserTouchTopic())) handler = this.applicationContext.getBean(UserTouchedIntegrationEventHandler.class); + else if (this.routingKeyMatched(routingKey, this.inboxProperties.getAnnotationEntityTouchTopic())) + handler = this.applicationContext.getBean(AnnotationEntityTouchedIntegrationEventHandler.class); else { logger.error("No handler found for message routing key '{}'. Discarding.", routingKey); handler = null; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java new file mode 100644 index 000000000..f5b0de33c --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java @@ -0,0 +1,86 @@ +package gr.cite.annotation.integrationevent.inbox.annotationentitytouch; + +import gr.cite.annotation.common.validation.BaseValidator; +import gr.cite.annotation.common.validation.UuidValidator; +import gr.cite.annotation.convention.ConventionService; +import gr.cite.annotation.errorcode.ErrorThesaurusProperties; +import gr.cite.annotation.integrationevent.TrackedEvent; +import gr.cite.tools.validation.ValidatorFactory; +import gr.cite.tools.validation.specification.Specification; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class AnnotationEntityTouchedIntegrationEvent extends TrackedEvent { + + private UUID entityId; + + public static final String _entityId = "entityId"; + + private List userIds; + + public static final String _userIds = "userIds"; + + public UUID getEntityId() { + return entityId; + } + + public void setEntityId(UUID entityId) { + this.entityId = entityId; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + @Component(AnnotationEntityTouchedIntegrationEvent.AnnotationEntityTouchedIntegrationEventValidator.ValidatorName) + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public static class AnnotationEntityTouchedIntegrationEventValidator extends BaseValidator { + + public static final String ValidatorName = "AnnotationEntityTouchedIntegrationEventValidator"; + + private final MessageSource messageSource; + + private final ValidatorFactory validatorFactory; + + protected AnnotationEntityTouchedIntegrationEventValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, ValidatorFactory validatorFactory) { + super(conventionService, errors); + this.messageSource = messageSource; + this.validatorFactory = validatorFactory; + } + + @Override + protected Class modelClass() { + return AnnotationEntityTouchedIntegrationEvent.class; + } + + @Override + protected List specifications(AnnotationEntityTouchedIntegrationEvent item) { + return Arrays.asList( + this.spec() + .iff(() -> !this.isNull(item.getEntityId())) + .must(() -> this.isValidGuid(item.getEntityId())) + .failOn(AnnotationEntityTouchedIntegrationEvent._entityId).failWith(messageSource.getMessage("Validation_Required", new Object[]{AnnotationEntityTouchedIntegrationEvent._entityId}, LocaleContextHolder.getLocale())), + this.spec() + .must(() -> !this.isListNullOrEmpty(item.getUserIds())) + .failOn(AnnotationEntityTouchedIntegrationEvent._userIds).failWith(messageSource.getMessage("Validation_Required", new Object[]{AnnotationEntityTouchedIntegrationEvent._userIds}, LocaleContextHolder.getLocale())), + this.navSpec() + .iff(() -> !this.isListNullOrEmpty(item.getUserIds())) + .on(AnnotationEntityTouchedIntegrationEvent._userIds) + .over(item.getUserIds()) + .using((i) -> this.validatorFactory.validator(UuidValidator.class)) + ); + } + } + +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java new file mode 100644 index 000000000..4f771def3 --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java @@ -0,0 +1,7 @@ +package gr.cite.annotation.integrationevent.inbox.annotationentitytouch; + +import gr.cite.annotation.integrationevent.inbox.IntegrationEventHandler; + +public interface AnnotationEntityTouchedIntegrationEventHandler extends IntegrationEventHandler { + +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java new file mode 100644 index 000000000..034ea668e --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java @@ -0,0 +1,149 @@ +package gr.cite.annotation.integrationevent.inbox.annotationentitytouch; + +import gr.cite.annotation.audit.AuditableAction; +import gr.cite.annotation.common.JsonHandlingService; +import gr.cite.annotation.common.enums.IsActive; +import gr.cite.annotation.common.scope.fake.FakeRequestScope; +import gr.cite.annotation.data.EntityUserEntity; +import gr.cite.annotation.integrationevent.inbox.EventProcessingStatus; +import gr.cite.annotation.integrationevent.inbox.InboxPrincipal; +import gr.cite.annotation.integrationevent.inbox.IntegrationEventProperties; +import gr.cite.annotation.query.EntityUserQuery; +import gr.cite.commons.web.oidc.principal.CurrentPrincipalResolver; +import gr.cite.tools.auditing.AuditService; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.validation.ValidatorFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.OptimisticLockException; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class AnnotationEntityTouchedIntegrationEventHandlerImpl implements AnnotationEntityTouchedIntegrationEventHandler { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(AnnotationEntityTouchedIntegrationEventHandlerImpl.class)); + + private final JsonHandlingService jsonHandlingService; + + private final ValidatorFactory validatorFactory; + + private final ApplicationContext applicationContext; + + private final QueryFactory queryFactory; + + public AnnotationEntityTouchedIntegrationEventHandlerImpl(JsonHandlingService jsonHandlingService, ValidatorFactory validatorFactory, ApplicationContext applicationContext, QueryFactory queryFactory) { + this.jsonHandlingService = jsonHandlingService; + this.validatorFactory = validatorFactory; + this.applicationContext = applicationContext; + this.queryFactory = queryFactory; + } + + @Override + public EventProcessingStatus handle(IntegrationEventProperties properties, String message) { + AnnotationEntityTouchedIntegrationEvent event = this.jsonHandlingService.fromJsonSafe(AnnotationEntityTouchedIntegrationEvent.class, message); + if (event == null) + return EventProcessingStatus.Error; + + logger.debug("Handling {}", AnnotationEntityTouchedIntegrationEvent.class.getSimpleName()); + + this.validatorFactory.validator(AnnotationEntityTouchedIntegrationEvent.AnnotationEntityTouchedIntegrationEventValidator.class).validateForce(event); + + EntityManager entityManager = null; + EntityTransaction transaction = null; + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { +// QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); +// TenantScope scope = this.applicationContext.getBean(TenantScope.class); +// if (scope.isMultitenant() && event.getTenant() != null) { +// TenantEntity tenant = queryFactory.query(TenantQuery.class).ids(event.getTenant()).firstAs(new BaseFieldSet().ensure(Tenant._id).ensure(Tenant._code)); +// if (tenant == null) { +// logger.error("missing tenant from event message"); +// return EventProcessingStatus.Error; +// } +// scope.setTenant(event.getTenant(), tenant.getCode()); +// } else if (scope.isMultitenant()) { +// logger.error("missing tenant from event message"); +// return EventProcessingStatus.Error; +// } +// +// ValidationService validator = this.applicationContext.getBean(ValidationService.class); +// validator.validateForce(model); + + CurrentPrincipalResolver currentPrincipalResolver = this.applicationContext.getBean(CurrentPrincipalResolver.class); + currentPrincipalResolver.push(InboxPrincipal.build(properties)); + + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + entityManager = entityManagerFactory.createEntityManager(); + + transaction = entityManager.getTransaction(); + transaction.begin(); + + try { + EntityUserQuery entityUserQuery = this.queryFactory.query(EntityUserQuery.class); + List associatedUsersEntities = entityUserQuery + .entityIds(event.getEntityId()) + .isActive(IsActive.Active) + .collect(); + List associatedUsers = associatedUsersEntities.stream() + .map(EntityUserEntity::getUserId) + .toList(); + for (UUID user : event.getUserIds()) { + if (!associatedUsers.contains(user)) { + EntityUserEntity entityUserEntity = new EntityUserEntity(); + entityUserEntity.setId(UUID.randomUUID()); + entityUserEntity.setEntityId(event.getEntityId()); + entityUserEntity.setUserId(user); + entityUserEntity.setCreatedAt(Instant.now()); + entityUserEntity.setUpdatedAt(Instant.now()); + entityUserEntity.setIsActive(IsActive.Active); + + entityManager.persist(entityUserEntity); + } + } + + AuditService auditService = this.applicationContext.getBean(AuditService.class); + + auditService.track(AuditableAction.User_Persist, Map.ofEntries( + new AbstractMap.SimpleEntry("model", event) + )); + + transaction.commit(); + } catch (Exception e) { + transaction.rollback(); + throw e; + } finally { + currentPrincipalResolver.pop(); + } + } catch (OptimisticLockException ex) { + // we get this if/when someone else already modified the notifications. We want to essentially ignore this, and keep working + logger.debug("Concurrency exception getting queue outbox. Skipping: {} ", ex.getMessage()); + if (transaction != null) + transaction.rollback(); + } catch (Exception ex) { + logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); + if (transaction != null) + transaction.rollback(); + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); + } + return EventProcessingStatus.Success; + } + +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEvent.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEvent.java similarity index 87% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEvent.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEvent.java index 60824de80..11a47a881 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEvent.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEvent.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.tenanttouched; +package gr.cite.annotation.integrationevent.inbox.tenanttouch; import gr.cite.annotation.integrationevent.TrackedEvent; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandler.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandler.java similarity index 71% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandler.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandler.java index 2e5391235..e0843267a 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandler.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandler.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.tenanttouched; +package gr.cite.annotation.integrationevent.inbox.tenanttouch; import gr.cite.annotation.integrationevent.inbox.IntegrationEventHandler; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandlerImpl.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandlerImpl.java similarity index 98% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandlerImpl.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandlerImpl.java index d7ba365ec..559874974 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouched/TenantTouchedIntegrationEventHandlerImpl.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/tenanttouch/TenantTouchedIntegrationEventHandlerImpl.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.tenanttouched; +package gr.cite.annotation.integrationevent.inbox.tenanttouch; import gr.cite.commons.web.oidc.principal.CurrentPrincipalResolver; import gr.cite.annotation.audit.AuditableAction; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEvent.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEvent.java similarity index 98% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEvent.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEvent.java index 3b4e9b837..5df47faca 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEvent.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEvent.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.usertouched; +package gr.cite.annotation.integrationevent.inbox.usertouch; import gr.cite.annotation.common.enums.ContactInfoType; import gr.cite.annotation.common.validation.BaseValidator; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandler.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandler.java similarity index 72% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandler.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandler.java index 42f140ba2..dd36fad10 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandler.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandler.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.usertouched; +package gr.cite.annotation.integrationevent.inbox.usertouch; import gr.cite.annotation.integrationevent.inbox.IntegrationEventHandler; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandlerImpl.java similarity index 98% rename from annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java rename to annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandlerImpl.java index d389fde94..60288eb09 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/integrationevent/inbox/usertouch/UserTouchedIntegrationEventHandlerImpl.java @@ -1,4 +1,4 @@ -package gr.cite.annotation.integrationevent.inbox.usertouched; +package gr.cite.annotation.integrationevent.inbox.usertouch; import gr.cite.commons.web.oidc.principal.CurrentPrincipalResolver; import gr.cite.annotation.audit.AuditableAction; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/persist/UserTouchedIntegrationEventPersist.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/persist/UserTouchedIntegrationEventPersist.java index da06b8cee..1c184d609 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/persist/UserTouchedIntegrationEventPersist.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/persist/UserTouchedIntegrationEventPersist.java @@ -3,7 +3,7 @@ package gr.cite.annotation.model.persist; import gr.cite.annotation.common.validation.BaseValidator; import gr.cite.annotation.convention.ConventionService; import gr.cite.annotation.errorcode.ErrorThesaurusProperties; -import gr.cite.annotation.integrationevent.inbox.usertouched.UserTouchedIntegrationEvent; +import gr.cite.annotation.integrationevent.inbox.usertouch.UserTouchedIntegrationEvent; import gr.cite.tools.validation.specification.Specification; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/EntityUserQuery.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/EntityUserQuery.java new file mode 100644 index 000000000..2c5c36673 --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/EntityUserQuery.java @@ -0,0 +1,146 @@ +package gr.cite.annotation.query; + +import gr.cite.annotation.authorization.AuthorizationFlags; +import gr.cite.annotation.common.enums.IsActive; +import gr.cite.annotation.data.EntityUserEntity; +import gr.cite.tools.data.query.FieldResolver; +import gr.cite.tools.data.query.QueryBase; +import gr.cite.tools.data.query.QueryContext; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; + +import java.util.*; + +@Component +@RequestScope +public class EntityUserQuery extends QueryBase { + + private Collection ids, entityIds, userIds; + + private Collection isActives; + + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + public EntityUserQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } + + public EntityUserQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } + + public EntityUserQuery ids(Collection values) { + this.ids = values; + return this; + } + + public EntityUserQuery entityIds(UUID value) { + this.entityIds = List.of(value); + return this; + } + + public EntityUserQuery entityIds(UUID... value) { + this.entityIds = Arrays.asList(value); + return this; + } + + public EntityUserQuery entityIds(Collection values) { + this.entityIds = values; + return this; + } + + public EntityUserQuery userIds(UUID value) { + this.userIds = List.of(value); + return this; + } + + public EntityUserQuery userIds(UUID... value) { + this.userIds = Arrays.asList(value); + return this; + } + + public EntityUserQuery userIds(Collection values) { + this.userIds = values; + return this; + } + + public EntityUserQuery isActive(IsActive value) { + this.isActives = List.of(value); + return this; + } + + public EntityUserQuery isActive(IsActive... value) { + this.isActives = Arrays.asList(value); + return this; + } + + public EntityUserQuery isActive(Collection values) { + this.isActives = values; + return this; + } + + public EntityUserQuery authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + protected Boolean isFalseQuery() { + return false; + } + + @Override + protected Class entityClass() { + return EntityUserEntity.class; + } + + @Override + protected Predicate applyFilters(QueryContext queryContext) { + List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(EntityUserEntity._id)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.entityIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(EntityUserEntity._entityId)); + for (UUID item : this.entityIds) + inClause.value(item); + predicates.add(inClause); + } + if (this.userIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(EntityUserEntity._userId)); + for (UUID item : this.userIds) + inClause.value(item); + predicates.add(inClause); + } + if (this.isActives != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(EntityUserEntity._isActive)); + for (IsActive item : this.isActives) + inClause.value(item); + predicates.add(inClause); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return null; + } + } + + @Override + protected String fieldNameOf(FieldResolver item) { + return null; + } + + @Override + protected EntityUserEntity convert(Tuple tuple, Set columns) { + return null; + } +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/UserQuery.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/UserQuery.java index 97de609ba..1e6ac6e4c 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/UserQuery.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/UserQuery.java @@ -1,6 +1,5 @@ package gr.cite.annotation.query; -import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.annotation.authorization.AuthorizationFlags; import gr.cite.annotation.authorization.Permission; import gr.cite.annotation.common.enums.IsActive; @@ -8,6 +7,7 @@ import gr.cite.annotation.common.scope.user.UserScope; import gr.cite.annotation.data.UserEntity; import gr.cite.annotation.model.User; import gr.cite.annotation.model.user.PublicUser; +import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.QueryBase; import gr.cite.tools.data.query.QueryContext; @@ -24,136 +24,151 @@ import java.util.*; @RequestScope public class UserQuery extends QueryBase { - private String like; - private Collection ids; - private Collection isActives; + private String like; - private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + private Collection ids; - private final UserScope userScope; - private final AuthorizationService authService; + private Collection isActives; - public UserQuery( - UserScope userScope, - AuthorizationService authService - ) { - this.userScope = userScope; - this.authService = authService; - } + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); - public UserQuery like(String value) { - this.like = value; - return this; - } + private final UserScope userScope; - public UserQuery ids(UUID value) { - this.ids = List.of(value); - return this; - } + private final AuthorizationService authService; - public UserQuery ids(UUID... value) { - this.ids = Arrays.asList(value); - return this; - } + public UserQuery( + UserScope userScope, + AuthorizationService authService + ) { + this.userScope = userScope; + this.authService = authService; + } - public UserQuery ids(Collection values) { - this.ids = values; - return this; - } + public UserQuery like(String value) { + this.like = value; + return this; + } - public UserQuery isActive(IsActive value) { - this.isActives = List.of(value); - return this; - } + public UserQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } - public UserQuery isActive(IsActive... value) { - this.isActives = Arrays.asList(value); - return this; - } + public UserQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } - public UserQuery isActive(Collection values) { - this.isActives = values; - return this; - } + public UserQuery ids(Collection values) { + this.ids = values; + return this; + } - public UserQuery authorize(EnumSet values) { - this.authorize = values; - return this; - } + public UserQuery isActive(IsActive value) { + this.isActives = List.of(value); + return this; + } - @Override - protected Class entityClass() { - return UserEntity.class; - } + public UserQuery isActive(IsActive... value) { + this.isActives = Arrays.asList(value); + return this; + } - @Override - protected Boolean isFalseQuery() { - return this.isEmpty(this.ids) || this.isEmpty(this.isActives); - } + public UserQuery isActive(Collection values) { + this.isActives = values; + return this; + } - @Override - protected Predicate applyAuthZ(QueryContext queryContext) { - if (this.authorize.contains(AuthorizationFlags.None)) return null; - if (this.authorize.contains(AuthorizationFlags.Permission) && this.authService.authorize(Permission.BrowseUser)) return null; - UUID ownerId = null; - if (this.authorize.contains(AuthorizationFlags.Owner)) ownerId = this.userScope.getUserIdSafe(); + public UserQuery authorize(EnumSet values) { + this.authorize = values; + return this; + } - List predicates = new ArrayList<>(); - if (ownerId != null) { - predicates.add(queryContext.CriteriaBuilder.equal(queryContext.Root.get(User._id), ownerId)); - } - if (predicates.size() > 0) { - Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); - return queryContext.CriteriaBuilder.and(predicatesArray); - } else { - return queryContext.CriteriaBuilder.or(); //Creates a false query - } - } + @Override + protected Class entityClass() { + return UserEntity.class; + } - @Override - protected Predicate applyFilters(QueryContext queryContext) { - List predicates = new ArrayList<>(); - if (this.ids != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)); - for (UUID item : this.ids) inClause.value(item); - predicates.add(inClause); - } - if (this.like != null && !this.like.isEmpty()) { - predicates.add(queryContext.CriteriaBuilder.like(queryContext.Root.get(UserEntity._name), this.like)); - } - if (this.isActives != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._isActive)); - for (IsActive item : this.isActives) inClause.value(item); - predicates.add(inClause); - } - if (predicates.size() > 0) { - Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); - return queryContext.CriteriaBuilder.and(predicatesArray); - } else { - return null; - } - } + @Override + protected Boolean isFalseQuery() { + return this.isEmpty(this.ids) || this.isEmpty(this.isActives); + } - @Override - protected UserEntity convert(Tuple tuple, Set columns) { - UserEntity item = new UserEntity(); - item.setId(QueryBase.convertSafe(tuple, columns, UserEntity._id, UUID.class)); - item.setName(QueryBase.convertSafe(tuple, columns, UserEntity._name, String.class)); - item.setAdditionalInfo(QueryBase.convertSafe(tuple, columns, UserEntity._additionalInfo, String.class)); - item.setCreatedAt(QueryBase.convertSafe(tuple, columns, UserEntity._createdAt, Instant.class)); - item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, UserEntity._updatedAt, Instant.class)); - item.setIsActive(QueryBase.convertSafe(tuple, columns, UserEntity._isActive, IsActive.class)); - return item; - } + @Override + protected Predicate applyAuthZ(QueryContext queryContext) { + if (this.authorize.contains(AuthorizationFlags.None)) + return null; + if (this.authorize.contains(AuthorizationFlags.Permission) && this.authService.authorize(Permission.BrowseUser)) + return null; + UUID ownerId = null; + if (this.authorize.contains(AuthorizationFlags.Owner)) + ownerId = this.userScope.getUserIdSafe(); - @Override - protected String fieldNameOf(FieldResolver item) { - if (item.match(User._id) || item.match(PublicUser._id)) return UserEntity._id; - else if (item.match(User._name) || item.match(PublicUser._name)) return UserEntity._name; - else if (item.match(User._createdAt) ) return UserEntity._createdAt; - else if (item.match(User._updatedAt)) return UserEntity._updatedAt; - else if (item.match(User._hash)) return UserEntity._updatedAt; - else if (item.match(User._isActive)) return UserEntity._isActive; - else return null; - } + List predicates = new ArrayList<>(); + if (ownerId != null) { + predicates.add(queryContext.CriteriaBuilder.equal(queryContext.Root.get(User._id), ownerId)); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return queryContext.CriteriaBuilder.or(); //Creates a false query + } + } + + @Override + protected Predicate applyFilters(QueryContext queryContext) { + List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.like != null && !this.like.isEmpty()) { + predicates.add(queryContext.CriteriaBuilder.like(queryContext.Root.get(UserEntity._name), this.like)); + } + if (this.isActives != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._isActive)); + for (IsActive item : this.isActives) + inClause.value(item); + predicates.add(inClause); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return null; + } + } + + @Override + protected UserEntity convert(Tuple tuple, Set columns) { + UserEntity item = new UserEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, UserEntity._id, UUID.class)); + item.setName(QueryBase.convertSafe(tuple, columns, UserEntity._name, String.class)); + item.setAdditionalInfo(QueryBase.convertSafe(tuple, columns, UserEntity._additionalInfo, String.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, UserEntity._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, UserEntity._updatedAt, Instant.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, UserEntity._isActive, IsActive.class)); + return item; + } + + @Override + protected String fieldNameOf(FieldResolver item) { + if (item.match(User._id) || item.match(PublicUser._id)) + return UserEntity._id; + else if (item.match(User._name) || item.match(PublicUser._name)) + return UserEntity._name; + else if (item.match(User._createdAt)) + return UserEntity._createdAt; + else if (item.match(User._updatedAt)) + return UserEntity._updatedAt; + else if (item.match(User._hash)) + return UserEntity._updatedAt; + else if (item.match(User._isActive)) + return UserEntity._isActive; + else + return null; + } } diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserService.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserService.java index 8d32d3d12..e29fcd36b 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserService.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserService.java @@ -1,7 +1,7 @@ package gr.cite.annotation.service.user; import com.fasterxml.jackson.core.JsonProcessingException; -import gr.cite.annotation.integrationevent.inbox.usertouched.UserTouchedIntegrationEvent; +import gr.cite.annotation.integrationevent.inbox.usertouch.UserTouchedIntegrationEvent; import gr.cite.annotation.model.User; import gr.cite.tools.exception.MyApplicationException; import gr.cite.tools.exception.MyForbiddenException; diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserServiceImpl.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserServiceImpl.java index 3c8e116a4..6567068b3 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserServiceImpl.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/service/user/UserServiceImpl.java @@ -10,7 +10,7 @@ import gr.cite.annotation.convention.ConventionService; import gr.cite.annotation.data.UserContactInfoEntity; import gr.cite.annotation.data.UserCredentialEntity; import gr.cite.annotation.data.UserEntity; -import gr.cite.annotation.integrationevent.inbox.usertouched.UserTouchedIntegrationEvent; +import gr.cite.annotation.integrationevent.inbox.usertouch.UserTouchedIntegrationEvent; import gr.cite.annotation.model.User; import gr.cite.annotation.model.builder.UserBuilder; import gr.cite.annotation.model.deleter.UserDeleter; diff --git a/dmp-backend/core/pom.xml b/dmp-backend/core/pom.xml index 0d24aa6b8..e12019146 100644 --- a/dmp-backend/core/pom.xml +++ b/dmp-backend/core/pom.xml @@ -50,12 +50,12 @@ gr.cite.opendmp common-models - 0.0.2 + 0.0.3 gr.cite.opendmp file-transformer-base - 0.0.5 + 0.0.6 gr.cite diff --git a/dmp-backend/core/src/main/java/eu/eudat/audit/AuditableAction.java b/dmp-backend/core/src/main/java/eu/eudat/audit/AuditableAction.java index 1c451b6d2..47280bc7a 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/audit/AuditableAction.java +++ b/dmp-backend/core/src/main/java/eu/eudat/audit/AuditableAction.java @@ -40,7 +40,8 @@ public class AuditableAction { public static final EventId Dmp_Invite_Users = new EventId(5008, "Dmp_Invite_Users"); public static final EventId Dmp_Invite_Accept = new EventId(5009, "Dmp_Invite_Accept"); public static final EventId Dmp_PublicQuery = new EventId(5010, "Dmp_PublicQuery"); - public static final EventId Dmp_PublicLookup = new EventId(5011, "Dmp_PublicLookup"); + public static final EventId Dmp_Export = new EventId(5011, "Dmp_Export"); + public static final EventId Dmp_PublicLookup = new EventId(5012, "Dmp_PublicLookup"); public static final EventId Description_Query = new EventId(6000, "Description_Query"); public static final EventId Description_Lookup = new EventId(6001, "Description_Lookup"); diff --git a/dmp-backend/core/src/main/java/eu/eudat/authorization/AuthorizationFlags.java b/dmp-backend/core/src/main/java/eu/eudat/authorization/AuthorizationFlags.java index afb9654b0..0a0255495 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/authorization/AuthorizationFlags.java +++ b/dmp-backend/core/src/main/java/eu/eudat/authorization/AuthorizationFlags.java @@ -4,5 +4,5 @@ import java.util.EnumSet; public enum AuthorizationFlags { None, Permission, DmpAssociated, Public, Owner; - public static final EnumSet OwnerOrDmpAssociatedOrPermissionOrPublic = EnumSet.of(DmpAssociated, Permission, Public, Owner); + public static final EnumSet OwnerOrDmpAssociatedOrPermission = EnumSet.of(DmpAssociated, Permission, Owner); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/authorization/Permission.java b/dmp-backend/core/src/main/java/eu/eudat/authorization/Permission.java index 322326452..fc8374251 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/authorization/Permission.java +++ b/dmp-backend/core/src/main/java/eu/eudat/authorization/Permission.java @@ -3,19 +3,15 @@ package eu.eudat.authorization; public final class Permission { /////// Should Remove after Refactor - public static String AnonymousRole = "AnonymousRole"; public static String AdminRole = "AdminRole"; - public static String ManagerRole = "ManagerRole"; - public static String UserRole = "UserRole"; public static String AuthenticatedRole = "AuthenticatedRole"; - public static String PublicRole = "PublicRole"; - public static String DatasetProfileManagerRole = "DatasetProfileManagerRole"; ///// + public static String DeferredAffiliation = "DeferredAffiliation"; //Public public static String PublicBrowseDescription = "PublicBrowseDescription"; - public static String PublicBrowseDescriptionTemplate = "BrowseDescriptionTemplate"; + public static String PublicBrowseDescriptionTemplate = "PublicBrowseDescriptionTemplate"; public static String PublicBrowseDmp = "PublicBrowseDmp"; public static String PublicBrowseDmpReference = "PublicBrowseDmpReference"; public static String PublicBrowseDmpUser = "PublicBrowseDmpUser"; @@ -73,6 +69,8 @@ public final class Permission { //Dmp public static String BrowseDmp = "BrowseDmp"; public static String EditDmp = "EditDmp"; + public static String NewDmp = "NewDmp"; + public static String DeleteDmp = "DeleteDmp"; public static String CloneDmp = "CloneDmp"; public static String CreateNewVersionDmp = "CreateNewVersionDmp"; diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/StorageType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/StorageType.java index 3b72aff20..6525b5abe 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/StorageType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/StorageType.java @@ -9,7 +9,8 @@ public enum StorageType implements DatabaseEnum { Temp((short) 0), Main((short) 1), - Transformer((short)2); + Transformer((short)2), + Deposit((short)3); private final Short value; diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/deposit/DepositProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/deposit/DepositProperties.java index 4ebcded6c..ea695791f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/deposit/DepositProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/deposit/DepositProperties.java @@ -26,6 +26,8 @@ public class DepositProperties { private String clientId; private String clientSecret; private String scope; + private String pdfTransformerId; + private String rdaTransformerId; public String getRepositoryId() { return repositoryId; @@ -74,5 +76,21 @@ public class DepositProperties { public void setScope(String scope) { this.scope = scope; } + + public String getPdfTransformerId() { + return pdfTransformerId; + } + + public void setPdfTransformerId(String pdfTransformerId) { + this.pdfTransformerId = pdfTransformerId; + } + + public String getRdaTransformerId() { + return rdaTransformerId; + } + + public void setRdaTransformerId(String rdaTransformerId) { + this.rdaTransformerId = rdaTransformerId; + } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/transformer/TransformerProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/transformer/TransformerProperties.java index 7457f28a3..d2d0e9e33 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/transformer/TransformerProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/transformer/TransformerProperties.java @@ -22,6 +22,7 @@ public class TransformerProperties { public static class TransformerSource { private final String url; + private final String transformerId; private final List codes; private final String issuerUrl; private final String clientId; @@ -29,9 +30,10 @@ public class TransformerProperties { private final String scope; @ConstructorBinding - public TransformerSource(String url, List codes, String issuerUrl, String clientId, String clientSecret, String scope) { + public TransformerSource(String url, String transformerId, List codes, String issuerUrl, String clientId, String clientSecret, String scope) { this.url = url; - this.codes = codes; + this.transformerId = transformerId; + this.codes = codes; this.issuerUrl = issuerUrl; this.clientId = clientId; this.clientSecret = clientSecret; @@ -61,5 +63,9 @@ public class TransformerProperties { public List getCodes() { return codes; } + + public String getTransformerId() { + return transformerId; + } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java index 3c5cafb37..07896263f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java @@ -98,7 +98,7 @@ public class ReferenceEntity extends TenantScopedBaseEntity { @Column(name = "created_by", columnDefinition = "uuid") private UUID createdById; - public static final String _createdById = "createdBy"; + public static final String _createdById = "createdById"; public UUID getId() { return id; diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java index 54d725201..9c2db4fdc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java @@ -27,6 +27,8 @@ public class OutboxIntegrationEvent extends IntegrationEvent { public static final String DESCRIPTION_TOUCH = "DESCRIPTION_TOUCH"; + public static final String ANNOTATION_ENTITY_TOUCH = "ANNOTATION_ENTITY_TOUCH"; + public static final String WHAT_YOU_KNOW_ABOUT_ME_COMPLETED = "WHAT_YOU_KNOW_ABOUT_ME_COMPLETED"; public static final String GENERATE_FILE = "GENERATE_FILE"; diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java index 8a66f6a26..b9f771aa8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java @@ -23,6 +23,8 @@ public class OutboxProperties { private final String descriptionTouchTopic; + private final String annotationEntityTouchTopic; + private final String notifyTopic; private final String forgetMeCompletedTopic; @@ -37,7 +39,10 @@ public class OutboxProperties { String tenantReactivationTopic, String tenantUserInviteTopic, String userRemovalTopic, - String userTouchTopic, String dmpTouchTopic, String descriptionTouchTopic, + String userTouchTopic, + String dmpTouchTopic, + String descriptionTouchTopic, + String annotationEntityTouchTopic, String notifyTopic, String forgetMeCompletedTopic, String whatYouKnowAboutMeCompletedTopic, @@ -52,6 +57,7 @@ public class OutboxProperties { this.userTouchTopic = userTouchTopic; this.dmpTouchTopic = dmpTouchTopic; this.descriptionTouchTopic = descriptionTouchTopic; + this.annotationEntityTouchTopic = annotationEntityTouchTopic; this.notifyTopic = notifyTopic; this.forgetMeCompletedTopic = forgetMeCompletedTopic; this.whatYouKnowAboutMeCompletedTopic = whatYouKnowAboutMeCompletedTopic; @@ -94,6 +100,10 @@ public class OutboxProperties { return descriptionTouchTopic; } + public String getAnnotationEntityTouchTopic() { + return annotationEntityTouchTopic; + } + public String getNotifyTopic() { return notifyTopic; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java index 4ef2cd90b..08f8a8eca 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java @@ -415,6 +415,10 @@ public class OutboxRepositoryImpl implements OutboxRepository { routingKey = this.outboxProperties.getDescriptionTouchTopic(); break; } + case OutboxIntegrationEvent.ANNOTATION_ENTITY_TOUCH: { + routingKey = this.outboxProperties.getAnnotationEntityTouchTopic(); + break; + } case OutboxIntegrationEvent.FORGET_ME_COMPLETED: { routingKey = this.outboxProperties.getForgetMeCompletedTopic(); break; diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java new file mode 100644 index 000000000..715d6d7f2 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEvent.java @@ -0,0 +1,30 @@ +package eu.eudat.integrationevent.outbox.annotationentitytouch; + +import eu.eudat.integrationevent.TrackedEvent; + +import java.util.List; +import java.util.UUID; + +public class AnnotationEntityTouchedIntegrationEvent extends TrackedEvent { + + private UUID entityId; + + private List userIds; + + public UUID getEntityId() { + return entityId; + } + + public void setEntityId(UUID entityId) { + this.entityId = entityId; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java new file mode 100644 index 000000000..856a4922a --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandler.java @@ -0,0 +1,25 @@ +package eu.eudat.integrationevent.outbox.annotationentitytouch; + +import eu.eudat.integrationevent.outbox.dmptouched.DmpTouchedIntegrationEvent; +import eu.eudat.model.persist.DmpPersist; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public interface AnnotationEntityTouchedIntegrationEventHandler { + + void handle(AnnotationEntityTouchedIntegrationEvent event); + + static AnnotationEntityTouchedIntegrationEvent buildEventFromPersistModel(DmpPersist persist) { + AnnotationEntityTouchedIntegrationEvent event = new AnnotationEntityTouchedIntegrationEvent(); + event.setEntityId(persist.getId()); + List users = new ArrayList<>(); + persist.getUsers().forEach(dmpUserPersist -> { + users.add(dmpUserPersist.getUser()); + }); + event.setUserIds(users); + return event; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java new file mode 100644 index 000000000..37a9541e4 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java @@ -0,0 +1,34 @@ +package eu.eudat.integrationevent.outbox.annotationentitytouch; + +import eu.eudat.integrationevent.outbox.OutboxIntegrationEvent; +import eu.eudat.integrationevent.outbox.OutboxService; +import gr.cite.tools.logging.LoggerService; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class AnnotationEntityTouchedIntegrationEventHandlerImpl implements AnnotationEntityTouchedIntegrationEventHandler { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(AnnotationEntityTouchedIntegrationEventHandlerImpl.class)); + + private final OutboxService outboxService; + + public AnnotationEntityTouchedIntegrationEventHandlerImpl(OutboxService outboxService) { + this.outboxService = outboxService; + } + + @Override + public void handle(AnnotationEntityTouchedIntegrationEvent event) { + OutboxIntegrationEvent message = new OutboxIntegrationEvent(); + message.setMessageId(UUID.randomUUID()); + message.setType(OutboxIntegrationEvent.ANNOTATION_ENTITY_TOUCH); + message.setEvent(event); + this.outboxService.publish(message); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmp.java b/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmp.java index a23903658..1ad8dbb90 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmp.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmp.java @@ -37,7 +37,16 @@ public class PublicDmp { public static final String _publishedAt = "publishedAt"; - private List users; + private DmpStatus status; + public static final String _status = "status"; + + private UUID groupId; + public static final String _groupId = "groupId"; + + private DmpAccessType accessType; + public static final String _accessType = "accessType"; + + private List dmpUsers; public static final String _dmpUsers = "dmpUsers"; @@ -104,12 +113,36 @@ public class PublicDmp { this.publishedAt = publishedAt; } - public List getUsers() { - return users; + public DmpStatus getStatus() { + return status; } - public void setUsers(List users) { - this.users = users; + public void setStatus(DmpStatus status) { + this.status = status; + } + + public UUID getGroupId() { + return groupId; + } + + public void setGroupId(UUID groupId) { + this.groupId = groupId; + } + + public DmpAccessType getAccessType() { + return accessType; + } + + public void setAccessType(DmpAccessType accessType) { + this.accessType = accessType; + } + + public List getDmpUsers() { + return dmpUsers; + } + + public void setDmpUsers(List dmpUsers) { + this.dmpUsers = dmpUsers; } public List getDmpReferences() { diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmpReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmpReference.java index a237f3752..707c8e142 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmpReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/PublicDmpReference.java @@ -1,5 +1,7 @@ package eu.eudat.model; +import eu.eudat.commons.enums.IsActive; + import java.time.Instant; import java.util.UUID; @@ -14,6 +16,9 @@ public class PublicDmpReference { private PublicReference reference; public static final String _reference = "reference"; + private IsActive isActive; + public static final String _isActive = "isActive"; + public UUID getId() { return id; } @@ -37,4 +42,12 @@ public class PublicDmpReference { public void setReference(PublicReference reference) { this.reference = reference; } + + public IsActive getIsActive() { + return isActive; + } + + public void setIsActive(IsActive isActive) { + this.isActive = isActive; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpBuilder.java index b07921a91..05d146e99 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpBuilder.java @@ -74,9 +74,13 @@ public class PublicDmpBuilder extends BaseBuilder { if (fields.hasField(this.asIndexer(PublicDmp._description))) m.setDescription(d.getDescription()); if (fields.hasField(this.asIndexer(PublicDmp._finalizedAt))) m.setFinalizedAt(d.getFinalizedAt()); if (fields.hasField(this.asIndexer(PublicDmp._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); + if (fields.hasField(this.asIndexer(PublicDmp._accessType))) m.setAccessType(d.getAccessType()); + if (fields.hasField(this.asIndexer(PublicDmp._status))) m.setStatus(d.getStatus()); + if (fields.hasField(this.asIndexer(PublicDmp._groupId))) m.setGroupId(d.getGroupId()); + if (fields.hasField(this.asIndexer(PublicDmp._accessType))) m.setAccessType(d.getAccessType()); if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) m.setDmpReferences(dmpReferenceMap.get(d.getId())); - if (dmpUsersMap != null && !dmpUsersMap.isEmpty() && dmpUsersMap.containsKey(d.getId())) m.setUsers(dmpUsersMap.get(d.getId())); + if (dmpUsersMap != null && !dmpUsersMap.isEmpty() && dmpUsersMap.containsKey(d.getId())) m.setDmpUsers(dmpUsersMap.get(d.getId())); if (descriptionsMap != null && !descriptionsMap.isEmpty() && descriptionsMap.containsKey(d.getId())) m.setDescriptions(descriptionsMap.get(d.getId())); models.add(m); @@ -109,7 +113,7 @@ public class PublicDmpBuilder extends BaseBuilder { this.logger.debug("checking related - {}", PublicDmpUser.class.getSimpleName()); Map> itemMap = null; - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(PublicDmpUser._user, PublicDmp._id)); + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(PublicDmpUser._dmp, PublicDmp._id)); DmpUserQuery query = this.queryFactory.query(DmpUserQuery.class).authorize(this.authorize).dmpIds(data.stream().map(DmpEntity::getId).distinct().collect(Collectors.toList())); itemMap = this.builderFactory.builder(PublicDmpUserBuilder.class).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpReferenceBuilder.java index a6b31b46e..172adc03e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/PublicDmpReferenceBuilder.java @@ -66,6 +66,7 @@ public class PublicDmpReferenceBuilder extends BaseBuilder> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); @@ -95,7 +102,7 @@ public class DescriptionCommonModelBuilder extends BaseCommonModelBuilder(m, d)); } @@ -143,7 +150,7 @@ public class DescriptionCommonModelBuilder extends BaseCommonModelBuilder itemMap; DmpQuery q = this.queryFactory.query(DmpQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDmpId).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DmpCommonModelBuilder.class).setDisableDescriptions(true).authorize(this.authorize).asForeignKey(q, DmpEntity::getId); + itemMap = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(useSharedStorage).setDisableDescriptions(true).authorize(this.authorize).asForeignKey(q, DmpEntity::getId); return itemMap; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/FieldCommonModelBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/FieldCommonModelBuilder.java index 9414701ad..be82ab1a7 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/FieldCommonModelBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/FieldCommonModelBuilder.java @@ -1,27 +1,42 @@ package eu.eudat.model.builder.commonmodels.description; import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commonmodels.models.FileEnvelopeModel; import eu.eudat.commonmodels.models.description.FieldModel; import eu.eudat.commonmodels.models.reference.ReferenceModel; import eu.eudat.commons.enums.FieldType; +import eu.eudat.commons.enums.StorageType; +import eu.eudat.commons.scope.user.UserScope; import eu.eudat.commons.types.description.FieldEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.ReferenceEntity; +import eu.eudat.data.StorageFileEntity; import eu.eudat.model.Reference; +import eu.eudat.model.StorageFile; import eu.eudat.model.builder.commonmodels.BaseCommonModelBuilder; import eu.eudat.model.builder.commonmodels.CommonModelBuilderItemResponse; import eu.eudat.model.builder.commonmodels.reference.ReferenceCommonModelBuilder; +import eu.eudat.model.persist.StorageFilePersist; import eu.eudat.query.ReferenceQuery; +import eu.eudat.query.StorageFileQuery; +import eu.eudat.service.storage.StorageFileProperties; +import eu.eudat.service.storage.StorageFileService; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.validation.ValidatorFactory; +import org.apache.commons.io.FilenameUtils; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.io.IOException; +import java.net.URLConnection; +import java.time.Duration; import java.util.*; import java.util.stream.Collectors; @@ -32,24 +47,38 @@ public class FieldCommonModelBuilder extends BaseCommonModelBuilder authorize = EnumSet.of(AuthorizationFlags.None); private eu.eudat.commons.types.descriptiontemplate.FieldEntity fieldEntity; + private final StorageFileService storageFileService; + private final UserScope userScope; + private final ValidatorFactory validatorFactory; + private final StorageFileProperties storageFileProperties; @Autowired public FieldCommonModelBuilder( - ConventionService conventionService, BuilderFactory builderFactory, QueryFactory queryFactory + ConventionService conventionService, BuilderFactory builderFactory, QueryFactory queryFactory, StorageFileService storageFileService, UserScope userScope, ValidatorFactory validatorFactory, StorageFileProperties storageFileProperties ) { super(conventionService, new LoggerService(LoggerFactory.getLogger(FieldCommonModelBuilder.class))); this.builderFactory = builderFactory; this.queryFactory = queryFactory; + this.storageFileService = storageFileService; + this.userScope = userScope; + this.validatorFactory = validatorFactory; + this.storageFileProperties = storageFileProperties; } public FieldCommonModelBuilder authorize(EnumSet values) { this.authorize = values; return this; } - public FieldCommonModelBuilder withFieldEntity(eu.eudat.commons.types.descriptiontemplate.FieldEntity fieldEntity) { this.fieldEntity = fieldEntity; return this; } + + + private boolean useSharedStorage; + public FieldCommonModelBuilder useSharedStorage(boolean useSharedStorage) { + this.useSharedStorage = useSharedStorage; + return this; + } @Override protected List> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); @@ -72,6 +101,24 @@ public class FieldCommonModelBuilder extends BaseCommonModelBuilder(m, d)); @@ -82,6 +129,19 @@ public class FieldCommonModelBuilder extends BaseCommonModelBuilder collectReferences(List data) throws MyApplicationException { if (data.isEmpty()) return null; diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionCommonModelBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionCommonModelBuilder.java index c64f667b4..249f03b68 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionCommonModelBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionCommonModelBuilder.java @@ -42,6 +42,13 @@ public class PropertyDefinitionCommonModelBuilder extends BaseCommonModelBuilder this.definition = definition; return this; } + + + private boolean useSharedStorage; + public PropertyDefinitionCommonModelBuilder useSharedStorage(boolean useSharedStorage) { + this.useSharedStorage = useSharedStorage; + return this; + } @Override protected List> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); @@ -53,7 +60,7 @@ public class PropertyDefinitionCommonModelBuilder extends BaseCommonModelBuilder m.setFieldSets(new HashMap<>()); for (String key : d.getFieldSets().keySet()){ FieldSetEntity fieldSetEntity = definition != null ? definition.getFieldSetById(key).stream().findFirst().orElse(null) : null; - m.getFieldSets().put(key, this.builderFactory.builder(PropertyDefinitionFieldSetCommonModelBuilder.class).authorize(this.authorize).withFieldSetEntity(fieldSetEntity).build(d.getFieldSets().get(key))); + m.getFieldSets().put(key, this.builderFactory.builder(PropertyDefinitionFieldSetCommonModelBuilder.class).useSharedStorage(useSharedStorage).authorize(this.authorize).withFieldSetEntity(fieldSetEntity).build(d.getFieldSets().get(key))); } models.add(new CommonModelBuilderItemResponse<>(m, d)); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetCommonModelBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetCommonModelBuilder.java index 179b51737..b5825b068 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetCommonModelBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetCommonModelBuilder.java @@ -42,6 +42,13 @@ public class PropertyDefinitionFieldSetCommonModelBuilder extends BaseCommonMode this.fieldSetEntity = fieldSetEntity; return this; } + + + private boolean useSharedStorage; + public PropertyDefinitionFieldSetCommonModelBuilder useSharedStorage(boolean useSharedStorage) { + this.useSharedStorage = useSharedStorage; + return this; + } @Override protected List> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); @@ -50,7 +57,7 @@ public class PropertyDefinitionFieldSetCommonModelBuilder extends BaseCommonMode List> models = new ArrayList<>(); for (PropertyDefinitionFieldSetEntity d : data) { PropertyDefinitionFieldSetModel m = new PropertyDefinitionFieldSetModel(); - if (d.getItems() != null) m.setItems(this.builderFactory.builder(PropertyDefinitionFieldSetItemModelCommonModelBuilder.class).withFieldSetEntity(this.fieldSetEntity).authorize(this.authorize).build(d.getItems())); + if (d.getItems() != null) m.setItems(this.builderFactory.builder(PropertyDefinitionFieldSetItemModelCommonModelBuilder.class).useSharedStorage(useSharedStorage).withFieldSetEntity(this.fieldSetEntity).authorize(this.authorize).build(d.getItems())); models.add(new CommonModelBuilderItemResponse<>(m, d)); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetItemModelCommonModelBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetItemModelCommonModelBuilder.java index c3b22e580..e8d7af56b 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetItemModelCommonModelBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/description/PropertyDefinitionFieldSetItemModelCommonModelBuilder.java @@ -44,6 +44,13 @@ public class PropertyDefinitionFieldSetItemModelCommonModelBuilder extends BaseC return this; } + + private boolean useSharedStorage; + public PropertyDefinitionFieldSetItemModelCommonModelBuilder useSharedStorage(boolean useSharedStorage) { + this.useSharedStorage = useSharedStorage; + return this; + } + @Override protected List> buildInternal(List data) throws MyApplicationException { @@ -60,7 +67,7 @@ public class PropertyDefinitionFieldSetItemModelCommonModelBuilder extends BaseC m.setFields(new HashMap<>()); for (String key : d.getFields().keySet()){ FieldEntity fieldEntity = fieldSetEntity != null ? fieldSetEntity.getAllField().stream().findFirst().orElse(null) : null; - m.getFields().put(key, this.builderFactory.builder(FieldCommonModelBuilder.class).authorize(this.authorize).withFieldEntity(fieldEntity).build(d.getFields().get(key))); + m.getFields().put(key, this.builderFactory.builder(FieldCommonModelBuilder.class).useSharedStorage(useSharedStorage).authorize(this.authorize).withFieldEntity(fieldEntity).build(d.getFields().get(key))); } } models.add(new CommonModelBuilderItemResponse<>(m, d)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/dmp/DmpCommonModelBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/dmp/DmpCommonModelBuilder.java index e1e4a0f3c..bad3c1ea0 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/dmp/DmpCommonModelBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/commonmodels/dmp/DmpCommonModelBuilder.java @@ -11,7 +11,6 @@ import eu.eudat.commonmodels.models.description.DescriptionModel; import eu.eudat.commonmodels.models.dmp.DmpModel; import eu.eudat.commonmodels.models.dmpblueprint.DmpBlueprintModel; import eu.eudat.commonmodels.models.dmpreference.DmpReferenceModel; -import eu.eudat.commonmodels.models.reference.ReferenceModel; import eu.eudat.commons.JsonHandlingService; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.types.dmp.DmpPropertiesEntity; @@ -22,7 +21,6 @@ import eu.eudat.model.builder.commonmodels.*; import eu.eudat.model.builder.commonmodels.description.DescriptionCommonModelBuilder; import eu.eudat.model.builder.commonmodels.dmpblueprint.DmpBlueprintCommonModelBuilder; import eu.eudat.model.builder.commonmodels.dmpreference.DmpReferenceCommonModelBuilder; -import eu.eudat.model.builder.commonmodels.reference.ReferenceCommonModelBuilder; import eu.eudat.query.*; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.Ordering; @@ -49,7 +47,6 @@ public class DmpCommonModelBuilder extends BaseCommonModelBuilder authorize = EnumSet.of(AuthorizationFlags.None); @@ -79,11 +76,6 @@ public class DmpCommonModelBuilder extends BaseCommonModelBuilder> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); @@ -134,7 +133,6 @@ public class DmpCommonModelBuilder extends BaseCommonModelBuilder (short)1) m.setPreviousDOI(this.getPreviousDOI(d.getGroupId(), d.getId())); switch (d.getAccessType()){ case Public -> m.setAccessType(DmpAccessType.Public); @@ -197,7 +195,7 @@ public class DmpCommonModelBuilder extends BaseCommonModelBuilder> itemMap; DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).authorize(this.authorize).dmpIds(data.stream().map(DmpEntity::getId).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DescriptionCommonModelBuilder.class).authorize(this.authorize).asMasterKey(query, DescriptionEntity::getDmpId); + itemMap = this.builderFactory.builder(DescriptionCommonModelBuilder.class).useSharedStorage(useSharedStorage).authorize(this.authorize).asMasterKey(query, DescriptionEntity::getDmpId); return itemMap; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionCensor.java index 62adac6d8..bb8d7f4f3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionCensor.java @@ -37,7 +37,7 @@ public class DescriptionCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDescription); + this.authService.authorizeForce(Permission.BrowseDescription, Permission.DeferredAffiliation); FieldSet descriptionReferenceFields = fields.extractPrefixed(this.asIndexerPrefix(Description._descriptionReferences)); this.censorFactory.censor(DescriptionReferenceCensor.class).censor(descriptionReferenceFields, userId); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpCensor.java index 9f0002c17..a58bc4078 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpCensor.java @@ -39,7 +39,7 @@ public class DmpCensor extends BaseCensor { if (fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDmp); + this.authService.authorizeForce(Permission.BrowseDmp, Permission.DeferredAffiliation); FieldSet dmpUsersFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpUsers)); this.censorFactory.censor(DmpUserCensor.class).censor(dmpUsersFields, userId); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpDescriptionTemplateCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpDescriptionTemplateCensor.java index a731055d5..177f38813 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpDescriptionTemplateCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpDescriptionTemplateCensor.java @@ -39,7 +39,7 @@ public class DmpDescriptionTemplateCensor extends BaseCensor{ if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDescription); + this.authService.authorizeForce(Permission.BrowseDescription, Permission.DeferredAffiliation); FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpDescriptionTemplate._dmp)); this.censorFactory.censor(DmpCensor.class).censor(dmpFields, userId); FieldSet descriptionTemplatesFields = fields.extractPrefixed(this.asIndexerPrefix(DmpDescriptionTemplate._descriptionTemplates)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java index 02a286b01..c93caa46c 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java @@ -38,7 +38,7 @@ public class DmpReferenceCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDmpDescriptionTemplate); + this.authService.authorizeForce(Permission.BrowseDmpDescriptionTemplate, Permission.DeferredAffiliation); FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._dmp)); this.censorFactory.censor(DmpCensor.class).censor(dmpFields, userId); FieldSet templateFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._reference)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpUserCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpUserCensor.java index 24a59c07c..907b6fb28 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpUserCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpUserCensor.java @@ -37,7 +37,7 @@ public class DmpUserCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDmpUser); + this.authService.authorizeForce(Permission.BrowseDmpUser, Permission.DeferredAffiliation); FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpUser._dmp)); this.censorFactory.censor(DmpCensor.class).censor(dmpFields, userId); FieldSet userFields = fields.extractPrefixed(this.asIndexerPrefix(DmpUser._user)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/EntityDoiCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/EntityDoiCensor.java index 9edbb60f2..96482c729 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/EntityDoiCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/EntityDoiCensor.java @@ -31,6 +31,6 @@ public class EntityDoiCensor extends BaseCensor{ if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseEntityDoi); + this.authService.authorizeForce(Permission.BrowseEntityDoi, Permission.DeferredAffiliation); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceTypeCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceTypeCensor.java index 42987894d..bec5e8c0a 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceTypeCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceTypeCensor.java @@ -38,7 +38,7 @@ public class ReferenceTypeCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseReferenceType); + this.authService.authorizeForce(Permission.BrowseReferenceType, Permission.DeferredAffiliation); FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(ReferenceType._definition)); this.censorFactory.censor(ReferenceTypeDefinitionCensor.class).censor(definitionFields, userId); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/UserCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/UserCensor.java index 86038e84f..8ebd75ecf 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/UserCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/UserCensor.java @@ -37,7 +37,7 @@ public class UserCensor extends BaseCensor { logger.debug(new DataLogEntry("censoring fields", fields)); if (fields == null || fields.isEmpty()) return; - this.authService.authorizeAtLeastOneForce(userId != null ? List.of(new OwnedResource(userId)) : null, Permission.BrowseUser); + this.authService.authorizeAtLeastOneForce(userId != null ? List.of(new OwnedResource(userId)) : null, Permission.BrowseUser, Permission.DeferredAffiliation); FieldSet rolesFields = fields.extractPrefixed(this.asIndexerPrefix(User._roles)); this.censorFactory.censor(UserRoleCensor.class).censor(rolesFields, userId); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/file/ExportRequestModel.java b/dmp-backend/core/src/main/java/eu/eudat/model/file/ExportRequestModel.java index 6e782b6db..ab6dceca7 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/file/ExportRequestModel.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/file/ExportRequestModel.java @@ -5,6 +5,7 @@ import java.util.UUID; public class ExportRequestModel { private UUID id; + private String repositoryId; private String format; public UUID getId() { @@ -22,4 +23,12 @@ public class ExportRequestModel { public void setFormat(String format) { this.format = format; } + + public String getRepositoryId() { + return repositoryId; + } + + public void setRepositoryId(String repositoryId) { + this.repositoryId = repositoryId; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/DmpUserQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/DmpUserQuery.java index da63138e4..3c90783ad 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/DmpUserQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/DmpUserQuery.java @@ -5,9 +5,12 @@ import eu.eudat.authorization.Permission; import eu.eudat.commons.enums.DmpUserRole; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.data.DmpReferenceEntity; import eu.eudat.data.DmpUserEntity; +import eu.eudat.data.ReferenceEntity; import eu.eudat.model.DmpUser; import eu.eudat.model.PublicDmpUser; +import eu.eudat.query.utils.BuildSubQueryInput; import eu.eudat.query.utils.QueryUtilsService; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; @@ -173,7 +176,7 @@ public class DmpUserQuery extends QueryBase { if (userId != null || usePublic ) { predicates.add(queryContext.CriteriaBuilder.or( usePublic ? queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpUserEntity._dmpId)).value(queryUtilsService.buildPublicDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, usePublic)) : queryContext.CriteriaBuilder.or(), //Creates a false query - userId != null ? queryContext.CriteriaBuilder.equal(queryContext.Root.get(DmpUserEntity._userId), userId) : queryContext.CriteriaBuilder.or() //Creates a false query + userId != null ? queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpUserEntity._dmpId)).value(queryUtilsService.buildDmpUserAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, userId)) : queryContext.CriteriaBuilder.or() //Creates a false query )); } if (!predicates.isEmpty()) { @@ -183,7 +186,7 @@ public class DmpUserQuery extends QueryBase { return queryContext.CriteriaBuilder.or(); //Creates a false query } } - + @Override protected Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/EntityDoiQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/EntityDoiQuery.java index da22a63a3..79517b349 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/EntityDoiQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/EntityDoiQuery.java @@ -1,13 +1,15 @@ package eu.eudat.query; import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.authorization.Permission; import eu.eudat.commons.enums.EntityType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.DmpEntity; -import eu.eudat.data.EntityDoiEntity; +import eu.eudat.data.*; import eu.eudat.model.Dmp; import eu.eudat.model.EntityDoi; +import eu.eudat.query.utils.BuildSubQueryInput; +import eu.eudat.query.utils.QueryUtilsService; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.QueryBase; @@ -151,10 +153,19 @@ public class EntityDoiQuery extends QueryBase { return this; } + private final UserScope userScope; + + private final AuthorizationService authService; + + private final QueryUtilsService queryUtilsService; + public EntityDoiQuery( - ) { + UserScope userScope, AuthorizationService authService, QueryUtilsService queryUtilsService) { + this.userScope = userScope; + this.authService = authService; + this.queryUtilsService = queryUtilsService; } @Override @@ -167,6 +178,27 @@ public class EntityDoiQuery extends QueryBase { return this.isEmpty(this.ids) || this.isEmpty(this.isActives)|| this.isEmpty(this.repositoryIds) || this.isEmpty(this.excludedIds) || this.isEmpty(this.types); } + @Override + protected Predicate applyAuthZ(QueryContext queryContext) { + if (this.authorize.contains(AuthorizationFlags.None)) return null; + if (this.authorize.contains(AuthorizationFlags.Permission) && this.authService.authorize(Permission.BrowseUser)) return null; + UUID userId; + if (this.authorize.contains(AuthorizationFlags.Owner)) userId = this.userScope.getUserIdSafe(); + else userId = null; + + List predicates = new ArrayList<>(); + boolean usePublic = this.authorize.contains(AuthorizationFlags.Public); + if (userId != null || usePublic) { + predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(EntityDoiEntity._entityId)).value( queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpUserEntity._dmpId)).value(queryUtilsService.buildDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, userId, usePublic)))); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return queryContext.CriteriaBuilder.or(); //Creates a false query + } + } + @Override protected Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java index 76f220d97..c860321f8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java @@ -1,12 +1,21 @@ package eu.eudat.query; import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.authorization.Permission; +import eu.eudat.commons.enums.DmpAccessType; +import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.ReferenceSourceType; +import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.data.DmpEntity; import eu.eudat.data.DmpReferenceEntity; +import eu.eudat.data.DmpUserEntity; import eu.eudat.data.ReferenceEntity; import eu.eudat.model.PublicReference; import eu.eudat.model.Reference; +import eu.eudat.query.utils.BuildSubQueryInput; +import eu.eudat.query.utils.QueryUtilsService; +import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.QueryBase; import gr.cite.tools.data.query.QueryContext; @@ -163,9 +172,16 @@ public class ReferenceQuery extends QueryBase { this.authorize = values; return this; } + private final UserScope userScope; + + private final AuthorizationService authService; + private final QueryUtilsService queryUtilsService; public ReferenceQuery( - ) { + UserScope userScope, AuthorizationService authService, QueryUtilsService queryUtilsService) { + this.userScope = userScope; + this.authService = authService; + this.queryUtilsService = queryUtilsService; } @Override @@ -178,6 +194,38 @@ public class ReferenceQuery extends QueryBase { return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.sources) ||this.isEmpty(this.excludedIds) || this.isEmpty(this.typeIds) || this.isEmpty(this.referenceSourceTypes)|| this.isFalseQuery(this.dmpReferenceQuery); } + @Override + protected Predicate applyAuthZ(QueryContext queryContext) { + if (this.authorize.contains(AuthorizationFlags.None)) return null; + if (this.authorize.contains(AuthorizationFlags.Permission) && this.authService.authorize(Permission.BrowseReference)) return null; + UUID userId; + boolean usePublic = this.authorize.contains(AuthorizationFlags.Public); + if (this.authorize.contains(AuthorizationFlags.DmpAssociated)) userId = this.userScope.getUserIdSafe(); + else userId = null; + + List predicates = new ArrayList<>(); + if (userId != null || usePublic ) { + predicates.add(queryContext.CriteriaBuilder.or( + queryContext.CriteriaBuilder.isNull(queryContext.Root.get(ReferenceEntity._createdById)), + userId != null ? queryContext.CriteriaBuilder.equal(queryContext.Root.get(ReferenceEntity._createdById), userId) : queryContext.CriteriaBuilder.or(), //Creates a false query + userId != null ? queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._id)).value(queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(new BuildSubQueryInput.Builder<>(DmpReferenceEntity.class, UUID.class) + .query(queryContext.Query) + .criteriaBuilder(queryContext.CriteriaBuilder) + .keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpReferenceEntity._referenceId)) + .filterFunc((subQueryRoot, cb) -> + cb.in(subQueryRoot.get(DmpReferenceEntity._dmpId)).value(queryUtilsService.buildDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, userId, usePublic)) + ) + ))) : queryContext.CriteriaBuilder.or() //Creates a false query + )); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return queryContext.CriteriaBuilder.or(); //Creates a false query + } + } + @Override protected Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/UserQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/UserQuery.java index def9f8801..6fb6d78b6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/UserQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/UserQuery.java @@ -150,11 +150,24 @@ public class UserQuery extends QueryBase { if (this.authorize.contains(AuthorizationFlags.Permission) && this.authService.authorize(Permission.BrowseUser)) return null; UUID userId; if (this.authorize.contains(AuthorizationFlags.Owner)) userId = this.userScope.getUserIdSafe(); + if (this.authorize.contains(AuthorizationFlags.Public)) userId = this.userScope.getUserIdSafe(); else userId = null; List predicates = new ArrayList<>(); - if (userId != null) { - predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(userId)); + boolean usePublic = this.authorize.contains(AuthorizationFlags.Public); + if (userId != null || usePublic) { + UUID finalUserId = userId; + predicates.add(queryContext.CriteriaBuilder.or( + userId != null ? queryContext.CriteriaBuilder.in(queryContext.Root.get(UserEntity._id)).value(userId) : queryContext.CriteriaBuilder.or(), //Creates a false query + queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._id)).value(queryUtilsService.buildSubQuery(new BuildSubQueryInput<>(new BuildSubQueryInput.Builder<>(DmpUserEntity.class, UUID.class) + .query(queryContext.Query) + .criteriaBuilder(queryContext.CriteriaBuilder) + .keyPathFunc((subQueryRoot) -> subQueryRoot.get(DmpUserEntity._userId)) + .filterFunc((subQueryRoot, cb) -> + cb.in(subQueryRoot.get(DmpUserEntity._dmpId)).value(queryUtilsService.buildDmpAuthZSubQuery(queryContext.Query, queryContext.CriteriaBuilder, finalUserId, usePublic)) + ) + ))) + )); } if (!predicates.isEmpty()) { Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/utils/QueryUtilsServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/query/utils/QueryUtilsServiceImpl.java index e118ba807..9f787cde8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/utils/QueryUtilsServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/utils/QueryUtilsServiceImpl.java @@ -52,7 +52,8 @@ public class QueryUtilsServiceImpl implements QueryUtilsService { .filterFunc((subQueryRoot, cb) -> cb.or( usePublic ? cb.and( cb.equal(subQueryRoot.get(DescriptionEntity._status), DescriptionStatus.Finalized), - cb.equal(subQueryRoot.get(DescriptionEntity._isActive), IsActive.Active) + cb.equal(subQueryRoot.get(DescriptionEntity._isActive), IsActive.Active), + cb.in(subQueryRoot.get(DescriptionEntity._dmpId)).value(this.buildDmpAuthZSubQuery(query, criteriaBuilder, userId, usePublic)) ): cb.or(), //Creates a false query userId != null ? cb.equal(subQueryRoot.get(DescriptionEntity._createdById), userId) : cb.or() //Creates a false query ) diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java index ae7dea1ec..89bcc9f67 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dashborad/DashboardServiceImpl.java @@ -3,14 +3,10 @@ package eu.eudat.service.dashborad; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.OwnedResource; import eu.eudat.authorization.Permission; -import eu.eudat.commons.JsonHandlingService; -import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.enums.*; import eu.eudat.commons.scope.user.UserScope; import eu.eudat.commons.types.dashborad.RecentActivityItemEntity; import eu.eudat.convention.ConventionService; -import eu.eudat.errorcode.ErrorThesaurusProperties; -import eu.eudat.event.EventBroker; import eu.eudat.model.*; import eu.eudat.model.builder.PublicReferenceTypeBuilder; import eu.eudat.model.builder.RecentActivityItemBuilder; @@ -21,15 +17,12 @@ import eu.eudat.query.lookup.DmpLookup; import eu.eudat.service.elastic.ElasticQueryHelperService; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.deleter.DeleterFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; -import jakarta.persistence.EntityManager; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; import javax.management.InvalidApplicationException; @@ -76,14 +69,14 @@ public class DashboardServiceImpl implements DashboardService { List recentActivityItemEntities = new ArrayList<>(); DescriptionLookup descriptionLookup = model.asDescriptionLookup(); descriptionLookup.getPage().setOffset(0); - QueryResult descriptions = this.elasticQueryHelperService.collect(descriptionLookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic, new BaseFieldSet().ensure(Description._id).ensure(Description._updatedAt).ensure(Description._status).ensure(Description._label)); + QueryResult descriptions = this.elasticQueryHelperService.collect(descriptionLookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermission, new BaseFieldSet().ensure(Description._id).ensure(Description._updatedAt).ensure(Description._status).ensure(Description._label)); if (!this.conventionService.isListNullOrEmpty(descriptions.getItems())) { for (Description description : descriptions.getItems()) recentActivityItemEntities.add(new RecentActivityItemEntity(RecentActivityItemType.Description, description.getId(), description.getUpdatedAt(), description.getLabel(), description.getStatus().getValue())); } DmpLookup dmpLookup = model.asDmpLookup(); dmpLookup.getPage().setOffset(0); - QueryResult dmps = this.elasticQueryHelperService.collect(dmpLookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic, new BaseFieldSet().ensure(Dmp._id).ensure(Dmp._updatedAt).ensure(Dmp._label).ensure(Dmp._status)); + QueryResult dmps = this.elasticQueryHelperService.collect(dmpLookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermission, new BaseFieldSet().ensure(Dmp._id).ensure(Dmp._updatedAt).ensure(Dmp._label).ensure(Dmp._status)); if (!this.conventionService.isListNullOrEmpty(dmps.getItems())) { for (Dmp dmp : dmps.getItems()) recentActivityItemEntities.add(new RecentActivityItemEntity(RecentActivityItemType.Dmp, dmp.getId(), dmp.getUpdatedAt(), dmp.getLabel(), dmp.getStatus().getValue())); } @@ -102,7 +95,7 @@ public class DashboardServiceImpl implements DashboardService { if (model.getPage() != null){ recentActivityItemEntities = recentActivityItemEntities.stream().skip(model.getPage().getOffset()).limit(model.getPage().getSize()).toList(); } - return this.builderFactory.builder(RecentActivityItemBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(model.getProject()), recentActivityItemEntities); + return this.builderFactory.builder(RecentActivityItemBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(model.getProject()), recentActivityItemEntities); } @Override diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/deposit/DepositServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/deposit/DepositServiceImpl.java index 47e0382a7..a609af160 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/deposit/DepositServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/deposit/DepositServiceImpl.java @@ -4,18 +4,26 @@ import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; import eu.eudat.commonmodels.models.FileEnvelopeModel; import eu.eudat.commonmodels.models.dmp.DmpModel; +import eu.eudat.commons.enums.StorageType; +import eu.eudat.commons.scope.user.UserScope; import eu.eudat.configurations.deposit.DepositProperties; +import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpEntity; import eu.eudat.depositinterface.repository.DepositClient; import eu.eudat.depositinterface.repository.DepositConfiguration; import eu.eudat.model.EntityDoi; +import eu.eudat.model.StorageFile; import eu.eudat.model.builder.commonmodels.DepositConfigurationBuilder; import eu.eudat.model.builder.commonmodels.dmp.DmpCommonModelBuilder; +import eu.eudat.model.persist.StorageFilePersist; import eu.eudat.model.persist.deposit.DepositAuthenticateRequest; import eu.eudat.model.persist.deposit.DepositRequest; import eu.eudat.model.persist.EntityDoiPersist; import eu.eudat.query.DmpQuery; import eu.eudat.service.entitydoi.EntityDoiService; +import eu.eudat.service.storage.StorageFileProperties; +import eu.eudat.service.storage.StorageFileService; +import eu.eudat.service.transformer.FileTransformerService; import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; @@ -23,7 +31,10 @@ import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.validation.ValidatorFactory; +import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,11 +43,11 @@ import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; +import java.io.IOException; import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.net.URLConnection; +import java.time.Duration; +import java.util.*; @Service public class DepositServiceImpl implements DepositService { @@ -52,7 +63,12 @@ public class DepositServiceImpl implements DepositService { private final MessageSource messageSource; private final BuilderFactory builderFactory; private final DepositConfigurationCacheService depositConfigurationCacheService; - + private final FileTransformerService fileTransformerService; + private final StorageFileService storageFileService; + private final UserScope userScope; + private final ValidatorFactory validatorFactory; + private final StorageFileProperties storageFileProperties; + private final ConventionService conventionService; @Autowired public DepositServiceImpl(DepositProperties depositProperties, TokenExchangeCacheService tokenExchangeCacheService, @@ -61,7 +77,7 @@ public class DepositServiceImpl implements DepositService { EntityDoiService doiService, QueryFactory queryFactory, MessageSource messageSource, - BuilderFactory builderFactory, DepositConfigurationCacheService depositConfigurationCacheService) { + BuilderFactory builderFactory, DepositConfigurationCacheService depositConfigurationCacheService, FileTransformerService fileTransformerService, StorageFileService storageFileService, UserScope userScope, ValidatorFactory validatorFactory, StorageFileProperties storageFileProperties, ConventionService conventionService) { this.depositProperties = depositProperties; this.tokenExchangeCacheService = tokenExchangeCacheService; this.authorizationService = authorizationService; @@ -71,6 +87,12 @@ public class DepositServiceImpl implements DepositService { this.messageSource = messageSource; this.builderFactory = builderFactory; this.depositConfigurationCacheService = depositConfigurationCacheService; + this.fileTransformerService = fileTransformerService; + this.storageFileService = storageFileService; + this.userScope = userScope; + this.validatorFactory = validatorFactory; + this.storageFileProperties = storageFileProperties; + this.conventionService = conventionService; this.clients = new HashMap<>(); } @@ -130,29 +152,31 @@ public class DepositServiceImpl implements DepositService { //GK: Forth make the required files to be uploaded with the deposit //TODO: Properly create required files - FileEnvelopeModel docEnvelope = new FileEnvelopeModel(); + DepositProperties.DepositSource source = depositProperties.getSources().stream().filter(depositSource -> depositSource.getRepositoryId().equals(dmpDepositModel.getRepositoryId())).findFirst().orElse(null); + if (source == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpDepositModel.getRepositoryId(), DepositProperties.DepositSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + eu.eudat.model.file.FileEnvelope pdfFile = this.fileTransformerService.exportDmp(dmpEntity.getId(), source.getPdfTransformerId(),"pdf"); + eu.eudat.model.file.FileEnvelope rda = this.fileTransformerService.exportDmp(dmpEntity.getId(), source.getRdaTransformerId(),"json"); + FileEnvelopeModel pdfEnvelope = new FileEnvelopeModel(); FileEnvelopeModel jsonEnvelope = new FileEnvelopeModel(); - FileEnvelopeModel zip = new FileEnvelopeModel(); - //TODO: Create Files -// File zip = new File(environment.getProperty("temp.temp") + UUID.randomUUID() + ".zip"); -// try { -// docEnvelope.setFilename("test.docx"); -// docEnvelope.setFile(this.storageFileService.getH2020TemplateFile()); -// File pdfFile = PDFUtils.convertToPDF(docEnvelope, environment); -// pdfEnvelope.setFilename("test.pdf"); -// pdfEnvelope.setFile(pdfFile); -// File jsonFile = new File(this.environment.getProperty("temp.temp") + UUID.randomUUID() + ".json"); -// jsonEnvelope.setFilename("test.json"); -// jsonEnvelope.setFile(jsonFile); -// -// } catch (IOException e) { -// logger.error(e.getMessage(), e); -// } - + + pdfEnvelope.setFilename(pdfFile.getFilename()); + jsonEnvelope.setMimeType("application/pdf"); + jsonEnvelope.setFilename(rda.getFilename()); + jsonEnvelope.setMimeType("application/json"); + if (!depositClient.getConfiguration().isUseSharedStorage()){ + pdfEnvelope.setFile(pdfFile.getFile()); + jsonEnvelope.setFile(rda.getFile()); + } else { + pdfEnvelope.setFileRef(this.addFileToSharedStorage(pdfFile)); + jsonEnvelope.setFileRef(this.addFileToSharedStorage(rda)); + } + //GK: Fifth Transform them to the DepositModel - DmpModel depositModel = this.builderFactory.builder(DmpCommonModelBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic) - .setRepositoryId(dmpDepositModel.getRepositoryId()).setPdfFile(pdfEnvelope).setRdaJsonFile(jsonEnvelope).setSupportingFilesZip(zip).build(dmpEntity); + DmpModel depositModel = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(depositClient.getConfiguration().isUseSharedStorage()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission) + .setRepositoryId(dmpDepositModel.getRepositoryId()).setPdfFile(pdfEnvelope).setRdaJsonFile(jsonEnvelope).build(dmpEntity); + //GK: Sixth Perform the deposit String doi = depositClient.deposit(depositModel, dmpDepositModel.getAccessToken()); @@ -165,6 +189,19 @@ public class DepositServiceImpl implements DepositService { doiPersist.setEntityId(dmpEntity.getId()); return doiService.persist(doiPersist, dmpDepositModel.getProject()); } + + private String addFileToSharedStorage(eu.eudat.model.file.FileEnvelope file) throws IOException { + StorageFilePersist storageFilePersist = new StorageFilePersist(); + storageFilePersist.setName(FilenameUtils.removeExtension(file.getFilename())); + storageFilePersist.setExtension(FilenameUtils.getExtension(file.getFilename())); + storageFilePersist.setMimeType(URLConnection.guessContentTypeFromName(file.getFilename())); + storageFilePersist.setOwnerId(this.userScope.getUserIdSafe()); + storageFilePersist.setStorageType(StorageType.Temp); + storageFilePersist.setLifetime(Duration.ofSeconds(this.storageFileProperties.getTempStoreLifetimeSeconds())); //TODO + this.validatorFactory.validator(StorageFilePersist.StorageFilePersistValidator.class).validateForce(storageFilePersist); + StorageFile persisted = this.storageFileService.persistBytes(storageFilePersist, file.getFile(), new BaseFieldSet(StorageFile._id, StorageFile._fileRef)); + return persisted.getFileRef(); + } @Override public String getLogo(String repositoryId) { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java index 0cc62e25a..25050e258 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java @@ -20,7 +20,6 @@ import eu.eudat.data.*; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.event.DescriptionTouchedEvent; import eu.eudat.event.EventBroker; -import eu.eudat.integrationevent.outbox.descriptiontouched.DescriptionTouchedIntegrationEvent; import eu.eudat.integrationevent.outbox.descriptiontouched.DescriptionTouchedIntegrationEventHandler; import eu.eudat.integrationevent.outbox.notification.NotifyIntegrationEvent; import eu.eudat.integrationevent.outbox.notification.NotifyIntegrationEventHandler; @@ -208,7 +207,7 @@ public class DescriptionServiceImpl implements DescriptionService { this.descriptionTouchedIntegrationEventHandler.handle(DescriptionTouchedIntegrationEventHandler.buildEventFromPersistModel(model)); this.elasticService.persistDescription(data); - return this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Description._id), data); + return this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Description._id), data); } private void sendNotification(DescriptionEntity description) throws InvalidApplicationException { @@ -358,7 +357,7 @@ public class DescriptionServiceImpl implements DescriptionService { this.elasticService.persistDescription(data); this.eventBroker.emit(new DescriptionTouchedEvent(data.getId())); } - return this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Description._id), data); + return this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Description._id), data); } private @NotNull PropertyDefinitionEntity buildPropertyDefinitionEntity(PropertyDefinitionPersist persist, eu.eudat.commons.types.descriptiontemplate.DefinitionEntity definition, Map> fieldToReferenceMap){ @@ -746,7 +745,7 @@ public class DescriptionServiceImpl implements DescriptionService { public StorageFile uploadFieldFile(DescriptionFieldFilePersist model, MultipartFile file, FieldSet fields) throws IOException { this.authorizationService.authorizeForce(Permission.EditDescription); - DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).ids(model.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).first(); + DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).ids(model.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).first(); if (descriptionTemplate == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); eu.eudat.commons.types.descriptiontemplate.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(eu.eudat.commons.types.descriptiontemplate.DefinitionEntity.class, descriptionTemplate.getDefinition()); diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java index f2c4b6cef..5a8db280d 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java @@ -202,7 +202,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.entityManager.persist(data); this.persistUsers(data.getId(), model.getUsers()); - if (!isUpdate) + if (this.conventionService.isListNullOrEmpty(model.getUsers())) this.addOwner(data); this.entityManager.flush(); @@ -211,7 +211,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.entityManager.flush(); - return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); + return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); } private void updateVersionStatusAndSave(DescriptionTemplateEntity data, DescriptionTemplateStatus previousStatus, DescriptionTemplateStatus newStatus) { @@ -260,9 +260,9 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.sendDescriptionTemplateInvitationEvent(data, NotificationContactType.EMAIL); this.sendDescriptionTemplateInvitationEvent(data, NotificationContactType.IN_APP); } - updatedCreatedIds.add(data.getId()); + updatedCreatedIds.add(data.getUserId()); } - List toDelete = items.stream().filter(x -> updatedCreatedIds.stream().noneMatch(y -> y.equals(x.getId()))).collect(Collectors.toList()); + List toDelete = items.stream().filter(x -> updatedCreatedIds.stream().noneMatch(y -> y.equals(x.getUserId()))).collect(Collectors.toList()); this.deleterFactory.deleter(UserDescriptionTemplateDeleter.class).delete(toDelete); } @@ -470,8 +470,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.authorizationService.authorizeForce(Permission.CloneDescriptionTemplate); - DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fields, query.firstAs(fields)); + DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -603,7 +603,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.entityManager.flush(); - return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); + return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); } //endregion diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplatetype/DescriptionTemplateTypeServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplatetype/DescriptionTemplateTypeServiceImpl.java index b2d082b4b..de38afd60 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplatetype/DescriptionTemplateTypeServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplatetype/DescriptionTemplateTypeServiceImpl.java @@ -106,7 +106,7 @@ public class DescriptionTemplateTypeServiceImpl implements DescriptionTemplateTy this.entityManager.flush(); this.eventBroker.emit(new DescriptionTemplateTypeTouchedEvent(data.getId())); - return this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DescriptionTemplateType._id), data); + return this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, DescriptionTemplateType._id), data); } public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpService.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpService.java index 1e9f8df1f..76e92b64b 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpService.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpService.java @@ -34,7 +34,7 @@ public interface DmpService { List assignUsers(UUID dmp, List model, FieldSet fields) throws InvalidApplicationException, IOException; Dmp removeUser(DmpUserRemovePersist model, FieldSet fields) throws InvalidApplicationException, IOException; - ResponseEntity export(UUID id, String exportType) throws InvalidApplicationException, IOException; + ResponseEntity export(UUID id, String transformerId, String exportType) throws InvalidApplicationException, IOException; void inviteUsers(UUID id, List users) throws InvalidApplicationException, JAXBException, IOException; diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java index f00690ed6..a092d4604 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java @@ -23,6 +23,7 @@ import eu.eudat.data.*; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.event.DmpTouchedEvent; import eu.eudat.event.EventBroker; +import eu.eudat.integrationevent.outbox.annotationentitytouch.AnnotationEntityTouchedIntegrationEventHandler; import eu.eudat.integrationevent.outbox.dmptouched.DmpTouchedIntegrationEventHandler; import eu.eudat.integrationevent.outbox.notification.NotifyIntegrationEvent; import eu.eudat.integrationevent.outbox.notification.NotifyIntegrationEventHandler; @@ -74,7 +75,6 @@ import javax.management.InvalidApplicationException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import java.io.IOException; -import java.nio.file.Files; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -123,6 +123,8 @@ public class DmpServiceImpl implements DmpService { private final DmpTouchedIntegrationEventHandler dmpTouchedIntegrationEventHandler; + private final AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler; + @Autowired public DmpServiceImpl( EntityManager entityManager, @@ -143,7 +145,9 @@ public class DmpServiceImpl implements DmpService { ActionConfirmationService actionConfirmationService, FileTransformerService fileTransformerService, ValidatorFactory validatorFactory, - ElasticService elasticService, DmpTouchedIntegrationEventHandler dmpTouchedIntegrationEventHandler) { + ElasticService elasticService, + DmpTouchedIntegrationEventHandler dmpTouchedIntegrationEventHandler, + AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler) { this.entityManager = entityManager; this.authorizationService = authorizationService; this.deleterFactory = deleterFactory; @@ -164,6 +168,7 @@ public class DmpServiceImpl implements DmpService { this.validatorFactory = validatorFactory; this.elasticService = elasticService; this.dmpTouchedIntegrationEventHandler = dmpTouchedIntegrationEventHandler; + this.annotationEntityTouchedIntegrationEventHandler = annotationEntityTouchedIntegrationEventHandler; } public Dmp persist(DmpPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, IOException { @@ -184,15 +189,33 @@ public class DmpServiceImpl implements DmpService { this.dmpTouchedIntegrationEventHandler.handle(DmpTouchedIntegrationEventHandler.buildEventFromPersistModel(model)); + this.annotationEntityTouchedIntegrationEventHandler.handle(AnnotationEntityTouchedIntegrationEventHandler.buildEventFromPersistModel(model)); + this.sendNotification(data); - - this.elasticService.persistDmp(data); if (!this.conventionService.isListNullOrEmpty(model.getUsers())){ this.inviteUsers(data.getId(), model.getUsers()); + }else{ + this.assignUsers(data.getId(), new ArrayList<>(), null); + this.addOwner(data); } + + this.elasticService.persistDmp(data); - return this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Dmp._id, Dmp._hash), data); + return this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Dmp._id, Dmp._hash), data); + } + + private void addOwner(DmpEntity dmpEntity) throws InvalidApplicationException { + DmpUserEntity data = new DmpUserEntity(); + data.setId(UUID.randomUUID()); + data.setIsActive(IsActive.Active); + data.setCreatedAt(Instant.now()); + data.setUpdatedAt(Instant.now()); + data.setRole(DmpUserRole.Owner); + data.setUserId(userScope.getUserId()); + data.setDmpId(dmpEntity.getId()); + + this.entityManager.persist(data); } private void sendNotification(DmpEntity dmp) throws InvalidApplicationException { @@ -368,7 +391,7 @@ public class DmpServiceImpl implements DmpService { public Dmp buildClone(CloneDmpPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, IOException, InvalidApplicationException { this.authorizationService.authorizeForce(Permission.CloneDmp); - DmpEntity existingDmpEntity = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(model.getId()).firstAs(fields); + DmpEntity existingDmpEntity = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(model.getId()).firstAs(fields); if (!this.conventionService.isValidGuid(model.getId()) || existingDmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -493,7 +516,7 @@ public class DmpServiceImpl implements DmpService { .collect(); this.elasticService.persistDmp(dmpEntity); - return this.builderFactory.builder(DmpUserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fieldSet, DmpUser._id, DmpUser._hash), persisted); + return this.builderFactory.builder(DmpUserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fieldSet, DmpUser._id, DmpUser._hash), persisted); } @Override @@ -514,14 +537,14 @@ public class DmpServiceImpl implements DmpService { if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.elasticService.persistDmp(dmpEntity); - return this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Dmp._id, Dmp._hash), data); + return this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Dmp._id, Dmp._hash), data); } @Override - public ResponseEntity export(UUID id, String exportType) throws InvalidApplicationException, IOException { + public ResponseEntity export(UUID id, String transformerId, String exportType) throws InvalidApplicationException, IOException { HttpHeaders headers = new HttpHeaders(); - FileEnvelope fileEnvelope = this.fileTransformerService.exportDmp(id, exportType); + FileEnvelope fileEnvelope = this.fileTransformerService.exportDmp(id, transformerId, exportType); headers.add("Content-Disposition", "attachment;filename=" + fileEnvelope.getFilename()); byte[] data = fileEnvelope.getFile(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); @@ -532,7 +555,6 @@ public class DmpServiceImpl implements DmpService { Boolean isUpdate = this.conventionService.isValidGuid(model.getId()); DmpEntity data; - DmpUserEntity dmpUserEntity = new DmpUserEntity(); if (isUpdate) { data = this.entityManager.find(DmpEntity.class, model.getId()); if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -553,17 +575,10 @@ public class DmpServiceImpl implements DmpService { data.setBlueprintId(model.getBlueprint()); data.setIsActive(IsActive.Active); data.setCreatedAt(Instant.now()); - - dmpUserEntity.setId(UUID.randomUUID()); - dmpUserEntity.setDmpId(data.getId()); - dmpUserEntity.setUserId(userScope.getUserId()); - dmpUserEntity.setRole(DmpUserRole.Owner); - dmpUserEntity.setCreatedAt(Instant.now()); - dmpUserEntity.setUpdatedAt(Instant.now()); - dmpUserEntity.setIsActive(IsActive.Active); } data.setLabel(model.getLabel()); + data.setLanguage(model.getLanguage()); data.setProperties(this.jsonHandlingService.toJson(this.buildDmpPropertiesEntity(model.getProperties()))); data.setDescription(model.getDescription()); data.setAccessType(model.getAccessType()); @@ -572,7 +587,6 @@ public class DmpServiceImpl implements DmpService { this.entityManager.merge(data); else { this.entityManager.persist(data); - this.entityManager.persist(dmpUserEntity); } this.entityManager.flush(); @@ -796,6 +810,7 @@ public class DmpServiceImpl implements DmpService { throw new InvalidApplicationException("Dmp does not exist!"); } + List usersToAssign = new ArrayList<>(); for (DmpUserPersist user :users) { UUID userId = null; if (user.getUser() != null){ @@ -808,7 +823,7 @@ public class DmpServiceImpl implements DmpService { } if (userId != null){ user.setUser(userId); - this.assignUsers(id, List.of(user), null); + usersToAssign.add(user); if (this.userScope.getUserId() != userId){ this.sendDmpInvitationExistingUser(user.getUser(), dmp, user.getRole()); } @@ -817,6 +832,7 @@ public class DmpServiceImpl implements DmpService { } } + if(!usersToAssign.isEmpty()) this.assignUsers(id, usersToAssign, null); } private void sendDmpInvitationExistingUser(UUID userId, DmpEntity dmp, DmpUserRole role) throws InvalidApplicationException { @@ -900,10 +916,17 @@ public class DmpServiceImpl implements DmpService { } DmpInvitationEntity dmpInvitation = this.xmlHandlingService.fromXmlSafe(DmpInvitationEntity.class, action.getData()); - DmpUserPersist model = new DmpUserPersist(); - model.setUser(this.userScope.getUserIdSafe()); - model.setRole(dmpInvitation.getRole()); - this.assignUsers(dmpInvitation.getDmpId(), List.of(model), null); + + DmpUserEntity data = new DmpUserEntity(); + data.setId(UUID.randomUUID()); + data.setIsActive(IsActive.Active); + data.setCreatedAt(Instant.now()); + data.setUpdatedAt(Instant.now()); + data.setRole(dmpInvitation.getRole()); + data.setUserId(this.userScope.getUserIdSafe()); + data.setDmpId(dmpInvitation.getDmpId()); + this.entityManager.persist(data); + action.setStatus(ActionConfirmationStatus.Accepted); this.entityManager.merge(action); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java index 79cb450e1..fe192a8e2 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java @@ -159,7 +159,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { this.entityManager.flush(); - return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); + return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); } private void updateVersionStatusAndSave(DmpBlueprintEntity data, DmpBlueprintStatus previousStatus, DmpBlueprintStatus newStatus) { @@ -336,8 +336,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { this.authorizationService.authorizeForce(Permission.CloneDmpBlueprint); - DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fields, query.firstAs(fields)); + DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -435,7 +435,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { this.entityManager.flush(); - return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); + return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); } //endregion diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/entitydoi/EntityDoiServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/entitydoi/EntityDoiServiceImpl.java index ce469341a..8bbb126e5 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/entitydoi/EntityDoiServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/entitydoi/EntityDoiServiceImpl.java @@ -109,7 +109,7 @@ public class EntityDoiServiceImpl implements EntityDoiService { this.entityManager.flush(); this.eventBroker.emit(new EntityDoiTouchedEvent(data.getId())); - return this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, EntityDoi._id), data); + return this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, EntityDoi._id), data); } public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/language/LanguageServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/language/LanguageServiceImpl.java index 1d99b8367..4be900a4d 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/language/LanguageServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/language/LanguageServiceImpl.java @@ -25,16 +25,13 @@ import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; import jakarta.persistence.EntityManager; import org.hibernate.FlushMode; -import org.hibernate.annotations.FlushModeType; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import javax.management.InvalidApplicationException; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.List; @@ -99,7 +96,7 @@ public class LanguageServiceImpl implements LanguageService { // // this.entityManager.flush(); - return this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Language._id), data); + return this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Language._id), data); } public String getPayload(String code) throws IOException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java index db83d6bad..779bf5316 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java @@ -11,7 +11,6 @@ import eu.eudat.model.builder.LockBuilder; import eu.eudat.model.deleter.LockDeleter; import eu.eudat.model.persist.LockPersist; import eu.eudat.query.LockQuery; -import eu.eudat.query.lookup.LockLookup; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.deleter.DeleterFactory; @@ -104,11 +103,11 @@ public class LockServiceImpl implements LockService { this.entityManager.flush(); - return this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Lock._id), data); + return this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Lock._id), data); } public boolean isLocked(UUID target) throws InvalidApplicationException { - LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).targetIds(target); + LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target); if (query.count() == 1) { LockEntity lock = query.first(); if (lock.getLockedBy().equals(this.userScope.getUserId())) { @@ -128,7 +127,7 @@ public class LockServiceImpl implements LockService { private Long forceUnlock(UUID target) throws InvalidApplicationException { - LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).targetIds(target); + LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target); Long availableLocks = query.count(); long deletedLocks = 0L; if (availableLocks > 0) { @@ -154,7 +153,7 @@ public class LockServiceImpl implements LockService { public void unlock(UUID target) throws InvalidApplicationException { - LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).targetIds(target); + LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target); if (query.count() == 1) { LockEntity lock = query.first(); if (!lock.getLockedBy().equals(this.userScope.getUserId())) { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/prefillingsource/PrefillingSourceServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/prefillingsource/PrefillingSourceServiceImpl.java index a7562b085..aee9507a6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/prefillingsource/PrefillingSourceServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/prefillingsource/PrefillingSourceServiceImpl.java @@ -144,7 +144,7 @@ public class PrefillingSourceServiceImpl implements PrefillingSourceService { this.entityManager.flush(); - return this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, PrefillingSource._id), data); + return this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, PrefillingSource._id), data); } private @NotNull PrefillingSourceDefinitionEntity buildDefinitionEntity(PrefillingSourceDefinitionPersist persist) { @@ -361,7 +361,7 @@ public class PrefillingSourceServiceImpl implements PrefillingSourceService { eu.eudat.commons.types.descriptiontemplate.DefinitionEntity descriptionTemplateDefinition = this.xmlHandlingService.fromXml(eu.eudat.commons.types.descriptiontemplate.DefinitionEntity.class, descriptionTemplateEntity.getDefinition()); Description description = new Description(); - description.setDescriptionTemplate(this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, descriptionTemplateEntity)); + description.setDescriptionTemplate(this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, descriptionTemplateEntity)); return mapPrefilledEntityToDescription(description, descriptionTemplateDefinition, prefillingSourceDefinition, prefillingSourceEntity.getLabel(), externalData.getResults().getFirst());//TODO } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/reference/ReferenceServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/reference/ReferenceServiceImpl.java index cb651d17b..4fc5a90df 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/reference/ReferenceServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/reference/ReferenceServiceImpl.java @@ -122,7 +122,7 @@ public class ReferenceServiceImpl implements ReferenceService { this.entityManager.flush(); - return this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Reference._id), data); + return this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Reference._id), data); } private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist){ @@ -187,7 +187,7 @@ public class ReferenceServiceImpl implements ReferenceService { ReferenceEntity referenceEntity = buildReferenceEntityFromExternalData(result, data); referenceEntities.add(referenceEntity); } - externalModels = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), referenceEntities); + externalModels = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), referenceEntities); } List models = this.fetchReferenceFromDb(lookup); @@ -236,10 +236,10 @@ public class ReferenceServiceImpl implements ReferenceService { } private List fetchReferenceFromDb(ReferenceSearchLookup lookup){ - ReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).sourceTypes(ReferenceSourceType.Internal).typeIds(lookup.getTypeId()); + ReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).sourceTypes(ReferenceSourceType.Internal).typeIds(lookup.getTypeId()); List data = query.collectAs(lookup.getProject()); - return this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + return this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); } private ExternalDataResult getReferenceData(ReferenceTypeEntity referenceType, ExternalReferenceCriteria externalReferenceCriteria, String key) { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/referencetype/ReferenceTypeServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/referencetype/ReferenceTypeServiceImpl.java index 6469ac3fe..3f775bb96 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/referencetype/ReferenceTypeServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/referencetype/ReferenceTypeServiceImpl.java @@ -102,7 +102,7 @@ public class ReferenceTypeServiceImpl implements ReferenceTypeService { this.entityManager.flush(); - return this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, ReferenceType._id), data); + return this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, ReferenceType._id), data); } private @NotNull ReferenceTypeDefinitionEntity buildDefinitionEntity(ReferenceTypeDefinitionPersist persist){ diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileProperties.java b/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileProperties.java index b19f3a728..442a4aba3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileProperties.java @@ -197,19 +197,7 @@ public class StorageFileProperties { } public static class StaticFilesConfig{ - private String externalUrls; private String semantics; - private String h2020Template; - private String h2020DescriptionTemplate; - private String pidLinks; - - public String getExternalUrls() { - return externalUrls; - } - - public void setExternalUrls(String externalUrls) { - this.externalUrls = externalUrls; - } public String getSemantics() { return semantics; @@ -219,29 +207,6 @@ public class StorageFileProperties { this.semantics = semantics; } - public String getH2020Template() { - return h2020Template; - } - - public void setH2020Template(String h2020Template) { - this.h2020Template = h2020Template; - } - - public String getH2020DescriptionTemplate() { - return h2020DescriptionTemplate; - } - - public void setH2020DescriptionTemplate(String h2020DescriptionTemplate) { - this.h2020DescriptionTemplate = h2020DescriptionTemplate; - } - - public String getPidLinks() { - return pidLinks; - } - - public void setPidLinks(String pidLinks) { - this.pidLinks = pidLinks; - } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileService.java b/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileService.java index ad088853e..4ccb15e88 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileService.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/storage/StorageFileService.java @@ -33,12 +33,6 @@ public interface StorageFileService extends ApplicationListener data = this.queryFactory.query(SupportiveMaterialQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).languageCodes(model.getLanguageCode()).types(model.getType()).collect(); + List data = this.queryFactory.query(SupportiveMaterialQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).languageCodes(model.getLanguageCode()).types(model.getType()).collect(); if(data != null && !data.isEmpty()){ throw new MyApplicationException("Could not create a new Data with same type and lang code !"); @@ -126,7 +117,7 @@ public class SupportiveMaterialServiceImpl implements SupportiveMaterialService{ this.entityManager.flush(); - return this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, SupportiveMaterial._id), d); + return this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, SupportiveMaterial._id), d); } public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/tag/TagServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/tag/TagServiceImpl.java index d88ecc8a4..71debbb0e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/tag/TagServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/tag/TagServiceImpl.java @@ -112,7 +112,7 @@ public class TagServiceImpl implements TagService { this.entityManager.flush(); this.eventBroker.emit(new TagTouchedEvent(data.getId())); - return this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Tag._id), data); + return this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Tag._id), data); } public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/tenant/TenantServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/tenant/TenantServiceImpl.java index b05211a6a..393495331 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/tenant/TenantServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/tenant/TenantServiceImpl.java @@ -130,7 +130,7 @@ public class TenantServiceImpl implements TenantService { this.entityManager.flush(); - return this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, Tenant._id), data); + return this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Tenant._id), data); } private @NotNull TenantConfigEntity buildConfigEntity(TenantConfigPersist persist) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException { diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerService.java b/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerService.java index 265d53c9c..674259823 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerService.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerService.java @@ -1,177 +1,14 @@ package eu.eudat.service.transformer; -import eu.eudat.authorization.AuthorizationFlags; -import eu.eudat.authorization.Permission; -import eu.eudat.cache.transformer.FileTransformerConfigurationCache; -import eu.eudat.commonmodels.models.FileEnvelopeModel; -import eu.eudat.commonmodels.models.description.DescriptionModel; -import eu.eudat.commonmodels.models.dmp.DmpModel; -import eu.eudat.commons.enums.StorageType; -import eu.eudat.configurations.transformer.TransformerProperties; -import eu.eudat.file.transformer.interfaces.FileTransformerConfiguration; import eu.eudat.file.transformer.models.misc.FileFormat; -import eu.eudat.model.Description; -import eu.eudat.model.Dmp; -import eu.eudat.model.builder.commonmodels.description.DescriptionCommonModelBuilder; -import eu.eudat.model.builder.commonmodels.dmp.DmpCommonModelBuilder; -import eu.eudat.model.file.TransformerCacheModel; -import eu.eudat.query.DescriptionQuery; -import eu.eudat.query.DmpQuery; -import eu.eudat.repository.TransformerRepository; -import eu.eudat.service.storage.StorageFileService; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; -import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.exception.MyNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.MessageSource; -import org.springframework.context.i18n.LocaleContextHolder; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.ExchangeFilterFunction; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import javax.management.InvalidApplicationException; -import java.io.IOException; -import java.net.URI; -import java.util.*; +import java.util.List; +import java.util.UUID; -@Service -public class FileTransformerService { - private static final Logger logger = LoggerFactory.getLogger(FileTransformerService.class); +public interface FileTransformerService { + List getAvailableExportFileFormats(); - private final TransformerProperties transformerProperties; - private final Map clients; - private final TokenExchangeCacheService tokenExchangeCacheService; - private final FileTransformerConfigurationCache fileTransformerConfigurationCache; - private final AuthorizationService authorizationService; - private final WebClient.Builder webClientBuilder; - private final QueryFactory queryFactory; - private final BuilderFactory builderFactory; - private final StorageFileService storageFileService; - private final MessageSource messageSource; + eu.eudat.model.file.FileEnvelope exportDmp(UUID dmpId, String repositoryId, String format); - @Autowired - public FileTransformerService(TransformerProperties transformerProperties, TokenExchangeCacheService tokenExchangeCacheService, FileTransformerConfigurationCache fileTransformerConfigurationCache, WebClient.Builder builder, AuthorizationService authorizationService, - QueryFactory queryFactory, BuilderFactory builderFactory, StorageFileService storageFileService, MessageSource messageSource) { - this.transformerProperties = transformerProperties; - this.tokenExchangeCacheService = tokenExchangeCacheService; - this.fileTransformerConfigurationCache = fileTransformerConfigurationCache; - this.authorizationService = authorizationService; - this.webClientBuilder = builder; - this.queryFactory = queryFactory; - this.builderFactory = builderFactory; - this.storageFileService = storageFileService; - this.messageSource = messageSource; - this.clients = new HashMap<>(); - } - - private TransformerRepository getRepository(String repoId) { - if (this.clients.containsKey(repoId)) return this.clients.get(repoId); - - //GK: It's register time - TransformerProperties.TransformerSource source = transformerProperties.getSources().stream().filter(depositSource -> depositSource.getCodes().contains(repoId)).findFirst().orElse(null); - if (source != null) { - String host = URI.create(source.getUrl()).getHost(); - TokenExchangeModel tokenExchangeModel = new TokenExchangeModel(host + "_" + source.getClientId(), source.getIssuerUrl(), source.getClientId(), source.getClientSecret(), source.getScope()); - TokenExchangeFilterFunction tokenExchangeFilterFunction = new TokenExchangeFilterFunction(this.tokenExchangeCacheService, tokenExchangeModel); - TransformerRepository repository = new TransformerRepository(webClientBuilder.baseUrl(source.getUrl() + "/api/file-transformer").filters(exchangeFilterFunctions -> { - exchangeFilterFunctions.add(tokenExchangeFilterFunction); - exchangeFilterFunctions.add(logRequest()); - }).build()); - source.getCodes().forEach(code -> this.clients.put(code, repository)); - return repository; - } - return null; - } - - - public List getAvailableExportFileFormats() { - List formats = new ArrayList<>(); - List configurations = this.getAvailableConfigurations(); - if(configurations != null){ - for (FileTransformerConfiguration configuration : configurations){ - if (configuration != null && configuration.getExportVariants() != null) formats.addAll(configuration.getExportVariants()); - } - } - return formats; - } - - private List getAvailableConfigurations() { - TransformerCacheModel configs = fileTransformerConfigurationCache.lookup("base"); - if (configs == null) { - List configurations = new ArrayList<>(); - //GK: So much for lazy loading - List repositories = transformerProperties.getSources().stream().map(depositSource -> getRepository(depositSource.getCodes().getFirst())).toList(); - - repositories = new ArrayList<>(repositories); - repositories.forEach((client) -> { - try { - FileTransformerConfiguration repositoryConfig = client.getConfiguration(); - if (repositoryConfig != null) { - configurations.add(repositoryConfig); - } - } catch (Exception e) { - logger.warn(e.getLocalizedMessage(), e); - } - }); - - configs = new TransformerCacheModel(configurations); - this.fileTransformerConfigurationCache.put("base", configs); - } - - return configs.getConfigurations(); - } - - public eu.eudat.model.file.FileEnvelope exportDmp(UUID dmpId, String format) throws InvalidApplicationException, IOException { - this.authorizationService.authorize(Permission.EditDmp); - //GK: First get the right client - TransformerRepository repository = getRepository(format); - if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{format, TransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); - //GK: Second get the Target Data Management Plan - DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(dmpId); - DmpModel dmpFileTransformerModel = this.builderFactory.builder(DmpCommonModelBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(query.first()); - if (dmpFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); - - FileEnvelopeModel fileEnvelope = repository.exportDmp(dmpFileTransformerModel, format); - eu.eudat.model.file.FileEnvelope result = new eu.eudat.model.file.FileEnvelope(); - - byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); - result.setFile(data); - result.setFilename(fileEnvelope.getFilename()); - return result; - } - - public eu.eudat.model.file.FileEnvelope exportDescription(UUID descriptionId, String format) { - this.authorizationService.authorize(Permission.EditDmp); - //GK: First get the right client - TransformerRepository repository = getRepository(format); - if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{format, TransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); - - //GK: Second get the Target Data Management Plan - DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(descriptionId); - DescriptionModel descriptionFileTransformerModel = this.builderFactory.builder(DescriptionCommonModelBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(query.first()); - if (descriptionFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); - - FileEnvelopeModel fileEnvelope = repository.exportDescription(descriptionFileTransformerModel, format); - eu.eudat.model.file.FileEnvelope result = new eu.eudat.model.file.FileEnvelope(); - byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); //TODO: shared storage should be per repository - result.setFile(data); - result.setFilename(fileEnvelope.getFilename()); - return result; - } - - // This method returns filter function which will log request data - private static ExchangeFilterFunction logRequest() { - return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); - clientRequest.headers().forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); - return Mono.just(clientRequest); - }); - } + eu.eudat.model.file.FileEnvelope exportDescription(UUID descriptionId, String format); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerServiceImpl.java new file mode 100644 index 000000000..a03851d47 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/service/transformer/FileTransformerServiceImpl.java @@ -0,0 +1,178 @@ +package eu.eudat.service.transformer; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.authorization.Permission; +import eu.eudat.cache.transformer.FileTransformerConfigurationCache; +import eu.eudat.commonmodels.models.FileEnvelopeModel; +import eu.eudat.commonmodels.models.description.DescriptionModel; +import eu.eudat.commonmodels.models.dmp.DmpModel; +import eu.eudat.commons.enums.StorageType; +import eu.eudat.configurations.transformer.TransformerProperties; +import eu.eudat.file.transformer.interfaces.FileTransformerConfiguration; +import eu.eudat.file.transformer.models.misc.FileFormat; +import eu.eudat.model.Description; +import eu.eudat.model.Dmp; +import eu.eudat.model.builder.commonmodels.description.DescriptionCommonModelBuilder; +import eu.eudat.model.builder.commonmodels.dmp.DmpCommonModelBuilder; +import eu.eudat.model.file.TransformerCacheModel; +import eu.eudat.query.DescriptionQuery; +import eu.eudat.query.DmpQuery; +import eu.eudat.repository.TransformerRepository; +import eu.eudat.service.storage.StorageFileService; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.util.*; + +@Service +public class FileTransformerServiceImpl implements FileTransformerService { + private static final Logger logger = LoggerFactory.getLogger(FileTransformerServiceImpl.class); + + private final TransformerProperties transformerProperties; + private final Map clients; + private final TokenExchangeCacheService tokenExchangeCacheService; + private final FileTransformerConfigurationCache fileTransformerConfigurationCache; + private final AuthorizationService authorizationService; + private final WebClient.Builder webClientBuilder; + private final QueryFactory queryFactory; + private final BuilderFactory builderFactory; + private final StorageFileService storageFileService; + private final MessageSource messageSource; + + @Autowired + public FileTransformerServiceImpl(TransformerProperties transformerProperties, TokenExchangeCacheService tokenExchangeCacheService, FileTransformerConfigurationCache fileTransformerConfigurationCache, WebClient.Builder builder, AuthorizationService authorizationService, + QueryFactory queryFactory, BuilderFactory builderFactory, StorageFileService storageFileService, MessageSource messageSource) { + this.transformerProperties = transformerProperties; + this.tokenExchangeCacheService = tokenExchangeCacheService; + this.fileTransformerConfigurationCache = fileTransformerConfigurationCache; + this.authorizationService = authorizationService; + this.webClientBuilder = builder; + this.queryFactory = queryFactory; + this.builderFactory = builderFactory; + this.storageFileService = storageFileService; + this.messageSource = messageSource; + this.clients = new HashMap<>(); + } + + private TransformerRepository getRepository(String repoId) { + if (this.clients.containsKey(repoId)) return this.clients.get(repoId); + + //GK: It's register time + TransformerProperties.TransformerSource source = transformerProperties.getSources().stream().filter(depositSource -> depositSource.getCodes().contains(repoId)).findFirst().orElse(null); + if (source != null) { + String host = URI.create(source.getUrl()).getHost(); + TokenExchangeModel tokenExchangeModel = new TokenExchangeModel(host + "_" + source.getClientId(), source.getIssuerUrl(), source.getClientId(), source.getClientSecret(), source.getScope()); + TokenExchangeFilterFunction tokenExchangeFilterFunction = new TokenExchangeFilterFunction(this.tokenExchangeCacheService, tokenExchangeModel); + TransformerRepository repository = new TransformerRepository(webClientBuilder.baseUrl(source.getUrl() + "/api/file-transformer").filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.add(tokenExchangeFilterFunction); + exchangeFilterFunctions.add(logRequest()); + }).build()); + source.getCodes().forEach(code -> this.clients.put(code, repository)); + return repository; + } + return null; + } + + + @Override + public List getAvailableExportFileFormats() { + List formats = new ArrayList<>(); + List configurations = this.getAvailableConfigurations(); + if(configurations != null){ + for (FileTransformerConfiguration configuration : configurations){ + if (configuration != null && configuration.getExportVariants() != null) formats.addAll(configuration.getExportVariants()); + } + } + return formats; + } + + private List getAvailableConfigurations() { + TransformerCacheModel configs = fileTransformerConfigurationCache.lookup("base"); + if (configs == null) { + List configurations = new ArrayList<>(); + //GK: So much for lazy loading + List repositories = transformerProperties.getSources().stream().map(depositSource -> getRepository(depositSource.getCodes().getFirst())).toList(); + + repositories = new ArrayList<>(repositories); + repositories.forEach((client) -> { + try { + FileTransformerConfiguration repositoryConfig = client.getConfiguration(); + if (repositoryConfig != null) { + configurations.add(repositoryConfig); + } + } catch (Exception e) { + logger.warn(e.getLocalizedMessage(), e); + } + }); + + configs = new TransformerCacheModel(configurations); + this.fileTransformerConfigurationCache.put("base", configs); + } + + return configs.getConfigurations(); + } + + @Override + public eu.eudat.model.file.FileEnvelope exportDmp(UUID dmpId, String repositoryId, String format) { + this.authorizationService.authorize(Permission.EditDmp); + //GK: First get the right client + TransformerRepository repository = getRepository(repositoryId); + if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{repositoryId, TransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); + //GK: Second get the Target Data Management Plan + DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpId); + DmpModel dmpFileTransformerModel = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); + if (dmpFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + FileEnvelopeModel fileEnvelope = repository.exportDmp(dmpFileTransformerModel, format); + eu.eudat.model.file.FileEnvelope result = new eu.eudat.model.file.FileEnvelope(); + + byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); + result.setFile(data); + result.setFilename(fileEnvelope.getFilename()); + return result; + } + + @Override + public eu.eudat.model.file.FileEnvelope exportDescription(UUID descriptionId, String format) { + this.authorizationService.authorize(Permission.EditDmp); + //GK: First get the right client + TransformerRepository repository = getRepository(format); + if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{format, TransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + //GK: Second get the Target Data Management Plan + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionId); + DescriptionModel descriptionFileTransformerModel = this.builderFactory.builder(DescriptionCommonModelBuilder.class).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); + if (descriptionFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + FileEnvelopeModel fileEnvelope = repository.exportDescription(descriptionFileTransformerModel, format); + eu.eudat.model.file.FileEnvelope result = new eu.eudat.model.file.FileEnvelope(); + byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); //TODO: shared storage should be per repository + result.setFile(data); + result.setFilename(fileEnvelope.getFilename()); + return result; + } + + // This method returns filter function which will log request data + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); + clientRequest.headers().forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); + return Mono.just(clientRequest); + }); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/user/UserServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/user/UserServiceImpl.java index d49a4c553..ce9a20cc7 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/user/UserServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/user/UserServiceImpl.java @@ -178,7 +178,7 @@ public class UserServiceImpl implements UserService { this.eventBroker.emit(new UserTouchedEvent(data.getId())); this.userTouchedIntegrationEventHandler.handle(data.getId()); - return this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, User._id), data); + return this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, User._id), data); } private @NotNull AdditionalInfoEntity buildAdditionalInfoEntity(UserAdditionalInfoPersist persist){ @@ -276,7 +276,7 @@ public class UserServiceImpl implements UserService { this.eventBroker.emit(new UserTouchedEvent(data.getId())); this.userTouchedIntegrationEventHandler.handle(data.getId()); - return this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, User._id), data); + return this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, User._id), data); } //region mine diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/user/settings/UserSettingsServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/user/settings/UserSettingsServiceImpl.java index bedbee0d5..0406a2a58 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/user/settings/UserSettingsServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/user/settings/UserSettingsServiceImpl.java @@ -96,7 +96,7 @@ public class UserSettingsServiceImpl implements UserSettingsService { this.entityManager.flush(); - return this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, UserSettings._id, UserSettings._key), data); + return this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, UserSettings._id, UserSettings._key), data); } } diff --git a/dmp-backend/web/pom.xml b/dmp-backend/web/pom.xml index bef71f708..b5a4fa0ef 100644 --- a/dmp-backend/web/pom.xml +++ b/dmp-backend/web/pom.xml @@ -199,7 +199,7 @@ gr.cite.opendmp file-transformer-base - 0.0.5 + 0.0.6 diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java index 49853397f..d33850bb9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java @@ -2,19 +2,15 @@ package eu.eudat.controllers; import eu.eudat.audit.AuditableAction; import eu.eudat.authorization.AuthorizationFlags; -import eu.eudat.authorization.Permission; import eu.eudat.commons.enums.DmpAccessType; import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.enums.IsActive; -import eu.eudat.commons.enums.StorageType; import eu.eudat.convention.ConventionService; import eu.eudat.data.StorageFileEntity; import eu.eudat.model.StorageFile; import eu.eudat.model.builder.PublicDescriptionBuilder; import eu.eudat.model.persist.DescriptionFieldFilePersist; -import eu.eudat.model.persist.StorageFilePersist; import eu.eudat.service.storage.StorageFileService; -import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.validation.ValidationFilterAnnotation; import eu.eudat.model.Description; import eu.eudat.model.Dmp; @@ -40,7 +36,6 @@ import gr.cite.tools.exception.MyNotFoundException; import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; -import org.apache.commons.io.FilenameUtils; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -54,8 +49,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.management.InvalidApplicationException; import java.io.IOException; -import java.net.URLConnection; -import java.time.Duration; import java.util.*; import static eu.eudat.authorization.AuthorizationFlags.Public; @@ -138,7 +131,7 @@ public class DescriptionController { this.censorFactory.censor(DescriptionCensor.class).censor(lookup.getProject(), null); - QueryResult queryResult = this.elasticQueryHelperService.collect(lookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic, null); + QueryResult queryResult = this.elasticQueryHelperService.collect(lookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermission, null); this.auditService.track(AuditableAction.Description_Query, "lookup", lookup); @@ -152,8 +145,8 @@ public class DescriptionController { this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null); - DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateController.java index 87eb1dbca..d6e85ac00 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateController.java @@ -85,10 +85,10 @@ public class DescriptionTemplateController { this.censorFactory.censor(DescriptionTemplateCensor.class).censor(lookup.getProject(), null); - DescriptionTemplateQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + DescriptionTemplateQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.DescriptionTemplate_Query, "lookup", lookup); @@ -102,8 +102,8 @@ public class DescriptionTemplateController { this.censorFactory.censor(DescriptionTemplateCensor.class).censor(fieldSet, null); - DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateTypeController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateTypeController.java index fe84db4d6..bee0ba547 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateTypeController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionTemplateTypeController.java @@ -23,7 +23,6 @@ import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.validation.ValidationFilterAnnotation; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.transaction.annotation.Transactional; @@ -69,10 +68,10 @@ public class DescriptionTemplateTypeController { this.censorFactory.censor(DescriptionTemplateTypeCensor.class).censor(lookup.getProject(), null); - DescriptionTemplateTypeQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + DescriptionTemplateTypeQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.DescriptionTemplateType_Query, "lookup", lookup); @@ -87,8 +86,8 @@ public class DescriptionTemplateTypeController { this.censorFactory.censor(DescriptionTemplateTypeCensor.class).censor(fieldSet, null); - DescriptionTemplateTypeQuery query = this.queryFactory.query(DescriptionTemplateTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - DescriptionTemplateType model = this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + DescriptionTemplateTypeQuery query = this.queryFactory.query(DescriptionTemplateTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DescriptionTemplateType model = this.builderFactory.builder(DescriptionTemplateTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplateType.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpBlueprintController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpBlueprintController.java index 50d84caf0..8d2c61726 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpBlueprintController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpBlueprintController.java @@ -81,10 +81,10 @@ public class DmpBlueprintController { logger.debug("querying {}", DmpBlueprint.class.getSimpleName()); this.censorFactory.censor(DmpBlueprintCensor.class).censor(lookup.getProject(), null); - DmpBlueprintQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + DmpBlueprintQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.DmpBlueprint_Query, "lookup", lookup); @@ -98,8 +98,8 @@ public class DmpBlueprintController { this.censorFactory.censor(DmpBlueprintCensor.class).censor(fieldSet, null); - DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpController.java index 51e07615d..e31b0b3ef 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DmpController.java @@ -5,11 +5,7 @@ import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.DmpAccessType; import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.enums.IsActive; -import eu.eudat.model.builder.DescriptionBuilder; import eu.eudat.model.builder.PublicDmpBuilder; -import eu.eudat.model.censorship.PublicDescriptionCensor; -import eu.eudat.query.DescriptionQuery; -import eu.eudat.query.DmpDescriptionTemplateQuery; import gr.cite.tools.validation.ValidationFilterAnnotation; import eu.eudat.model.*; import eu.eudat.model.builder.DmpBuilder; @@ -123,8 +119,7 @@ public class DmpController { this.censorFactory.censor(DmpCensor.class).censor(lookup.getProject(), null); - - QueryResult queryResult = this.elasticQueryHelperService.collect(lookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic, null); + QueryResult queryResult = this.elasticQueryHelperService.collect(lookup, AuthorizationFlags.OwnerOrDmpAssociatedOrPermission, null); this.auditService.track(AuditableAction.Dmp_Query, "lookup", lookup); @@ -137,8 +132,8 @@ public class DmpController { this.censorFactory.censor(DmpCensor.class).censor(fieldSet, null); - DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Dmp model = this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Dmp model = this.builderFactory.builder(DmpBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -242,11 +237,17 @@ public class DmpController { return new QueryResult<>(persisted); } - @GetMapping("{id}/export/{type}") - public ResponseEntity export(@PathVariable("id") UUID id, @PathVariable("type") String exportType) throws InvalidApplicationException, IOException { - logger.debug(new MapLogEntry("exporting dmp")); + @GetMapping("{id}/export/{transformerId}/{type}") + public ResponseEntity export(@PathVariable("id") UUID id, @PathVariable("transformerId") String transformerId, @PathVariable("type") String exportType) throws InvalidApplicationException, IOException { + logger.debug(new MapLogEntry("exporting dmp").And("id", id).And("transformerId", transformerId).And("exportType", exportType)); - return this.dmpService.export(id, exportType); + ResponseEntity bytes = this.dmpService.export(id, transformerId, exportType); + this.auditService.track(AuditableAction.Dmp_Export, Map.ofEntries( + new AbstractMap.SimpleEntry("id", id), + new AbstractMap.SimpleEntry("transformerId", transformerId), + new AbstractMap.SimpleEntry("exportType", exportType) + )); + return bytes; } @PostMapping("{id}/invite-users") diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/EntityDoiController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/EntityDoiController.java index 4e8914dd4..86e2cfc10 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/EntityDoiController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/EntityDoiController.java @@ -75,10 +75,10 @@ public class EntityDoiController { this.censorFactory.censor(EntityDoiCensor.class).censor(lookup.getProject(), null); - EntityDoiQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + EntityDoiQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.EntityDoi_Query, "lookup", lookup); @@ -92,8 +92,8 @@ public class EntityDoiController { this.censorFactory.censor(EntityDoiCensor.class).censor(fieldSet, null); - EntityDoiQuery query = this.queryFactory.query(EntityDoiQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - EntityDoi model = this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + EntityDoiQuery query = this.queryFactory.query(EntityDoiQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + EntityDoi model = this.builderFactory.builder(EntityDoiBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, EntityDoi.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileTransformerController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileTransformerController.java index a520eb020..a06b1642b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileTransformerController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileTransformerController.java @@ -52,7 +52,7 @@ public class FileTransformerController { logger.debug(new MapLogEntry("exporting dmp")); HttpHeaders headers = new HttpHeaders(); - FileEnvelope fileEnvelope = this.fileTransformerService.exportDmp(requestModel.getId(), requestModel.getFormat()); + FileEnvelope fileEnvelope = this.fileTransformerService.exportDmp(requestModel.getId(), requestModel.getRepositoryId(), requestModel.getFormat()); headers.add("Content-Disposition", "attachment;filename=" + fileEnvelope.getFilename()); byte[] data = fileEnvelope.getFile(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/LanguageController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/LanguageController.java index 7b81bb6df..c2427ce6c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/LanguageController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/LanguageController.java @@ -6,7 +6,6 @@ import eu.eudat.authorization.AuthorizationFlags; import gr.cite.tools.validation.ValidationFilterAnnotation; import eu.eudat.data.LanguageEntity; import eu.eudat.model.Language; -import eu.eudat.model.UserContactInfo; import eu.eudat.model.builder.LanguageBuilder; import eu.eudat.model.censorship.LanguageCensor; import eu.eudat.model.persist.LanguagePersist; @@ -35,12 +34,11 @@ import org.springframework.web.bind.annotation.*; import javax.management.InvalidApplicationException; import java.io.IOException; -import java.util.AbstractMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; +import static eu.eudat.authorization.AuthorizationFlags.Public; + @RestController @RequestMapping(path = {"api/language"}) public class LanguageController { @@ -81,9 +79,9 @@ public class LanguageController { this.censorFactory.censor(LanguageCensor.class).censor(lookup.getProject(), null); - LanguageQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + LanguageQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.Language_Query, "lookup", lookup); @@ -97,8 +95,8 @@ public class LanguageController { this.censorFactory.censor(LanguageCensor.class).censor(fieldSet, null); - LanguageQuery query = this.queryFactory.query(LanguageQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Language model = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + LanguageQuery query = this.queryFactory.query(LanguageQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Language model = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Language.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -116,8 +114,8 @@ public class LanguageController { this.censorFactory.censor(LanguageCensor.class).censor(fieldSet, null); - LanguageQuery query = this.queryFactory.query(LanguageQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).codes(code); - Language model = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + LanguageQuery query = this.queryFactory.query(LanguageQuery.class).authorize(EnumSet.of(Public)).codes(code); + Language model = this.builderFactory.builder(LanguageBuilder.class).authorize(EnumSet.of(Public)).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{code, Language.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -139,10 +137,10 @@ public class LanguageController { this.censorFactory.censor(LanguageCensor.class).censor(lookup.getProject(), null); - LanguageQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + LanguageQuery query = lookup.enrich(this.queryFactory).authorize(EnumSet.of(Public)); query.setOrder(new Ordering().addAscending(Language._ordinal)); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(LanguageBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(LanguageBuilder.class).authorize(EnumSet.of(Public)).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java index cd298d48f..1478f3cb2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java @@ -85,9 +85,9 @@ public class LockController { this.censorFactory.censor(LockCensor.class).censor(lookup.getProject(), null); - LockQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + LockQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.Lock_Query, "lookup", lookup); @@ -101,8 +101,8 @@ public class LockController { this.censorFactory.censor(LockCensor.class).censor(fieldSet, null); - LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Lock model = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Lock model = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -137,8 +137,8 @@ public class LockController { this.censorFactory.censor(LockCensor.class).censor(fieldSet, null); - LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).targetIds(targetId); - Lock model = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + LockQuery query = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(targetId); + Lock model = this.builderFactory.builder(LockBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{targetId, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/PrefillingSourceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/PrefillingSourceController.java index 070e3323e..fa55207df 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/PrefillingSourceController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/PrefillingSourceController.java @@ -89,9 +89,9 @@ public class PrefillingSourceController { this.censorFactory.censor(PrefillingSourceCensor.class).censor(lookup.getProject(), null); - PrefillingSourceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + PrefillingSourceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.PrefillingSource_Query, "lookup", lookup); @@ -105,8 +105,8 @@ public class PrefillingSourceController { this.censorFactory.censor(PrefillingSourceCensor.class).censor(fieldSet, null); - PrefillingSourceQuery query = this.queryFactory.query(PrefillingSourceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - PrefillingSource model = this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + PrefillingSourceQuery query = this.queryFactory.query(PrefillingSourceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + PrefillingSource model = this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, PrefillingSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceController.java index 7bd8d3a80..524537af6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceController.java @@ -81,9 +81,9 @@ public class ReferenceController { this.censorFactory.censor(ReferenceCensor.class).censor(lookup.getProject(), null); - ReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + ReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.Reference_Query, "lookup", lookup); @@ -111,8 +111,8 @@ public class ReferenceController { this.censorFactory.censor(ReferenceCensor.class).censor(fieldSet, null); - ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Reference model = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Reference model = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceTypeController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceTypeController.java index 40a56d931..9e536047d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceTypeController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/ReferenceTypeController.java @@ -5,7 +5,6 @@ import eu.eudat.audit.AuditableAction; import eu.eudat.authorization.AuthorizationFlags; import gr.cite.tools.validation.ValidationFilterAnnotation; import eu.eudat.data.ReferenceTypeEntity; -import eu.eudat.model.Reference; import eu.eudat.model.ReferenceType; import eu.eudat.model.builder.ReferenceTypeBuilder; import eu.eudat.model.censorship.ReferenceTypeCensor; @@ -81,9 +80,9 @@ public class ReferenceTypeController{ this.censorFactory.censor(ReferenceTypeCensor.class).censor(lookup.getProject(), null); - ReferenceTypeQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + ReferenceTypeQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.ReferenceType_Query, "lookup", lookup); @@ -97,8 +96,8 @@ public class ReferenceTypeController{ this.censorFactory.censor(ReferenceTypeCensor.class).censor(fieldSet, null); - ReferenceTypeQuery query = this.queryFactory.query(ReferenceTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - ReferenceType model = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + ReferenceTypeQuery query = this.queryFactory.query(ReferenceTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + ReferenceType model = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -116,8 +115,8 @@ public class ReferenceTypeController{ this.censorFactory.censor(ReferenceTypeCensor.class).censor(fieldSet, null); - ReferenceTypeQuery query = this.queryFactory.query(ReferenceTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).codes(code); - ReferenceType model = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + ReferenceTypeQuery query = this.queryFactory.query(ReferenceTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).codes(code); + ReferenceType model = this.builderFactory.builder(ReferenceTypeBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{code, ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/SupportiveMaterialController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/SupportiveMaterialController.java index b99505c77..405670876 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/SupportiveMaterialController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/SupportiveMaterialController.java @@ -1,11 +1,9 @@ package eu.eudat.controllers; import com.fasterxml.jackson.core.JsonProcessingException; -import com.tdunning.math.stats.Sort; import eu.eudat.audit.AuditableAction; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.SupportiveMaterialFieldType; -import eu.eudat.service.storage.StorageFileService; import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.validation.ValidationFilterAnnotation; import eu.eudat.data.SupportiveMaterialEntity; @@ -17,7 +15,6 @@ import eu.eudat.model.result.QueryResult; import eu.eudat.query.SupportiveMaterialQuery; import eu.eudat.query.lookup.SupportiveMaterialLookup; import eu.eudat.service.supportivematerial.SupportiveMaterialService; -import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.auditing.AuditService; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.censor.CensorFactory; @@ -83,9 +80,9 @@ public class SupportiveMaterialController { this.censorFactory.censor(SupportiveMaterialCensor.class).censor(lookup.getProject(), null); - SupportiveMaterialQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + SupportiveMaterialQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.SupportiveMaterial_Query, "lookup", lookup); @@ -99,8 +96,8 @@ public class SupportiveMaterialController { this.censorFactory.censor(SupportiveMaterialCensor.class).censor(fieldSet, null); - SupportiveMaterialQuery query = this.queryFactory.query(SupportiveMaterialQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - SupportiveMaterial model = this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + SupportiveMaterialQuery query = this.queryFactory.query(SupportiveMaterialQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + SupportiveMaterial model = this.builderFactory.builder(SupportiveMaterialBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, SupportiveMaterial.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -117,7 +114,7 @@ public class SupportiveMaterialController { logger.debug("querying {}", SupportiveMaterial.class.getSimpleName()); - SupportiveMaterialQuery query = this.queryFactory.query(SupportiveMaterialQuery.class).types(SupportiveMaterialFieldType.of(type)).languageCodes(language).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + SupportiveMaterialQuery query = this.queryFactory.query(SupportiveMaterialQuery.class).types(SupportiveMaterialFieldType.of(type)).languageCodes(language).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(new BaseFieldSet().ensure(SupportiveMaterial._id).ensure(SupportiveMaterial._payload)); byte[] content; if (data.size() == 1) content = data.getFirst().getPayload().getBytes(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java index ef8a9b4d0..734d7bae6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java @@ -23,7 +23,6 @@ import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.transaction.annotation.Transactional; @@ -71,10 +70,10 @@ public class TagController { this.censorFactory.censor(TagCensor.class).censor(lookup.getProject(), null); - TagQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + TagQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.Tag_Query, "lookup", lookup); @@ -88,8 +87,8 @@ public class TagController { this.censorFactory.censor(TagCensor.class).censor(fieldSet, null); - TagQuery query = this.queryFactory.query(TagQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Tag model = this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + TagQuery query = this.queryFactory.query(TagQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Tag model = this.builderFactory.builder(TagBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Tag.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TenantController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TenantController.java index 1dcbd2be4..4eafcaf46 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/TenantController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TenantController.java @@ -82,10 +82,10 @@ public class TenantController { logger.debug("querying {}", Tenant.class.getSimpleName()); this.censorFactory.censor(TenantCensor.class).censor(lookup.getProject(), null); - TenantQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + TenantQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); for (Tenant model : models) { models.set(models.indexOf(model), this.tenantService.decryptTenant(model)); } @@ -102,8 +102,8 @@ public class TenantController { this.censorFactory.censor(TenantCensor.class).censor(fieldSet, null); - TenantQuery query = this.queryFactory.query(TenantQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - Tenant model = this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + TenantQuery query = this.queryFactory.query(TenantQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + Tenant model = this.builderFactory.builder(TenantBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Tenant.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserController.java index 783758510..904feea1a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserController.java @@ -98,10 +98,10 @@ public class UserController { this.censorFactory.censor(UserCensor.class).censor(lookup.getProject(), null); - UserQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + UserQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.User_Query, "lookup", lookup); @@ -118,7 +118,7 @@ public class UserController { UserQuery query = lookup.enrich(this.queryFactory).dmpAssociated(true).isActive(IsActive.Active); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(DmpAssociatedUserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(DmpAssociatedUserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.User_DmpAssociatedQuery, "lookup", lookup); @@ -132,8 +132,8 @@ public class UserController { this.censorFactory.censor(UserCensor.class).censor(fieldSet, id); - UserQuery query = this.queryFactory.query(UserQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); - User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + UserQuery query = this.queryFactory.query(UserQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -151,8 +151,8 @@ public class UserController { this.censorFactory.censor(UserCensor.class).censor(fieldSet, null); - UserQuery query = this.queryFactory.query(UserQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).emails(email); - User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + UserQuery query = this.queryFactory.query(UserQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).emails(email); + User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{email, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -183,8 +183,8 @@ public class UserController { this.censorFactory.censor(UserCensor.class).censor(fieldSet, this.userScope.getUserId()); - UserQuery query = this.queryFactory.query(UserQuery.class).ids(this.userScope.getUserId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); - User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + UserQuery query = this.queryFactory.query(UserQuery.class).ids(this.userScope.getUserId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); + User model = this.builderFactory.builder(UserBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{this.userScope.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserSettingsController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserSettingsController.java index fc6c83d97..8b62b77ef 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserSettingsController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserSettingsController.java @@ -73,9 +73,9 @@ public class UserSettingsController { public QueryResult Query(@RequestBody UserSettingsLookup lookup) throws MyApplicationException, MyForbiddenException { logger.debug("querying {}", UserSettings.class.getSimpleName()); this.censorFactory.censor(UserSettingsCensor.class).censor(lookup.getProject(), null); - UserSettingsQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic); + UserSettingsQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission); List data = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(lookup.getProject(), data); + List models = this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(lookup.getProject(), data); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.User_Settings_Query, "lookup", lookup); @@ -98,8 +98,8 @@ public class UserSettingsController { UserSettings._updatedAt, UserSettings._type )); - UserSettingsQuery query = this.queryFactory.query(UserSettingsQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).keys(key); - UserSettings model = this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fieldSet, query.firstAs(fieldSet)); + UserSettingsQuery query = this.queryFactory.query(UserSettingsQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).keys(key); + UserSettings model = this.builderFactory.builder(UserSettingsBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); this.auditService.track(AuditableAction.User_Settings_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("key", key) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 060be60f9..864889d54 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -1,6 +1,5 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,12 +17,11 @@ public class DatasetProfileManager { private static final Logger logger = LoggerFactory.getLogger(DatasetProfileManager.class); private static final List cache = new ArrayList<>(); - private final ConfigLoader configLoader; // private final RemoteFetcherService remoteFetcherService; @Autowired - public DatasetProfileManager(ConfigLoader configLoader) { - this.configLoader = configLoader; + public DatasetProfileManager() { + } private static String parseItem(Object item) { if (item instanceof String) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ConfigLoader.java deleted file mode 100644 index 8f98669bd..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ConfigLoader.java +++ /dev/null @@ -1,8 +0,0 @@ -package eu.eudat.logic.proxy.config.configloaders; - -import org.apache.poi.xwpf.usermodel.XWPFDocument; - - -public interface ConfigLoader { - XWPFDocument getDocument(); -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java deleted file mode 100644 index ffe6006f2..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java +++ /dev/null @@ -1,67 +0,0 @@ -package eu.eudat.logic.proxy.config.configloaders; - -import com.fasterxml.jackson.databind.ObjectMapper; -import eu.eudat.service.storage.StorageFileService; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import java.io.ByteArrayInputStream; -import java.util.LinkedList; -import java.util.List; - -@Service("configLoader") -public class DefaultConfigLoader implements ConfigLoader { - private static final Logger logger = LoggerFactory.getLogger(DefaultConfigLoader.class); - private static final ObjectMapper mapper = new ObjectMapper(); - - private XWPFDocument document; - - @Autowired - private StorageFileService storageFileService; - - - private void setDocument() { - byte[] bytes = this.storageFileService.getH2020TemplateFile(); - try { - this.document = new XWPFDocument(new ByteArrayInputStream(bytes)); - } catch (Exception ex) { - logger.error("Cannot find resource", ex); - } - } - - public XWPFDocument getDocument() { - this.setDocument(); - return document; - } - - - private List getXmlValuesFromXPath(Document doc, String expression) { - XPath xPath = XPathFactory.newInstance().newXPath(); - NodeList nodeList = null; - List values = new LinkedList<>(); - try { - nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); - } catch (XPathExpressionException e) { - logger.error(e.getMessage(), e); - } - if (nodeList != null) { - for (int i = 0; i < nodeList.getLength(); i++) { - Node node = nodeList.item(i); - if (node.hasChildNodes()) { - values.add(nodeList.item(i).getChildNodes().item(0).getNodeValue()); - } - } - } - return values; - } -} diff --git a/dmp-backend/web/src/main/resources/config/deposit.yml b/dmp-backend/web/src/main/resources/config/deposit.yml index ea22fd026..84b70f957 100644 --- a/dmp-backend/web/src/main/resources/config/deposit.yml +++ b/dmp-backend/web/src/main/resources/config/deposit.yml @@ -2,6 +2,8 @@ deposit: sources: - url: http://localhost:8082 repositoryId: zenodo + pdfTransformerId: docx-file-transformer + rdaTransformerId: rda-file-transformer issuer-url: ${ZENODO_ISSUER_URI:IDP_APIKEY_ISSUER_URI}/protocol/openid-connect/token client-id: ${ZENODO_DEPOSIT_CLIENT_ID:} client-secret: ${ZENODO_DEPOSIT_CLIENT_SECRET:} diff --git a/dmp-backend/web/src/main/resources/config/permissions.yml b/dmp-backend/web/src/main/resources/config/permissions.yml index 553e0823f..1e3f21f34 100644 --- a/dmp-backend/web/src/main/resources/config/permissions.yml +++ b/dmp-backend/web/src/main/resources/config/permissions.yml @@ -2,48 +2,29 @@ permissions: extendedClaims: [ ] policies: ###### Should Remove after Refactor - PublicRole: - roles: [ ] - clients: [ ] - allowAnonymous: true - allowAuthenticated: true AdminRole: roles: - Admin clients: [ ] allowAnonymous: false allowAuthenticated: false - DescriptionTemplateEditorRole: - roles: - - DescriptionTemplateEditor - clients: [ ] - allowAnonymous: false - allowAuthenticated: false - ManagerRole: - roles: - - Manager - clients: [ ] - allowAnonymous: false - allowAuthenticated: false - UserRole: - roles: - - User - clients: [ ] - allowAnonymous: false - allowAuthenticated: false AuthenticatedRole: roles: [] clients: [ ] allowAnonymous: false allowAuthenticated: true - AnonymousRole: - roles: [] - clients: [ ] - allowAnonymous: true - allowAuthenticated: true ###### - + # public + DeferredAffiliation: + roles: + - Admin + - User + - Manager + - DescriptionTemplateEditor + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # public PublicBrowseDescription: roles: [ ] @@ -278,6 +259,8 @@ permissions: roles: - Admin - DescriptionTemplateEditor + - Manager + - User clients: [ ] allowAnonymous: false allowAuthenticated: false @@ -341,6 +324,15 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + NewDmp: + roles: + - Admin + - User + - Manager + - DescriptionTemplateEditor + clients: [ ] + allowAnonymous: false + allowAuthenticated: false DeleteDmp: roles: - Admin @@ -394,6 +386,9 @@ permissions: BrowseDmpBlueprint: roles: - Admin + - User + - Manager + - DescriptionTemplateEditor clients: [ ] allowAnonymous: false allowAuthenticated: false diff --git a/dmp-backend/web/src/main/resources/config/queue.yml b/dmp-backend/web/src/main/resources/config/queue.yml index 78ba64a62..54be62ec4 100644 --- a/dmp-backend/web/src/main/resources/config/queue.yml +++ b/dmp-backend/web/src/main/resources/config/queue.yml @@ -35,6 +35,7 @@ queue: user-removal-topic: user.remove dmp-touch-topic: dmp.touch description-touch-topic: description.touch + annotation-entity-touch-topic: annotation.entity.touch what-you-know-about-me-completed-topic: whatyouknowaboutme.completed generate-file-topic: generate.file rabbitmq: diff --git a/dmp-backend/web/src/main/resources/config/security.yml b/dmp-backend/web/src/main/resources/config/security.yml index 2494d97ef..2c7e3f241 100644 --- a/dmp-backend/web/src/main/resources/config/security.yml +++ b/dmp-backend/web/src/main/resources/config/security.yml @@ -2,7 +2,7 @@ web: security: enabled: true authorized-endpoints: [ api ] - allowed-endpoints: [ api/public, api/description/public, /api/supportive-material/public, api/language/public, api/contact-support/public, api/dashboard/public ] + allowed-endpoints: [ api/public, api/dmp/public, api/description/public, /api/supportive-material/public, api/language/public, api/contact-support/public, api/dashboard/public ] idp: api-key: enabled: false diff --git a/dmp-backend/web/src/main/resources/config/storage-devel.yml b/dmp-backend/web/src/main/resources/config/storage-devel.yml index 5bd3e9916..14d409b4b 100644 --- a/dmp-backend/web/src/main/resources/config/storage-devel.yml +++ b/dmp-backend/web/src/main/resources/config/storage-devel.yml @@ -3,17 +3,15 @@ storage: defaultLanguage: en storages: - type: Temp - basePath: ./storage/temp + basePath: ${FILE_STORAGE}/temp - type: Main - basePath: ./storage/main + basePath: ${FILE_STORAGE}/main - type: Transformer - basePath: ${TRANSFORMER_BASE_PATH} + basePath: ${FILE_STORAGE}/transformer + - type: Deposit + basePath: ${FILE_STORAGE}/deposit static-files: - externalUrls: dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml semantics: dmp-backend/web/src/main/resources/Semantics.json - h2020Template: documents/h2020.docx - h2020DescriptionTemplate: documents/h2020_dataset.docx - pidLinks: pidLinks.json material-files: userGuide: dmp-backend/web/src/main/resources/material/user-guide/ about: dmp-backend/web/src/main/resources/material/about/ diff --git a/dmp-backend/web/src/main/resources/config/transformer.yml b/dmp-backend/web/src/main/resources/config/transformer.yml index b8df6d50d..7cb90d96a 100644 --- a/dmp-backend/web/src/main/resources/config/transformer.yml +++ b/dmp-backend/web/src/main/resources/config/transformer.yml @@ -1,18 +1,21 @@ transformer: sources: - url: http://localhost:8084 + transformerId: docx-file-transformer codes: [ docx, pdf ] issuer-url: ${IDP_ISSUER_URI_TOKEN:} client-id: ${IDP_APIKEY_CLIENT_ID:} client-secret: ${IDP_APIKEY_CLIENT_SECRET:} scope: ${IDP_APIKEY_SCOPE:} - url: http://localhost:8086 + transformerId: rda-file-transformer codes: [ json ] issuer-url: ${IDP_ISSUER_URI_TOKEN:} client-id: ${IDP_APIKEY_CLIENT_ID:} client-secret: ${IDP_APIKEY_CLIENT_SECRET:} scope: ${IDP_APIKEY_SCOPE:} - url: http://localhost:8087 + transformerId: import-export-file-transformer codes: [ xml ] issuer-url: ${IDP_ISSUER_URI_TOKEN:} client-id: ${IDP_APIKEY_CLIENT_ID:} diff --git a/dmp-backend/web/src/main/resources/pidLinks.json b/dmp-backend/web/src/main/resources/pidLinks.json deleted file mode 100644 index d2a011677..000000000 --- a/dmp-backend/web/src/main/resources/pidLinks.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "pidLinks": [ - { - "pid": "doi", - "link": "https://doi.org/{pid}" - }, - { - "pid": "uniprot", - "link": "https://uniprot.org/uniprotkb/{pid}" - }, - { - "pid": "handle", - "link": "https://hdl.handle.net/{pid}" - }, - { - "pid": "arxiv", - "link": "https://arxiv.org/abs/{pid}" - }, - { - "pid": "ascl", - "link": "https://ascl.net/{pid}" - }, - { - "pid": "orcid", - "link": "https://orcid.org/{pid}" - }, - { - "pid": "pmid", - "link": "https://pubmed.ncbi.nlm.nih.gov/{pid}" - }, - { - "pid": "ads", - "link": "https://ui.adsabs.harvard.edu/#abs/{pid}" - }, - { - "pid": "pmcid", - "link": "https://ncbi.nlm.nih.gov/pmc/{pid}" - }, - { - "pid": "gnd", - "link": "https://d-nb.info/gnd/{pid}" - }, - { - "pid": "urn", - "link": "https://nbn-resolving.org/{pid}" - }, - { - "pid": "sra", - "link": "https://ebi.ac.uk/ena/data/view/{pid}" - }, - { - "pid": "bioproject", - "link": "https://ebi.ac.uk/ena/data/view/{pid}" - }, - { - "pid": "biosample", - "link": "https://ebi.ac.uk/ena/data/view/{pid}" - }, - { - "pid": "ensembl", - "link": "https://ensembl.org/id/{pid}" - }, - { - "pid": "refseq", - "link": "https://ncbi.nlm.nih.gov/entrez/viewer.fcgi?val={pid}" - }, - { - "pid": "genome", - "link": "https://ncbi.nlm.nih.gov/assembly/{pid}" - }, - { - "pid": "geo", - "link": "https://ncbi.nlm.nih.gov/geo/query/acc.cgi?acc={pid}" - }, - { - "pid": "arrayexpress_array", - "link": "https://ebi.ac.uk/arrayexpress/arrays/{pid}" - }, - { - "pid": "arrayexpress_experiment", - "link": "https://ebi.ac.uk/arrayexpress/experiments/{pid}" - }, - { - "pid": "hal", - "link": "https://hal.archives-ouvertes.fr/{pid}" - }, - { - "pid": "swh", - "link": "https://archive.softwareheritage.org/{pid}" - }, - { - "pid": "ror", - "link": "https://ror.org/{pid}" - }, - { - "pid": "viaf", - "link": "https://viaf.org/viaf/{pid}" - } - ] -} \ No newline at end of file diff --git a/dmp-db-scema/updates/00.01.010_Align_DescriptionTemplate_table.sql b/dmp-db-scema/updates/00.01.010_Align_DescriptionTemplate_table.sql index 02bccec45..7ab4c8784 100644 --- a/dmp-db-scema/updates/00.01.010_Align_DescriptionTemplate_table.sql +++ b/dmp-db-scema/updates/00.01.010_Align_DescriptionTemplate_table.sql @@ -46,6 +46,15 @@ BEGIN UPDATE public."DescriptionTemplate" SET version_status = 1; UPDATE public."DescriptionTemplate" SET version_status = 0 where id in ( + select dt.id from public."DescriptionTemplate" as dt + where dt.version = + ( + select Max(f.version) + from public."DescriptionTemplate" as f where f.group_id=dt.group_id and f.status = 1 + ) + ); + + UPDATE public."DescriptionTemplate" SET version_status = 2 where status = 0 and id in ( select dt.id from public."DescriptionTemplate" as dt where dt.version = ( diff --git a/dmp-frontend/src/app/core/common/enum/permission.enum.ts b/dmp-frontend/src/app/core/common/enum/permission.enum.ts index c04f5e813..b537deeea 100644 --- a/dmp-frontend/src/app/core/common/enum/permission.enum.ts +++ b/dmp-frontend/src/app/core/common/enum/permission.enum.ts @@ -17,6 +17,7 @@ export enum AppPermission { //Dmp BrowseDmp = "BrowseDmp", EditDmp = "EditDmp", + NewDmp = "NewDmp", DeleteDmp= "DeleteDmp", CloneDmp = "CloneDmp", CreateNewVersionDmp = "CreateNewVersionDmp", diff --git a/dmp-frontend/src/app/core/model/dmp/dmp.ts b/dmp-frontend/src/app/core/model/dmp/dmp.ts index b5cc56b86..e1ec8da29 100644 --- a/dmp-frontend/src/app/core/model/dmp/dmp.ts +++ b/dmp-frontend/src/app/core/model/dmp/dmp.ts @@ -11,6 +11,7 @@ import { EntityDoi } from '../entity-doi/entity-doi'; import { ReferencePersist } from '../reference/reference'; import { DmpAssociatedUser, User } from "../user/user"; import { DmpReference } from './dmp-reference'; +import { IsActive } from '@app/core/common/enum/is-active.enum'; export interface Dmp extends BaseEntity { label?: string; @@ -157,8 +158,11 @@ export interface PublicDmp extends BaseEntity { description?: string; finalizedAt?: Date; publishedAt?: Date; + status?: DmpStatus; + groupId?: String; + accessType: DmpAccessType; dmpReferences: PublicDmpReference[]; - users: PublicDmpUser[]; + dmpUsers: PublicDmpUser[]; descriptions: PublicDescription[]; } @@ -166,6 +170,7 @@ export interface PublicDmpReference { id: Guid; dmp: PublicDmp; reference: PublicReference; + isActive?: IsActive; } export interface PublicReference { diff --git a/dmp-frontend/src/app/core/services/description/description.service.ts b/dmp-frontend/src/app/core/services/description/description.service.ts index 633394bc9..e0b02e453 100644 --- a/dmp-frontend/src/app/core/services/description/description.service.ts +++ b/dmp-frontend/src/app/core/services/description/description.service.ts @@ -34,7 +34,11 @@ export class DescriptionService { publicQuery(q: DescriptionLookup): Observable> { const url = `${this.apiBase}/public/query`; - return this.http.post>(url, q).pipe(catchError((error: any) => throwError(error))); + const params = new BaseHttpParams(); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.AuthToken] + }; + return this.http.post>(url, q, {params: params}).pipe(catchError((error: any) => throwError(error))); } getSingle(id: Guid, reqFields: string[] = []): Observable { @@ -50,10 +54,15 @@ export class DescriptionService { getPublicSingle(id: Guid, reqFields: string[] = []): Observable { const url = `${this.apiBase}/public/${id}`; - const options = { params: { f: reqFields } }; - + const options: HttpParamsOptions = { fromObject: { f: reqFields } }; + + let params: BaseHttpParams = new BaseHttpParams(options); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.AuthToken] + }; + return this.http - .get(url, options).pipe( + .get(url, { params: params }).pipe( catchError((error: any) => throwError(error))); } diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index 9b40743d7..410a38920 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -43,7 +43,11 @@ export class DmpService { publicQuery(q: DmpLookup): Observable> { const url = `${this.apiBase}/public/query`; - return this.http.post>(url, q).pipe(catchError((error: any) => throwError(error))); + const params = new BaseHttpParams(); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.AuthToken] + }; + return this.http.post>(url, q, {params: params}).pipe(catchError((error: any) => throwError(error))); } getSingle(id: Guid, reqFields: string[] = []): Observable { @@ -57,10 +61,16 @@ export class DmpService { getPublicSingle(id: Guid, reqFields: string[] = []): Observable { const url = `${this.apiBase}/public/${id}`; - const options = { params: { f: reqFields } }; + + const options: HttpParamsOptions = { fromObject: { f: reqFields } }; + + let params: BaseHttpParams = new BaseHttpParams(options); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.AuthToken] + }; return this.http - .get(url, options).pipe( + .get(url, { params: params }).pipe( catchError((error: any) => throwError(error))); } diff --git a/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts b/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts index 4248de020..604c4a516 100644 --- a/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts +++ b/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts @@ -7,6 +7,7 @@ import { Guid } from '@common/types/guid'; import * as FileSaver from 'file-saver'; import { MatomoService } from '../matomo/matomo-service'; import { FileUtils } from '../utilities/file-utils.service'; +import { AuthService } from '../auth/auth.service'; @Injectable() export class FileTransformerService extends BaseService { @@ -14,7 +15,8 @@ export class FileTransformerService extends BaseService { constructor( private fileTransformerHttpService: FileTransformerHttpService, private matomoService: MatomoService, - private fileUtils: FileUtils + private fileUtils: FileUtils, + private authentication: AuthService, ) { super(); } private _initialized: boolean = false; @@ -22,6 +24,9 @@ export class FileTransformerService extends BaseService { private _availableFormats: FileFormat[] = []; get availableFormats(): FileFormat[] { + if (!this.authentication.currentAccountIsAuthenticated()){ + return; + } // console.log('availableFormats'); if (!this._initialized && !this._loading) this.init(); return this._availableFormats; diff --git a/dmp-frontend/src/app/core/services/reference/reference.service.ts b/dmp-frontend/src/app/core/services/reference/reference.service.ts index 959f4ff9a..fde3936a5 100644 --- a/dmp-frontend/src/app/core/services/reference/reference.service.ts +++ b/dmp-frontend/src/app/core/services/reference/reference.service.ts @@ -206,7 +206,7 @@ export class ReferenceService { } getReferencesForTypes(dmpReferences: DmpReference[], referenceTypeIds?: Guid[]): DmpReference[] { - return dmpReferences?.filter(x => referenceTypeIds?.includes(x?.reference?.type?.id)); + return dmpReferences?.filter(x => referenceTypeIds?.includes(x?.reference?.type?.id)).filter(x=> x.isActive === IsActive.Active);; } getReferencesForTypesFirstSafe(dmpReferences: DmpReference[], referenceTypeIds?: Guid[]): DmpReference { diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html index dc5f3fe60..bc4583082 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html @@ -205,18 +205,14 @@ Argos Entities - - + diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts index 8274f9cec..379ea9de0 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts @@ -135,6 +135,22 @@ export class DescriptionTemplateEditorComponent extends BaseEditor void) { @@ -200,7 +216,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor void): void { - if (!this.isClone && !this.isNewVersion){ + if (this.isNewVersion == false){ const formData = this.formService.getValue(this.formGroup.value) as DescriptionTemplatePersist; this.descriptionTemplateService.persist(formData) @@ -208,7 +224,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor onSuccess ? onSuccess(complete) : this.onCallbackSuccess(complete), error => this.onCallbackError(error) ); - } else if (this.isNewVersion && !this.isNew && !this.isClone) { + } else if (this.isNewVersion== true && this.isNew == false && this.isClone == false) { const formData = this.formService.getValue(this.formGroup.value) as NewVersionDescriptionTemplatePersist; this.descriptionTemplateService.newVersion(formData) @@ -220,8 +236,8 @@ export class DescriptionTemplateEditorComponent extends BaseEditor this.users.push(new UserDescriptionTemplateEditorModel(this.validationErrorModel).fromModel(x))); } + if (item.users) { item.users.filter(x => x.isActive === IsActive.Active).map(x => this.users.push(new UserDescriptionTemplateEditorModel(this.validationErrorModel).fromModel(x))); } } return this; } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts index 5ff2b0da9..28ff7db2b 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts @@ -84,6 +84,7 @@ export class DescriptionTemplateEditorResolver extends BaseEditorResolver { [nameof(x => x.users), nameof(x => x.user), nameof(x => x.id),].join('.'), [nameof(x => x.users), nameof(x => x.user), nameof(x => x.name),].join('.'), [nameof(x => x.users), nameof(x => x.role),].join('.'), + [nameof(x => x.users), nameof(x => x.isActive),].join('.'), nameof(x => x.createdAt), diff --git a/dmp-frontend/src/app/ui/admin/description-types/editor/description-template-type-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-types/editor/description-template-type-editor.component.ts index 4a62698d1..bbba7c49f 100644 --- a/dmp-frontend/src/app/ui/admin/description-types/editor/description-template-type-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-types/editor/description-template-type-editor.component.ts @@ -135,6 +135,7 @@ export class DescriptionTemplateTypeEditorComponent extends BaseEditor
-

{{'DMP-BLUEPRINT-EDITOR.TITLE.NEW' | translate}}

-

{{formGroup.get('label').value}}

+

{{'DMP-BLUEPRINT-EDITOR.TITLE.NEW' | translate}}

+

{{formGroup.get('label').value}}

{{'DMP-BLUEPRINT-EDITOR.TITLE.CLONE' | translate}} {{formGroup.get('label').value}} diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts index 45d8026d3..d5b94b111 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts @@ -153,7 +153,6 @@ export class DmpBlueprintEditorComponent extends BaseEditor void): void { - if (this.isNew && !this.isClone && !this.isNewVersion) { + if ( this.isNewVersion == false) { const formData = this.formService.getValue(this.formGroup.value) as DmpBlueprintPersist; this.dmpBlueprintService.persist(formData) @@ -215,7 +214,7 @@ export class DmpBlueprintEditorComponent extends BaseEditor onSuccess ? onSuccess(complete) : this.onCallbackSuccess(complete), error => this.onCallbackError(error) ); - } else if (this.isNewVersion && !this.isNew && !this.isClone) { + } else if (this.isNewVersion == true && this.isNew == false && this.isClone == false) { const formData = this.formService.getValue(this.formGroup.value) as NewVersionDmpBlueprintPersist; this.dmpBlueprintService.newVersion(formData) @@ -227,8 +226,8 @@ export class DmpBlueprintEditorComponent extends BaseEditor } formSubmit(): void { + this.formService.removeAllBackEndErrors(this.formGroup); this.formService.touchAllFormFields(this.formGroup); - // if (!this.isFormValid()) { - // return; - // } + if (!this.isFormValid()) { + return; + } this.persistEntity(); } diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index a118f2776..ca9d9bbeb 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -45,8 +45,8 @@
{{'DASHBOARD.EMPTY-LIST' | translate}}
- - + +
{{'DASHBOARD.EMPTY-LIST' | translate}}
- +
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}} diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-description-activity/recent-edited-description-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-description-activity/recent-edited-description-activity.component.ts index a9f39ee5a..c0d755343 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-description-activity/recent-edited-description-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-description-activity/recent-edited-description-activity.component.ts @@ -7,10 +7,11 @@ import { DescriptionTemplate } from '@app/core/model/description-template/descri import { Description } from '@app/core/model/description/description'; import { Dmp, DmpUser } from '@app/core/model/dmp/dmp'; import { DmpReference } from '@app/core/model/dmp/dmp-reference'; +import { ReferenceType } from '@app/core/model/reference-type/reference-type'; import { Reference } from '@app/core/model/reference/reference'; -import { DescriptionLookup } from '@app/core/query/description.lookup'; +import { RecentActivityItemLookup } from '@app/core/query/recent-activity-item-lookup.lookup'; import { AuthService } from '@app/core/services/auth/auth.service'; -import { DescriptionService } from '@app/core/services/description/description.service'; +import { DashboardService } from '@app/core/services/dashboard/dashboard.service'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { BaseComponent } from '@common/base/base.component'; @@ -24,7 +25,7 @@ import { nameof } from 'ts-simple-nameof'; }) export class RecentEditedDescriptionActivityComponent extends BaseComponent implements OnInit { - lookup: DescriptionLookup = new DescriptionLookup(); + lookup: RecentActivityItemLookup = new RecentActivityItemLookup(); pageSize: number = 5; listingItems: Description[]; @@ -48,7 +49,7 @@ export class RecentEditedDescriptionActivityComponent extends BaseComponent impl private router: Router, public enumUtils: EnumUtils, private authentication: AuthService, - private descriptionService: DescriptionService, + private dashboardService: DashboardService, private location: Location, private matomoService: MatomoService ) { @@ -98,7 +99,7 @@ export class RecentEditedDescriptionActivityComponent extends BaseComponent impl } updateUrl() { - let parameters = "?type=dmps" + + let parameters = "?type=descriptions" + (this.page != 1 ? "&page=" + this.page : "") + //TODO refactor //(((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.PUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") + @@ -115,7 +116,7 @@ export class RecentEditedDescriptionActivityComponent extends BaseComponent impl this.formGroup.get('order').setValue(this.order.UpdatedAt); } this.lookup.page = { size: this.pageSize, offset: 0 }; - this.lookup.order = { items: ['-' + this.formGroup.get('order').value] }; + this.lookup.orderField = this.formGroup.get('order').value; this.lookup.like = this.formGroup.get('like').value; this.lookup.project = { @@ -136,17 +137,18 @@ export class RecentEditedDescriptionActivityComponent extends BaseComponent impl [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.id)].join('.'), [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.id)].join('.'), [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.label)].join('.'), - [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.type)].join('.'), + [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.type), nameof(x => x.id)].join('.'), [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.reference)].join('.'), + [nameof(x => x.dmp), nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.isActive)].join('.'), ] }; - this.descriptionService - .query(this.lookup) + this.dashboardService + .getMyRecentActivityItems(this.lookup) .pipe(takeUntil(this._destroyed)) .subscribe(response => { - this.listingItems = response.items; - this.totalCount = response.count; + this.listingItems = response.map(x => x.description); + // this.totalCount = response.count; //this.totalCountDmps.emit(this.dmpActivities.length); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html index dc5d56ba9..519620897 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html @@ -4,10 +4,10 @@ {{'DMP-LISTING.SORT-BY' | translate}}: - {{enumUtils.toRecentActivityOrderString(order.MODIFIED)}} - {{enumUtils.toRecentActivityOrderString(order.PUBLISHED)}} - {{enumUtils.toRecentActivityOrderString(order.LABEL)}} - {{enumUtils.toRecentActivityOrderString(order.STATUS)}} + {{enumUtils.toRecentActivityOrderString(order.UpdatedAt)}} + + {{enumUtils.toRecentActivityOrderString(order.Label)}} + {{enumUtils.toRecentActivityOrderString(order.Status)}} @@ -24,7 +24,7 @@
- +