From bf8edfad921fa3709e2b7c1e5da734107f6daa3c Mon Sep 17 00:00:00 2001 From: amentis Date: Tue, 24 Oct 2023 18:47:13 +0300 Subject: [PATCH 01/25] add ExternalReference, DmpExternalReference entities --- .../eu/eudat/authorization/Permission.java | 11 + .../eu/eudat/commons/enums/SourceType.java | 28 +++ .../data/DmpExternalReferenceEntity.java | 62 +++++ .../eudat/data/ExternalReferenceEntity.java | 177 ++++++++++++++ .../ExternalReferencesTypeConverter.java | 11 + .../converters/enums/SourceTypeConverter.java | 11 + .../eu/eudat/model/DmpExternalReference.java | 50 ++++ .../eu/eudat/model/ExternalReference.java | 147 +++++++++++ .../builder/DmpExternalReferenceBuilder.java | 130 ++++++++++ .../builder/ExternalReferenceBuilder.java | 72 ++++++ .../DmpExternalReferenceCensor.java | 47 ++++ .../censorship/ExternalReferenceCensor.java | 48 ++++ .../deleter/DmpExternalReferenceDeleter.java | 72 ++++++ .../deleter/ExternalReferenceDeleter.java | 78 ++++++ .../query/DmpExternalReferenceQuery.java | 152 ++++++++++++ .../eudat/query/ExternalReferenceQuery.java | 230 ++++++++++++++++++ .../lookup/DmpExternalReferenceLookup.java | 30 +++ .../query/lookup/ExternalReferenceLookup.java | 90 +++++++ .../src/main/resources/config/permissions.yml | 42 ++++ 19 files changed, 1488 insertions(+) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java 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 5937257bf..4a06422bd 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 @@ -62,4 +62,15 @@ public final class Permission { public static String ViewDescriptionTemplateTypePage = "ViewDescriptionTemplateTypePage"; public static String ViewDmpBlueprintPage = "ViewDmpBlueprintPage"; + //ExternalReference + public static String BrowseExternalReference = "BrowseExternalReference"; + public static String EditExternalReference = "EditExternalReference"; + public static String DeleteExternalReference = "DeleteExternalReference"; + + //DmpExternalReference + public static String BrowseDmpExternalReference = "BrowseDmpExternalReference"; + public static String EditDmpExternalReference = "EditDmpExternalReference"; + public static String DeleteDmpExternalReference = "DeleteDmpExternalReference"; + + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java new file mode 100644 index 000000000..3a9fd28ca --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java @@ -0,0 +1,28 @@ +package eu.eudat.commons.enums; + +import eu.eudat.data.converters.enums.DatabaseEnum; + +import java.util.Map; + +public enum SourceType implements DatabaseEnum { + + Internal((short) 0), + External((short) 1); + + private final Short value; + + SourceType(Short value) { + this.value = value; + } + + @Override + public Short getValue() { + return value; + } + + private static final Map map = EnumUtils.getEnumValueMap(SourceType.class); + + public static SourceType of(Short i) { + return map.get(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java new file mode 100644 index 000000000..c10468523 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java @@ -0,0 +1,62 @@ +package eu.eudat.data; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import java.util.UUID; + +@Entity +@Table(name = "\"ExternalReference\"") +public class DmpExternalReferenceEntity { + + @Id + @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) + private UUID id; + public static final String _id = "id"; + + @Column(name = "dmp_id", columnDefinition = "uuid", nullable = false) + private UUID dmpId; + public static final String _dmpId = "dmpId"; + + @Column(name = "reference_id", columnDefinition = "uuid", nullable = false) + private UUID referenceId; + public static final String _referenceId = "referenceId"; + + @Column(name = "data") + private String data; + public static final String _data = "data"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public UUID getDmpId() { + return dmpId; + } + + public void setDmpId(UUID dmpId) { + this.dmpId = dmpId; + } + + public UUID getReferenceId() { + return referenceId; + } + + public void setReferenceId(UUID referenceId) { + this.referenceId = referenceId; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java new file mode 100644 index 000000000..8cb605ae1 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java @@ -0,0 +1,177 @@ +package eu.eudat.data; + +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.enums.SourceType; +import eu.eudat.data.converters.enums.ExternalReferencesTypeConverter; +import eu.eudat.data.converters.enums.IsActiveConverter; +import jakarta.persistence.*; +import org.hibernate.annotations.Type; + +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "\"ExternalReference\"") +public class ExternalReferenceEntity { + + @Id + @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) + private UUID id; + public static final String _id = "id"; + + @Column(name = "label", length = 500, nullable = false) + private String label; + public static final String _label = "label"; + + @Column(name = "type", nullable = false) + @Convert(converter = ExternalReferencesTypeConverter.class) + private ExternalReferencesType type; + public static final String _type = "type"; + + @Column(name = "description") + private String description; + public static final String _description = "description"; + + @Type(eu.eudat.configurations.typedefinition.XMLType.class) + @Column(name = "definition", columnDefinition = "xml") + private String definition; + public static final String _definition = "definition"; + + @Column(name = "reference", length = 1024, nullable = false) + private String reference; + public static final String _reference = "reference"; + + @Column(name = "abbreviation", length = 50) + private String abbreviation; + public static final String _abbreviation = "abbreviation"; + + @Column(name = "source", length = 1024) + private String source; + public static final String _source = "source"; + + @Column(name = "source_type", nullable = false) + private SourceType sourceType; + public static final String _sourceType = "sourceType"; + + @Column(name = "is_active", nullable = false) + @Convert(converter = IsActiveConverter.class) + private IsActive isActive; + public static final String _isActive = "isActive"; + + @Column(name = "created_at", nullable = false) + private Instant createdAt; + public static final String _createdAt = "createdAt"; + + @Column(name = "updated_at", nullable = false) + private Instant updatedAt; + public static final String _updatedAt = "updatedAt"; + + @Column(name = "created_by", columnDefinition = "uuid") + private UUID createdBy; + public static final String _createdBy = "createdBy"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public ExternalReferencesType getType() { + return type; + } + + public void setType(ExternalReferencesType type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public SourceType getSourceType() { + return sourceType; + } + + public void setSourceType(SourceType sourceType) { + this.sourceType = sourceType; + } + + public IsActive getIsActive() { + return isActive; + } + + public void setIsActive(IsActive isActive) { + this.isActive = isActive; + } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } + + public UUID getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(UUID createdBy) { + this.createdBy = createdBy; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java new file mode 100644 index 000000000..a15b2a130 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java @@ -0,0 +1,11 @@ +package eu.eudat.data.converters.enums; + +import eu.eudat.commons.enums.ExternalReferencesType; +import jakarta.persistence.Converter; + +@Converter +public class ExternalReferencesTypeConverter extends DatabaseEnumConverter { + public ExternalReferencesType of(Short i) { + return ExternalReferencesType.of(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java new file mode 100644 index 000000000..573921637 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java @@ -0,0 +1,11 @@ +package eu.eudat.data.converters.enums; + +import eu.eudat.commons.enums.SourceType; +import jakarta.persistence.Converter; + +@Converter +public class SourceTypeConverter extends DatabaseEnumConverter{ + public SourceType of(Short i) { + return SourceType.of(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java new file mode 100644 index 000000000..67deac0a8 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java @@ -0,0 +1,50 @@ +package eu.eudat.model; + +import java.util.UUID; + +public class DmpExternalReference { + + private UUID id; + public static final String _id = "id"; + + private DmpBlueprint dmp; + public static final String _dmp = "dmp"; + + private ExternalReference externalReference; + public static final String _externalReference = "externalReference"; + + private String data; + public static final String _data = "data"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public DmpBlueprint getDmp() { + return dmp; + } + + public void setDmp(DmpBlueprint dmp) { + this.dmp = dmp; + } + + public ExternalReference getExternalReference() { + return externalReference; + } + + public void setExternalReference(ExternalReference externalReference) { + this.externalReference = externalReference; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java new file mode 100644 index 000000000..7f4f7c583 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java @@ -0,0 +1,147 @@ +package eu.eudat.model; + +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.enums.SourceType; + +import java.time.Instant; +import java.util.UUID; + +public class ExternalReference { + + private UUID id; + public static final String _id = "id"; + + private String label; + public static final String _label = "label"; + + private ExternalReferencesType type; + public static final String _type = "type"; + + private String description; + public static final String _description = "description"; + + private String definition; + public static final String _definition = "definition"; + + private String reference; + public static final String _reference = "reference"; + + private String abbreviation; + public static final String _abbreviation = "abbreviation"; + + private String source; + public static final String _source = "source"; + + private SourceType sourceType; + public static final String _sourceType = "sourceType"; + + private IsActive isActive; + public static final String _isActive = "isActive"; + + private Instant createdAt; + public static final String _createdAt = "createdAt"; + + private Instant updatedAt; + public static final String _updatedAt = "updatedAt"; + + //private UserInfo createdBy; ToDo + //public static final String _createdBy = "createdBy"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public ExternalReferencesType getType() { + return type; + } + + public void setType(ExternalReferencesType type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDefinition() { + return definition; + } + + public void setDefinition(String definition) { + this.definition = definition; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public SourceType getSourceType() { + return sourceType; + } + + public void setSourceType(SourceType sourceType) { + this.sourceType = sourceType; + } + + public IsActive getIsActive() { + return isActive; + } + + public void setIsActive(IsActive isActive) { + this.isActive = isActive; + } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java new file mode 100644 index 000000000..25c7400ab --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java @@ -0,0 +1,130 @@ +package eu.eudat.model.builder; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.convention.ConventionService; +import eu.eudat.data.DmpExternalReferenceEntity; +import eu.eudat.model.DmpBlueprint; +import eu.eudat.model.DmpExternalReference; +import eu.eudat.model.ExternalReference; +import eu.eudat.query.DmpBlueprintQuery; +import eu.eudat.query.ExternalReferenceQuery; +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.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; +import java.util.stream.Collectors; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DmpExternalReferenceBuilder extends BaseBuilder{ + + private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public DmpExternalReferenceBuilder( + ConventionService conventionService, + BuilderFactory builderFactory, QueryFactory queryFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceBuilder.class))); + this.builderFactory = builderFactory; + this.queryFactory = queryFactory; + } + + public DmpExternalReferenceBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + FieldSet externalReferenceFields = fields.extractPrefixed(this.asPrefix(DmpExternalReference._externalReference)); + Map externalReferenceItemsMap = this.collectExternalReferences(externalReferenceFields, data); + + FieldSet dmpFields = fields.extractPrefixed(this.asPrefix(DmpExternalReference._dmp)); + Map dmpBlueprintItemsMap = this.collectDmps(dmpFields, data); + + List models = new ArrayList<>(); + for (DmpExternalReferenceEntity d : data) { + DmpExternalReference m = new DmpExternalReference(); + if (fields.hasField(this.asIndexer(DmpExternalReference._id))) m.setId(d.getId()); + if (fields.hasField(this.asIndexer(DmpExternalReference._data))) m.setData(d.getData()); + if(!externalReferenceFields.isEmpty() && externalReferenceItemsMap != null && externalReferenceItemsMap.containsKey(d.getReferenceId())){ + m.setExternalReference(externalReferenceItemsMap.get(d.getReferenceId())); + } + if(!dmpFields.isEmpty() && dmpBlueprintItemsMap != null && dmpBlueprintItemsMap.containsKey(d.getDmpId())){ + m.setDmp(dmpBlueprintItemsMap.get(d.getDmpId())); + } + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } + + private Map collectExternalReferences(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) return null; + this.logger.debug("checking related - {}", ExternalReference.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(ExternalReference._id))) { + itemMap = this.asEmpty( + data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList()), + x -> { + ExternalReference item = new ExternalReference(); + item.setId(x); + return item; + }, + ExternalReference::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(ExternalReference._id); + ExternalReferenceQuery q = this.queryFactory.query(ExternalReferenceQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(this.authorize).asForeignKey(q, clone, ExternalReference::getId); + } + if (!fields.hasField(ExternalReference._id)) { + itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); + } + + return itemMap; + } + + private Map collectDmps(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) return null; + this.logger.debug("checking related - {}", DmpBlueprint.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(DmpBlueprint._id))) { + itemMap = this.asEmpty( + data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList()), + x -> { + DmpBlueprint item = new DmpBlueprint(); + item.setId(x); + return item; + }, + DmpBlueprint::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(DmpBlueprint._id); + DmpBlueprintQuery q = this.queryFactory.query(DmpBlueprintQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(this.authorize).asForeignKey(q, clone, DmpBlueprint::getId); + } + if (!fields.hasField(DmpBlueprint._id)) { + itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); + } + + return itemMap; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java new file mode 100644 index 000000000..57e10ec57 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java @@ -0,0 +1,72 @@ +package eu.eudat.model.builder; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.convention.ConventionService; +import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.model.ExternalReference; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ExternalReferenceBuilder extends BaseBuilder{ + + private final BuilderFactory builderFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public ExternalReferenceBuilder( + ConventionService conventionService, + BuilderFactory builderFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalReferenceBuilder.class))); + this.builderFactory = builderFactory; + } + + public ExternalReferenceBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + // FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); + + List models = new ArrayList<>(); + for (ExternalReferenceEntity d : data) { + ExternalReference m = new ExternalReference(); + if (fields.hasField(this.asIndexer(ExternalReference._id))) m.setId(d.getId()); + if (fields.hasField(this.asIndexer(ExternalReference._label))) m.setLabel(d.getLabel()); + if (fields.hasField(this.asIndexer(ExternalReference._createdAt))) m.setCreatedAt(d.getCreatedAt()); + if (fields.hasField(this.asIndexer(ExternalReference._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); + if (fields.hasField(this.asIndexer(ExternalReference._isActive))) m.setIsActive(d.getIsActive()); + if (fields.hasField(this.asIndexer(ExternalReference._definition))) m.setReference(d.getDefinition()); + if (fields.hasField(this.asIndexer(ExternalReference._reference))) m.setReference(d.getReference()); + if (fields.hasField(this.asIndexer(ExternalReference._abbreviation))) m.setAbbreviation(d.getAbbreviation()); + if (fields.hasField(this.asIndexer(ExternalReference._description))) m.setDescription(d.getDescription()); + if (fields.hasField(this.asIndexer(ExternalReference._source))) m.setSource(d.getSource()); + if (fields.hasField(this.asIndexer(ExternalReference._sourceType))) m.setSourceType(d.getSourceType()); + if (fields.hasField(this.asIndexer(ExternalReference._type))) m.setType(d.getType()); + +// if (!userInfoFields.isEmpty() && d.getCreatedBy() != null){ +// //Todo +// } + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java new file mode 100644 index 000000000..bd372a41e --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java @@ -0,0 +1,47 @@ +package eu.eudat.model.censorship; + +import eu.eudat.authorization.Permission; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.DmpExternalReference; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.censor.CensorFactory; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +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 DmpExternalReferenceCensor extends BaseCensor { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceCensor.class)); + + protected final AuthorizationService authService; + protected final CensorFactory censorFactory; + + public DmpExternalReferenceCensor(ConventionService conventionService, + AuthorizationService authService, + CensorFactory censorFactory) { + super(conventionService); + this.authService = authService; + this.censorFactory = censorFactory; + } + + public void censor(FieldSet fields, UUID userId) { + logger.debug(new DataLogEntry("censoring fields", fields)); + if (fields == null || fields.isEmpty()) + return; + + this.authService.authorizeForce(Permission.BrowseDmpExternalReference); + FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpExternalReference._dmp)); + this.censorFactory.censor(DmpBlueprintCensor.class).censor(dmpFields, userId); + FieldSet externalReferenceFields = fields.extractPrefixed(this.asIndexerPrefix(DmpExternalReference._externalReference)); + this.censorFactory.censor(ExternalReferenceCensor.class).censor(externalReferenceFields, userId); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java new file mode 100644 index 000000000..fe2dfe760 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java @@ -0,0 +1,48 @@ +package eu.eudat.model.censorship; + +import eu.eudat.authorization.Permission; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.DmpBlueprint; +import eu.eudat.model.ExternalReference; +import eu.eudat.model.censorship.dmpblueprintdefinition.DefinitionCensor; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.censor.CensorFactory; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +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 ExternalReferenceCensor extends BaseCensor { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceCensor.class)); + + protected final AuthorizationService authService; + protected final CensorFactory censorFactory; + + public ExternalReferenceCensor(ConventionService conventionService, + AuthorizationService authService, + CensorFactory censorFactory) { + super(conventionService); + this.authService = authService; + this.censorFactory = censorFactory; + } + + public void censor(FieldSet fields, UUID userId) { + logger.debug(new DataLogEntry("censoring fields", fields)); + if (fields == null || fields.isEmpty()) + return; + + this.authService.authorizeForce(Permission.BrowseExternalReference); + //ToDo + //FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._createdBy)); + //this.censorFactory.censor(UserInfo.class).censor(definitionFields, userId); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java new file mode 100644 index 000000000..41f063322 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java @@ -0,0 +1,72 @@ +package eu.eudat.model.deleter; + +import eu.eudat.data.DmpExternalReferenceEntity; +import eu.eudat.query.DmpExternalReferenceQuery; +import gr.cite.tools.data.deleter.Deleter; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +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.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.management.InvalidApplicationException; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DmpExternalReferenceDeleter implements Deleter { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceDeleter.class)); + private final EntityManager entityManager; + + protected final QueryFactory queryFactory; + + protected final DeleterFactory deleterFactory; + + @Autowired + public DmpExternalReferenceDeleter( + EntityManager entityManager, + QueryFactory queryFactory, + DeleterFactory deleterFactory + ) { + this.entityManager = entityManager; + this.queryFactory = queryFactory; + this.deleterFactory = deleterFactory; + } + + public void deleteAndSaveByIds(List ids) throws InvalidApplicationException { + logger.debug(new MapLogEntry("collecting to delete").And("count", Optional.ofNullable(ids).map(List::size).orElse(0)).And("ids", ids)); + List data = this.queryFactory.query(DmpExternalReferenceQuery.class).ids(ids).collect(); + logger.trace("retrieved {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.deleteAndSave(data); + } + + public void deleteAndSave(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.delete(data); + logger.trace("saving changes"); + this.entityManager.flush(); + logger.trace("changes saved"); + } + + public void delete(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + if (data == null || data.isEmpty()) + return; + + for (DmpExternalReferenceEntity item : data) { + logger.trace("deleting item {}", item.getId()); + logger.trace("updating item"); + this.entityManager.merge(item); + logger.trace("updated item"); + } + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java new file mode 100644 index 000000000..4711da890 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java @@ -0,0 +1,78 @@ +package eu.eudat.model.deleter; + +import eu.eudat.commons.enums.IsActive; +import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.query.ExternalReferenceQuery; +import gr.cite.tools.data.deleter.Deleter; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +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.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.management.InvalidApplicationException; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ExternalReferenceDeleter implements Deleter { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceDeleter.class)); + private final EntityManager entityManager; + + protected final QueryFactory queryFactory; + + protected final DeleterFactory deleterFactory; + + @Autowired + public ExternalReferenceDeleter( + EntityManager entityManager, + QueryFactory queryFactory, + DeleterFactory deleterFactory + ) { + this.entityManager = entityManager; + this.queryFactory = queryFactory; + this.deleterFactory = deleterFactory; + } + + public void deleteAndSaveByIds(List ids) throws InvalidApplicationException { + logger.debug(new MapLogEntry("collecting to delete").And("count", Optional.ofNullable(ids).map(List::size).orElse(0)).And("ids", ids)); + List data = this.queryFactory.query(ExternalReferenceQuery.class).ids(ids).collect(); + logger.trace("retrieved {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.deleteAndSave(data); + } + + public void deleteAndSave(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.delete(data); + logger.trace("saving changes"); + this.entityManager.flush(); + logger.trace("changes saved"); + } + + public void delete(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + if (data == null || data.isEmpty()) + return; + + Instant now = Instant.now(); + + for (ExternalReferenceEntity item : data) { + logger.trace("deleting item {}", item.getId()); + item.setIsActive(IsActive.Inactive); + item.setUpdatedAt(now); + logger.trace("updating item"); + this.entityManager.merge(item); + logger.trace("updated item"); + } + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java new file mode 100644 index 000000000..a2a8ba61c --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java @@ -0,0 +1,152 @@ +package eu.eudat.query; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.data.DmpExternalReferenceEntity; +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; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DmpExternalReferenceQuery extends QueryBase { + + private Collection ids; + + private Collection dmpIds; + + private Collection referenceIds; + + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + + public DmpExternalReferenceQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } + + public DmpExternalReferenceQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } + + public DmpExternalReferenceQuery ids(Collection values) { + this.ids = values; + return this; + } + + public DmpExternalReferenceQuery dmpIds(UUID value) { + this.dmpIds = List.of(value); + return this; + } + + public DmpExternalReferenceQuery dmpIds(UUID... value) { + this.dmpIds = Arrays.asList(value); + return this; + } + + public DmpExternalReferenceQuery dmpIds(Collection values) { + this.dmpIds = values; + return this; + } + + public DmpExternalReferenceQuery referenceIds(UUID value) { + this.referenceIds = List.of(value); + return this; + } + + public DmpExternalReferenceQuery referenceIds(UUID... value) { + this.referenceIds = Arrays.asList(value); + return this; + } + + public DmpExternalReferenceQuery referenceIds(Collection values) { + this.referenceIds = values; + return this; + } + + public DmpExternalReferenceQuery authorize(EnumSet values) { + this.authorize = values; + return this; + } + + private final UserScope userScope; + + private final AuthorizationService authService; + + public DmpExternalReferenceQuery( + UserScope userScope, + AuthorizationService authService + ) { + this.userScope = userScope; + this.authService = authService; + } + + @Override + protected Class entityClass() { + return DmpExternalReferenceEntity.class; + } + + @Override + protected Boolean isFalseQuery() { + return this.isEmpty(this.ids) || this.isEmpty(this.dmpIds) || this.isEmpty(this.referenceIds); + } + + @Override + protected Predicate applyFilters(QueryContext queryContext) { + List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._id)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.dmpIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._dmpId)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.referenceIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._referenceId)); + for (UUID item : this.ids) + 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 DmpExternalReferenceEntity convert(Tuple tuple, Set columns) { + DmpExternalReferenceEntity item = new DmpExternalReferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._id, UUID.class)); + item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._dmpId, UUID.class)); + item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._referenceId, UUID.class)); + item.setData(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._data, String.class)); + return item; + } + + @Override + protected String fieldNameOf(FieldResolver item) { + if (item.match(DmpExternalReferenceEntity._id)) return DmpExternalReferenceEntity._id; + else if (item.prefix(DmpExternalReferenceEntity._dmpId)) return DmpExternalReferenceEntity._dmpId; + else if (item.prefix(DmpExternalReferenceEntity._referenceId)) return DmpExternalReferenceEntity._referenceId; + else if (item.match(DmpExternalReferenceEntity._data)) return DmpExternalReferenceEntity._data; + else return null; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java new file mode 100644 index 000000000..a39a2f0d1 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java @@ -0,0 +1,230 @@ +package eu.eudat.query; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.data.DmpBlueprintEntity; +import eu.eudat.data.ExternalReferenceEntity; +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; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ExternalReferenceQuery extends QueryBase { + + private String like; + + private Collection ids; + + private Collection isActives; + + private Collection sourceTypes; + + private Collection externalReferenceTypes; + + private Collection excludedIds; + + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + public ExternalReferenceQuery like(String value) { + this.like = value; + return this; + } + + public ExternalReferenceQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } + + public ExternalReferenceQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } + + public ExternalReferenceQuery ids(Collection values) { + this.ids = values; + return this; + } + + public ExternalReferenceQuery isActive(IsActive value) { + this.isActives = List.of(value); + return this; + } + + public ExternalReferenceQuery isActive(IsActive... value) { + this.isActives = Arrays.asList(value); + return this; + } + + public ExternalReferenceQuery isActive(Collection values) { + this.isActives = values; + return this; + } + + public ExternalReferenceQuery externalReferenceTypes(ExternalReferencesType value) { + this.externalReferenceTypes = List.of(value); + return this; + } + + public ExternalReferenceQuery externalReferenceTypes(ExternalReferencesType... value) { + this.externalReferenceTypes = Arrays.asList(value); + return this; + } + + public ExternalReferenceQuery externalReferenceTypes(Collection values) { + this.externalReferenceTypes = values; + return this; + } + + public ExternalReferenceQuery excludedIds(Collection values) { + this.excludedIds = values; + return this; + } + + public ExternalReferenceQuery excludedIds(UUID value) { + this.excludedIds = List.of(value); + return this; + } + + public ExternalReferenceQuery excludedIds(UUID... value) { + this.excludedIds = Arrays.asList(value); + return this; + } + + public ExternalReferenceQuery sourceTypes(SourceType value) { + this.sourceTypes = List.of(value); + return this; + } + + public ExternalReferenceQuery sourceTypes(SourceType... value) { + this.sourceTypes = Arrays.asList(value); + return this; + } + + public ExternalReferenceQuery sourceTypes(Collection values) { + this.sourceTypes = values; + return this; + } + + public ExternalReferenceQuery authorize(EnumSet values) { + this.authorize = values; + return this; + } + + private final UserScope userScope; + + private final AuthorizationService authService; + + public ExternalReferenceQuery( + UserScope userScope, + AuthorizationService authService + ) { + this.userScope = userScope; + this.authService = authService; + } + + @Override + protected Class entityClass() { + return ExternalReferenceEntity.class; + } + + @Override + protected Boolean isFalseQuery() { + return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.externalReferenceTypes) || this.isEmpty(this.sourceTypes); + } + + @Override + protected Predicate applyFilters(QueryContext queryContext) { + List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._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(ExternalReferenceEntity._label), this.like)); + } + if (this.isActives != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._isActive)); + for (IsActive item : this.isActives) + inClause.value(item); + predicates.add(inClause); + } + if (this.sourceTypes != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._sourceType)); + for (SourceType item : this.sourceTypes) + inClause.value(item); + predicates.add(inClause); + } + if (this.externalReferenceTypes != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._type)); + for (ExternalReferencesType item : this.externalReferenceTypes) + inClause.value(item); + predicates.add(inClause); + } + if (this.excludedIds != null) { + CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpBlueprintEntity._id)); + for (UUID item : this.excludedIds) + notInClause.value(item); + predicates.add(notInClause.not()); + } + if (!predicates.isEmpty()) { + Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); + return queryContext.CriteriaBuilder.and(predicatesArray); + } else { + return null; + } + } + + @Override + protected ExternalReferenceEntity convert(Tuple tuple, Set columns) { + ExternalReferenceEntity item = new ExternalReferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._id, UUID.class)); + item.setLabel(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._label, String.class)); + item.setDescription(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._description, String.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._updatedAt, Instant.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._isActive, IsActive.class)); + item.setDefinition(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._definition, String.class)); + item.setAbbreviation(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._abbreviation, String.class)); + item.setReference(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._reference, String.class)); + item.setSource(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._source, String.class)); + item.setSourceType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._sourceType, SourceType.class)); + item.setType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._type, ExternalReferencesType.class)); + //item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdBy, UUID.class)); + return item; + } + + @Override + protected String fieldNameOf(FieldResolver item) { + if (item.match(ExternalReferenceEntity._id)) return ExternalReferenceEntity._id; + else if (item.match(ExternalReferenceEntity._label)) return ExternalReferenceEntity._label; + else if (item.match(ExternalReferenceEntity._description)) return ExternalReferenceEntity._description; + else if (item.match(ExternalReferenceEntity._createdAt)) return ExternalReferenceEntity._createdAt; + else if (item.match(ExternalReferenceEntity._updatedAt)) return ExternalReferenceEntity._updatedAt; + else if (item.match(ExternalReferenceEntity._isActive)) return ExternalReferenceEntity._isActive; + else if (item.match(ExternalReferenceEntity._definition)) return ExternalReferenceEntity._definition; + else if (item.match(ExternalReferenceEntity._abbreviation)) return ExternalReferenceEntity._abbreviation; + else if (item.match(ExternalReferenceEntity._reference)) return ExternalReferenceEntity._reference; + else if (item.match(ExternalReferenceEntity._source)) return ExternalReferenceEntity._source; + else if (item.match(ExternalReferenceEntity._sourceType)) return ExternalReferenceEntity._sourceType; + else if (item.match(ExternalReferenceEntity._type)) return ExternalReferenceEntity._type; + //else if (item.prefix(ExternalReferenceEntity._createdBy)) return ExternalReferenceEntity._createdBy; + else return null; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java new file mode 100644 index 000000000..affe22396 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java @@ -0,0 +1,30 @@ +package eu.eudat.query.lookup; + +import eu.eudat.query.DmpExternalReferenceQuery; +import gr.cite.tools.data.query.Lookup; +import gr.cite.tools.data.query.QueryFactory; + +import java.util.Collection; +import java.util.UUID; + +public class DmpExternalReferenceLookup extends Lookup { + + private Collection ids; + + private Collection dmpIds; + + private Collection referenceIds; + + + public DmpExternalReferenceQuery enrich(QueryFactory queryFactory) { + DmpExternalReferenceQuery query = queryFactory.query(DmpExternalReferenceQuery.class); + if (this.ids != null) query.ids(this.ids); + if (this.dmpIds != null) query.dmpIds(this.dmpIds); + if (this.referenceIds != null) query.referenceIds(this.referenceIds); + + this.enrichCommon(query); + + return query; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java new file mode 100644 index 000000000..3e991f483 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java @@ -0,0 +1,90 @@ +package eu.eudat.query.lookup; + +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.enums.SourceType; +import eu.eudat.query.ExternalReferenceQuery; +import gr.cite.tools.data.query.Lookup; +import gr.cite.tools.data.query.QueryFactory; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public class ExternalReferenceLookup extends Lookup { + + private String like; + + private List isActive; + + private Collection sourceTypes; + + private Collection externalReferenceTypes; + + private List ids; + + private List excludedIds; + + public String getLike() { + return like; + } + + public void setLike(String like) { + this.like = like; + } + + public List getIsActive() { + return isActive; + } + + public void setIsActive(List isActive) { + this.isActive = isActive; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public List getExcludedIds() { + return excludedIds; + } + + public void setExcludedIds(List excludeIds) { + this.excludedIds = excludeIds; + } + + public Collection getSourceTypes() { + return sourceTypes; + } + + public void setSourceTypes(Collection sourceTypes) { + this.sourceTypes = sourceTypes; + } + + public Collection getExternalReferenceTypes() { + return externalReferenceTypes; + } + + public void setExternalReferenceTypes(Collection externalReferenceTypes) { + this.externalReferenceTypes = externalReferenceTypes; + } + + public ExternalReferenceQuery enrich(QueryFactory queryFactory) { + ExternalReferenceQuery query = queryFactory.query(ExternalReferenceQuery.class); + if (this.like != null) query.like(this.like); + if (this.isActive != null) query.isActive(this.isActive); + if (this.externalReferenceTypes != null) query.externalReferenceTypes(this.externalReferenceTypes); + if (this.sourceTypes != null) query.sourceTypes(this.sourceTypes); + if (this.ids != null) query.ids(this.ids); + if (this.excludedIds != null) query.excludedIds(this.excludedIds); + + this.enrichCommon(query); + + return query; + } + +} diff --git a/dmp-backend/web/src/main/resources/config/permissions.yml b/dmp-backend/web/src/main/resources/config/permissions.yml index 271d7dc52..5d5428d03 100644 --- a/dmp-backend/web/src/main/resources/config/permissions.yml +++ b/dmp-backend/web/src/main/resources/config/permissions.yml @@ -135,3 +135,45 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + + # ExternalReference Permissions + BrowseExternalReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditExternalReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteExternalReference: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + + # DmpExternalReference Permissions + BrowseDmpExternalReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditDmpExternalReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteDmpExternalReference: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false From 7ab1313b835ab7da217cd5c1f9c93bd422e90286 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Wed, 25 Oct 2023 11:17:56 +0300 Subject: [PATCH 02/25] Updated the dmp builder to be able to populate the associated descriptions on the dmps --- .../src/main/java/eu/eudat/model/Dmp.java | 12 +++ .../eu/eudat/model/builder/DmpBuilder.java | 94 +++++++++++++++---- 2 files changed, 89 insertions(+), 17 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java index b06e7ad92..c57b5d5fc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java @@ -4,6 +4,7 @@ import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.enums.IsActive; import java.time.Instant; +import java.util.List; import java.util.UUID; public class Dmp { @@ -88,6 +89,10 @@ public class Dmp { public static final String _hash = "hash"; + private List dmpDescriptions; + + public static final String _dmpDescriptions = "dmpDescriptions"; + public UUID getId() { return id; } @@ -248,4 +253,11 @@ public class Dmp { this.hash = hash; } + public List getDmpDescriptions() { + return dmpDescriptions; + } + + public void setDmpDescriptions(List dmpDescriptions) { + this.dmpDescriptions = dmpDescriptions; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java index d26a359ff..12573d759 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java @@ -3,8 +3,13 @@ package eu.eudat.model.builder; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpEntity; +import eu.eudat.model.Description; import eu.eudat.model.Dmp; +import eu.eudat.query.DescriptionQuery; +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.fieldset.FieldSet; import gr.cite.tools.logging.DataLogEntry; import gr.cite.tools.logging.LoggerService; @@ -15,16 +20,25 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.*; +import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class DmpBuilder extends BaseBuilder { + private final QueryFactory queryFactory; + + private final BuilderFactory builderFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired - public DmpBuilder(ConventionService conventionService) { + public DmpBuilder(ConventionService conventionService, + QueryFactory queryFactory, + BuilderFactory builderFactory) { super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpBuilder.class))); + this.queryFactory = queryFactory; + this.builderFactory = builderFactory; } public DmpBuilder authorize(EnumSet values) { @@ -38,29 +52,75 @@ public class DmpBuilder extends BaseBuilder { this.logger.trace(new DataLogEntry("requested fields", fields)); if (fields == null || data == null || fields.isEmpty()) return new ArrayList<>(); + List models = new ArrayList<>(); + + FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asPrefix(Dmp._dmpDescriptions)); + Map> dmpDescriptionsMap = this.collectDmpDescriptions(dmpDescriptionsFields, data); + for (DmpEntity d : data) { Dmp m = new Dmp(); - if (fields.hasField(this.asIndexer(Dmp._id))) m.setId(d.getId()); - if (fields.hasField(this.asIndexer(Dmp._label))) m.setLabel(d.getLabel()); - if (fields.hasField(this.asIndexer(Dmp._version))) m.setVersion(d.getVersion()); - if (fields.hasField(this.asIndexer(Dmp._status))) m.setStatus(d.getStatus()); - if (fields.hasField(this.asIndexer(Dmp._properties))) m.setProperties(d.getProperties()); - if (fields.hasField(this.asIndexer(Dmp._dmpProperties))) m.setDmpProperties(d.getDmpProperties()); - if (fields.hasField(this.asIndexer(Dmp._groupId))) m.setGroupId(d.getGroupId()); - if (fields.hasField(this.asIndexer(Dmp._description))) m.setDescription(d.getDescription()); - if (fields.hasField(this.asIndexer(Dmp._isPublic))) m.setIsPublic(d.getIsPublic()); - if (fields.hasField(this.asIndexer(Dmp._extraProperties))) m.setExtraProperties(d.getExtraProperties()); - if (fields.hasField(this.asIndexer(Dmp._createdAt))) m.setCreatedAt(d.getCreatedAt()); - if (fields.hasField(this.asIndexer(Dmp._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); - if (fields.hasField(this.asIndexer(Dmp._isActive))) m.setIsActive(d.getIsActive()); - if (fields.hasField(this.asIndexer(Dmp._finalizedAt))) m.setFinalizedAt(d.getFinalizedAt()); - if (fields.hasField(this.asIndexer(Dmp._publishedAt))) m.setPublishedAt(d.getPublishedAt()); - if (fields.hasField(this.asIndexer(Dmp._hash))) m.setHash(this.hashValue(d.getUpdatedAt())); + if (fields.hasField(this.asIndexer(Dmp._id))) + m.setId(d.getId()); + if (fields.hasField(this.asIndexer(Dmp._label))) + m.setLabel(d.getLabel()); + if (fields.hasField(this.asIndexer(Dmp._version))) + m.setVersion(d.getVersion()); + if (fields.hasField(this.asIndexer(Dmp._status))) + m.setStatus(d.getStatus()); + if (fields.hasField(this.asIndexer(Dmp._properties))) + m.setProperties(d.getProperties()); + if (fields.hasField(this.asIndexer(Dmp._dmpProperties))) + m.setDmpProperties(d.getDmpProperties()); + if (fields.hasField(this.asIndexer(Dmp._groupId))) + m.setGroupId(d.getGroupId()); + if (fields.hasField(this.asIndexer(Dmp._description))) + m.setDescription(d.getDescription()); + if (fields.hasField(this.asIndexer(Dmp._isPublic))) + m.setIsPublic(d.getIsPublic()); + if (fields.hasField(this.asIndexer(Dmp._extraProperties))) + m.setExtraProperties(d.getExtraProperties()); + if (fields.hasField(this.asIndexer(Dmp._createdAt))) + m.setCreatedAt(d.getCreatedAt()); + if (fields.hasField(this.asIndexer(Dmp._updatedAt))) + m.setUpdatedAt(d.getUpdatedAt()); + if (fields.hasField(this.asIndexer(Dmp._isActive))) + m.setIsActive(d.getIsActive()); + if (fields.hasField(this.asIndexer(Dmp._finalizedAt))) + m.setFinalizedAt(d.getFinalizedAt()); + if (fields.hasField(this.asIndexer(Dmp._publishedAt))) + m.setPublishedAt(d.getPublishedAt()); + if (fields.hasField(this.asIndexer(Dmp._hash))) + m.setHash(this.hashValue(d.getUpdatedAt())); + + if (!dmpDescriptionsFields.isEmpty() && dmpDescriptionsMap != null && dmpDescriptionsMap.containsKey(d.getId())) + m.setDmpDescriptions(dmpDescriptionsMap.get(d.getId())); + models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } + private Map> collectDmpDescriptions(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) + return null; + this.logger.debug("checking related - {}", Description.class.getSimpleName()); + + Map> itemMap; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(Description._dmp, Dmp._id)); + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(this.authorize).dmpIds(data.stream().map(DmpEntity::getId).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DescriptionBuilder.class).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); + + if (!fields.hasField(this.asIndexer(Description._dmp, Dmp._id))) { + itemMap.forEach((id, dmps) -> { + dmps.forEach(description -> { + if (description != null && description.getDmp() != null) + description.getDmp().setId(null); + }); + }); + } + return itemMap; + } + } From 079382556fe3636e19a1c2cb9dd80b6e592cbf4b Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Wed, 25 Oct 2023 11:48:19 +0300 Subject: [PATCH 03/25] Added controller for description entity (former dataset) --- .../java/eu/eudat/audit/AuditableAction.java | 5 + .../controllers/v2/DescriptionController.java | 128 ++++++++++++++++++ .../controllers/v2/EntityDoiController.java | 2 +- 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionController.java 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 bc17a621b..de927d759 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 @@ -31,4 +31,9 @@ public class AuditableAction { public static final EventId Dmp_Persist = new EventId(5002, "Dmp_Persist"); public static final EventId Dmp_Delete = new EventId(5003, "Dmp_Delete"); + public static final EventId Description_Query = new EventId(6000, "Description_Query"); + public static final EventId Description_Lookup = new EventId(6001, "Description_Lookup"); + public static final EventId Description_Persist = new EventId(6002, "Description_Persist"); + public static final EventId Description_Delete = new EventId(6003, "Description_Delete"); + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionController.java new file mode 100644 index 000000000..1e4714926 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionController.java @@ -0,0 +1,128 @@ +package eu.eudat.controllers.v2; + +import eu.eudat.audit.AuditableAction; +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.data.DescriptionEntity; +import eu.eudat.model.Description; +import eu.eudat.model.Dmp; +import eu.eudat.model.builder.DescriptionBuilder; +import eu.eudat.model.censorship.DescriptionCensor; +import eu.eudat.model.persist.DescriptionPersist; +import eu.eudat.model.result.QueryResult; +import eu.eudat.query.DescriptionQuery; +import eu.eudat.query.lookup.DescriptionLookup; +import eu.eudat.service.description.DescriptionService; +import gr.cite.tools.auditing.AuditService; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.censor.CensorFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.exception.MyForbiddenException; +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 gr.cite.tools.validation.MyValidate; +import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.management.InvalidApplicationException; +import java.util.*; + +@RestController +@RequestMapping(path = "api/description") +public class DescriptionController { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionController.class)); + + private final BuilderFactory builderFactory; + + private final AuditService auditService; + + private final DescriptionService descriptionService; + + private final CensorFactory censorFactory; + + private final QueryFactory queryFactory; + + private final MessageSource messageSource; + + public DescriptionController( + BuilderFactory builderFactory, + AuditService auditService, + DescriptionService descriptionService, + CensorFactory censorFactory, + QueryFactory queryFactory, + MessageSource messageSource) { + this.builderFactory = builderFactory; + this.auditService = auditService; + this.descriptionService = descriptionService; + this.censorFactory = censorFactory; + this.queryFactory = queryFactory; + this.messageSource = messageSource; + } + + @PostMapping("query") + public QueryResult Query(@RequestBody DescriptionLookup lookup) throws MyApplicationException, MyForbiddenException { + logger.debug("querying {}", Description.class.getSimpleName()); + + this.censorFactory.censor(DescriptionCensor.class).censor(lookup.getProject(), null); + + DescriptionQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrPermission); + + List data = query.collectAs(lookup.getProject()); + List models = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(lookup.getProject(), data); + long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); + + this.auditService.track(AuditableAction.Description_Query, "lookup", lookup); + + return new QueryResult<>(models, count); + } + + @GetMapping("{id}") + public Description Get(@PathVariable("id") UUID id, FieldSet fieldSet, Locale locale) throws MyApplicationException, MyForbiddenException, MyNotFoundException { + logger.debug(new MapLogEntry("retrieving" + Description.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + + this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null); + + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrPermission).ids(id); + Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(fieldSet, query.firstAs(fieldSet)); + if (model == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + this.auditService.track(AuditableAction.Description_Lookup, Map.ofEntries( + new AbstractMap.SimpleEntry("id", id), + new AbstractMap.SimpleEntry("fields", fieldSet) + )); + + return model; + } + + @PostMapping("persist") + @Transactional + public Description Persist(@MyValidate @RequestBody DescriptionPersist model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException { + logger.debug(new MapLogEntry("persisting" + Description.class.getSimpleName()).And("model", model).And("fieldSet", fieldSet)); + Description persisted = this.descriptionService.persist(model, fieldSet); + + this.auditService.track(AuditableAction.Description_Persist, Map.ofEntries( + new AbstractMap.SimpleEntry("model", model), + new AbstractMap.SimpleEntry("fields", fieldSet) + )); + + return persisted; + } + + @DeleteMapping("{id}") + @Transactional + public void Delete(@PathVariable("id") UUID id) throws MyForbiddenException, InvalidApplicationException { + logger.debug(new MapLogEntry("retrieving" + Description.class.getSimpleName()).And("id", id)); + + this.descriptionService.deleteAndSave(id); + + this.auditService.track(AuditableAction.Description_Delete, "id", id); + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/EntityDoiController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/EntityDoiController.java index 7f9a4eba9..ab9216f52 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/EntityDoiController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/EntityDoiController.java @@ -122,7 +122,7 @@ public class EntityDoiController { this.entityDoiService.deleteAndSave(id); - this.auditService.track(AuditableAction.DescriptionTemplateType_Delete, "id", id); + this.auditService.track(AuditableAction.EntityDoi_Delete, "id", id); } } From 7df098a01013615c59a95a755fa92264ba203b44 Mon Sep 17 00:00:00 2001 From: amentis Date: Wed, 25 Oct 2023 12:42:34 +0300 Subject: [PATCH 04/25] add more to external reference controller, service --- .../java/eu/eudat/audit/AuditableAction.java | 5 + .../data/DmpExternalReferenceEntity.java | 2 +- .../eu/eudat/model/ExternalReference.java | 11 + .../builder/ExternalReferenceBuilder.java | 37 ++- .../censorship/ExternalReferenceCensor.java | 4 +- .../eudat/query/ExternalReferenceQuery.java | 8 +- .../v2/ExternalReferenceController.java | 171 ++++++++++++++ .../v2/ExternalReferencesController.java | 111 --------- .../ExternalReferenceService.java | 163 +++++++++++++ .../ExternalReferencesService.java | 217 ------------------ .../externalreferences/FunderService.java | 69 ------ .../externalreferences/ProjectService.java | 64 ------ .../eudat/models/data/ExternalReference2.java | 188 --------------- ...nce.java => FetcherExternalReference.java} | 50 ++-- .../external-sources.service.ts | 2 +- 15 files changed, 417 insertions(+), 685 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferencesController.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesService.java delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/FunderService.java delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ProjectService.java delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference2.java rename dmp-backend/web/src/main/java/eu/eudat/models/data/{ExternalReference.java => FetcherExternalReference.java} (73%) 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 de927d759..1c30efefa 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 @@ -36,4 +36,9 @@ public class AuditableAction { public static final EventId Description_Persist = new EventId(6002, "Description_Persist"); public static final EventId Description_Delete = new EventId(6003, "Description_Delete"); + public static final EventId External_Reference_Query = new EventId(7000, "External_Reference_Query"); + public static final EventId External_Reference_Lookup = new EventId(7001, "External_Reference_Lookup"); + public static final EventId External_Reference_Persist = new EventId(7002, "External_Reference_Persist"); + public static final EventId External_Reference_Delete = new EventId(7003, "External_Reference_Delete"); + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java index c10468523..072024af8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java @@ -8,7 +8,7 @@ import jakarta.persistence.Table; import java.util.UUID; @Entity -@Table(name = "\"ExternalReference\"") +@Table(name = "\"DmpExternalReference\"") public class DmpExternalReferenceEntity { @Id diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java index 7f4f7c583..d8d279c05 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java @@ -5,6 +5,7 @@ import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; import java.time.Instant; +import java.util.List; import java.util.UUID; public class ExternalReference { @@ -48,6 +49,9 @@ public class ExternalReference { //private UserInfo createdBy; ToDo //public static final String _createdBy = "createdBy"; + private List dmpExternalReferences; + public static final String _dmpExternalReferences = "dmpExternalReferences"; + public UUID getId() { return id; } @@ -144,4 +148,11 @@ public class ExternalReference { this.updatedAt = updatedAt; } + public List getDmpExternalReferences() { + return dmpExternalReferences; + } + + public void setDmpExternalReferences(List dmpExternalReferences) { + this.dmpExternalReferences = dmpExternalReferences; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java index 57e10ec57..d2280800f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java @@ -3,9 +3,13 @@ package eu.eudat.model.builder; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.convention.ConventionService; import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.model.DmpExternalReference; import eu.eudat.model.ExternalReference; +import eu.eudat.query.DmpExternalReferenceQuery; 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.fieldset.FieldSet; import gr.cite.tools.logging.DataLogEntry; import gr.cite.tools.logging.LoggerService; @@ -16,20 +20,23 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.*; +import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ExternalReferenceBuilder extends BaseBuilder{ private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public ExternalReferenceBuilder( ConventionService conventionService, - BuilderFactory builderFactory) { + BuilderFactory builderFactory, QueryFactory queryFactory) { super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalReferenceBuilder.class))); this.builderFactory = builderFactory; + this.queryFactory = queryFactory; } public ExternalReferenceBuilder authorize(EnumSet values) { @@ -43,7 +50,11 @@ public class ExternalReferenceBuilder extends BaseBuilder(); - // FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); + + //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); + + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asPrefix(ExternalReference._dmpExternalReferences)); + Map> dmpExternalReferenceMap = this.collectDmpExternalReferences(dmpExternalReferencesFields, data); List models = new ArrayList<>(); for (ExternalReferenceEntity d : data) { @@ -60,13 +71,31 @@ public class ExternalReferenceBuilder extends BaseBuilder> collectDmpExternalReferences(FieldSet fields, List datas) throws MyApplicationException { + if (fields.isEmpty() || datas.isEmpty()) return null; + this.logger.debug("checking related - {}", DmpExternalReference.class.getSimpleName()); + + Map> itemMap = null; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpExternalReference._externalReference, ExternalReference._id)); + DmpExternalReferenceQuery query = this.queryFactory.query(DmpExternalReferenceQuery.class).authorize(this.authorize).referenceIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpExternalReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getExternalReference().getId()); + + if (!fields.hasField(this.asIndexer(DmpExternalReference._externalReference, ExternalReference._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getExternalReference() != null).map(x -> { + x.getExternalReference().setId(null); + return x; + }).collect(Collectors.toList()); + } + return itemMap; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java index fe2dfe760..07f09d5e5 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java @@ -2,9 +2,7 @@ package eu.eudat.model.censorship; import eu.eudat.authorization.Permission; import eu.eudat.convention.ConventionService; -import eu.eudat.model.DmpBlueprint; import eu.eudat.model.ExternalReference; -import eu.eudat.model.censorship.dmpblueprintdefinition.DefinitionCensor; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.fieldset.FieldSet; @@ -40,6 +38,8 @@ public class ExternalReferenceCensor extends BaseCensor { return; this.authService.authorizeForce(Permission.BrowseExternalReference); + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._dmpExternalReferences)); + this.censorFactory.censor(DmpExternalReferenceCensor.class).censor(dmpExternalReferencesFields, userId); //ToDo //FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._createdBy)); //this.censorFactory.censor(UserInfo.class).censor(definitionFields, userId); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java index a39a2f0d1..747221a31 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java @@ -156,7 +156,9 @@ public class ExternalReferenceQuery extends QueryBase { predicates.add(inClause); } if (this.like != null && !this.like.isEmpty()) { - predicates.add(queryContext.CriteriaBuilder.like(queryContext.Root.get(ExternalReferenceEntity._label), this.like)); + predicates.add(queryContext.CriteriaBuilder.or(queryContext.CriteriaBuilder.like(queryContext.Root.get(ExternalReferenceEntity._label), this.like), + queryContext.CriteriaBuilder.like(queryContext.Root.get(ExternalReferenceEntity._description), this.like) + )); } if (this.isActives != null) { CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._isActive)); @@ -177,7 +179,7 @@ public class ExternalReferenceQuery extends QueryBase { predicates.add(inClause); } if (this.excludedIds != null) { - CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpBlueprintEntity._id)); + CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._id)); for (UUID item : this.excludedIds) notInClause.value(item); predicates.add(notInClause.not()); @@ -205,7 +207,7 @@ public class ExternalReferenceQuery extends QueryBase { item.setSource(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._source, String.class)); item.setSourceType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._sourceType, SourceType.class)); item.setType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._type, ExternalReferencesType.class)); - //item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdBy, UUID.class)); + item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdBy, UUID.class)); return item; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java new file mode 100644 index 000000000..38bc97775 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java @@ -0,0 +1,171 @@ +package eu.eudat.controllers.v2; + +import eu.eudat.audit.AuditableAction; +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.authorization.Permission; +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.controllers.BaseController; +import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.externalreferences.ExternalReferenceService; +import eu.eudat.model.ExternalReference; +import eu.eudat.model.builder.ExternalReferenceBuilder; +import eu.eudat.model.censorship.ExternalReferenceCensor; +import eu.eudat.model.result.QueryResult; +import eu.eudat.models.data.FetcherExternalReference; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.query.ExternalReferenceQuery; +import eu.eudat.query.lookup.ExternalReferenceLookup; +import eu.eudat.types.ApiMessageCode; +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; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.exception.MyForbiddenException; +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 jakarta.transaction.Transactional; +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.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.management.InvalidApplicationException; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@RestController +@RequestMapping(path = {"api/external-references"}) +public class ExternalReferenceController extends BaseController { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceController.class)); + private final BuilderFactory builderFactory; + private final AuditService auditService; + private final ExternalReferenceService externalReferenceService; + private final CensorFactory censorFactory; + private final QueryFactory queryFactory; + private final MessageSource messageSource; + private final AuthorizationService authorizationService; + + @Autowired + public ExternalReferenceController( + ApiContext apiContext, + BuilderFactory builderFactory, + ExternalReferenceService externalReferenceService, + AuditService auditService, + CensorFactory censorFactory, + QueryFactory queryFactory, + MessageSource messageSource, AuthorizationService authorizationService) { + super(apiContext); + this.builderFactory = builderFactory; + this.externalReferenceService = externalReferenceService; + this.auditService = auditService; + this.censorFactory = censorFactory; + this.queryFactory = queryFactory; + this.messageSource = messageSource; + this.authorizationService = authorizationService; + } + + @PostMapping("query") + public QueryResult query(@RequestBody ExternalReferenceLookup lookup) throws MyApplicationException, MyForbiddenException { + logger.debug("querying {}", ExternalReference.class.getSimpleName()); + + this.censorFactory.censor(ExternalReferenceCensor.class).censor(lookup.getProject(), null); + + ExternalReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrPermission); + List datas = query.collectAs(lookup.getProject()); + List models = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(lookup.getProject(), datas); + long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); + + this.auditService.track(AuditableAction.External_Reference_Query, "lookup", lookup); + + return new QueryResult(models, count); + } + + @GetMapping("{id}") + public ExternalReference get(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { + logger.debug(new MapLogEntry("retrieving" + eu.eudat.model.ExternalReference.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + + this.censorFactory.censor(ExternalReferenceCensor.class).censor(fieldSet, null); + + ExternalReferenceQuery query = this.queryFactory.query(ExternalReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrPermission).ids(id); + ExternalReference model = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(fieldSet, query.firstAs(fieldSet)); + if (model == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, eu.eudat.model.ExternalReference.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + this.auditService.track(AuditableAction.External_Reference_Lookup, Map.ofEntries( + new AbstractMap.SimpleEntry("id", id), + new AbstractMap.SimpleEntry("fields", fieldSet) + )); + + return model; + } + + @GetMapping(path = {"search/{externalType}"}, produces = "application/json") + public @ResponseBody ResponseEntity>> searchExternalReference(@PathVariable(value = "externalType") int externalType, + @RequestParam(value = "query", required = false) String query, + @RequestParam(value = "type", required = false) String type + ) throws HugeResultSet, NoURLFound, InvalidApplicationException { + this.authorizationService.authorizeForce(Permission.AuthenticatedRole); + ExternalReferencesType externalReferencesType = ExternalReferencesType.of((short) externalType); + + List fetcherExternalReferences = this.externalReferenceService.searchExternalReference(externalReferencesType, query, type); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(fetcherExternalReferences)); + } + + @DeleteMapping("{id}") + @Transactional + public void delete(@PathVariable("id") UUID id) throws MyForbiddenException, InvalidApplicationException { + logger.debug(new MapLogEntry("retrieving" + ExternalReference.class.getSimpleName()).And("id", id)); + + this.externalReferenceService.deleteAndSave(id); + + this.auditService.track(AuditableAction.External_Reference_Delete, "id", id); + } + + +// @Transactional +// @PostMapping(path = {"persist"}, consumes = "application/json", produces = "application/json") +// public @ResponseBody +// ResponseEntity> createExternalReferecnes(@RequestBody ExternalReference externalReference) throws Exception { +// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); +// +// ExternalReference newExternalReference = this.externalReferencesService.createDataRepo(externalReference); +// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); +// } + + + + +// @GetMapping(path = {"{externalType}"}, produces = "application/json") +// public @ResponseBody ResponseEntity>> listExternalReferecnes2(@RequestParam(value = "externalType") String externalType, @RequestParam(value = "query", required = false) String query, +// @RequestParam(value = "type", required = false) String type +// ) throws HugeResultSet, NoURLFound, InvalidApplicationException { +// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); +// +// List externalReferences = this.externalReferencesService.getExternalReference2(externalType, query, type); +// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(externalReferences)); +// } +// +// @Transactional +// @PostMapping(value = {"{externalType}/persist"}, consumes = "application/json", produces = "application/json") +// public @ResponseBody +// ResponseEntity> create(@RequestBody ExternalReference2 externalReference) throws Exception { +// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); +// +// ExternalReference2 newExternalReference = this.externalReferencesService.create(externalReference); +// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); +// } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferencesController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferencesController.java deleted file mode 100644 index aadc1867b..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferencesController.java +++ /dev/null @@ -1,111 +0,0 @@ -package eu.eudat.controllers.v2; - -import eu.eudat.authorization.Permission; -import eu.eudat.commons.enums.ExternalReferencesType; -import eu.eudat.controllers.BaseController; -import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; -import eu.eudat.logic.proxy.config.exceptions.NoURLFound; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.externalreferences.ExternalReferencesService; -import eu.eudat.logic.services.externalreferences.FunderService; -import eu.eudat.logic.services.externalreferences.ProjectService; -import eu.eudat.models.data.ExternalReference; -import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.types.ApiMessageCode; -import gr.cite.commons.web.authz.service.AuthorizationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.management.InvalidApplicationException; -import java.util.List; - -@RestController -@RequestMapping(path = {"api/external-references"}) -public class ExternalReferencesController extends BaseController { - - private final FunderService funderService; - private final ExternalReferencesService externalReferencesService; - private final ProjectService projectService; - private final AuthorizationService authorizationService; - - @Autowired - public ExternalReferencesController( - ApiContext apiContext, - FunderService funderService, - ExternalReferencesService externalReferencesService, - ProjectService projectService, - AuthorizationService authorizationService) { - super(apiContext); - this.funderService = funderService; - this.externalReferencesService = externalReferencesService; - this.projectService = projectService; - this.authorizationService = authorizationService; - } - -// @PostMapping(path = {"funders"}, consumes = "application/json", produces = "application/json") -// public @ResponseBody ResponseEntity>> getWithExternal(@RequestBody FunderCriteriaRequest funderCriteria) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException, InvalidApplicationException { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// List dataTable = this.funderService.getCriteriaWithExternal(funderCriteria); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); -// } -// -// @PostMapping(path = {"projects"}, consumes = "application/json", produces = "application/json") -// public @ResponseBody -// ResponseEntity>> getWithExternal(@RequestBody ProjectCriteriaRequest projectCriteria) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException, InvalidApplicationException { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// List dataTable = this.projectService.getCriteriaWithExternal(projectCriteria); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); -// } - - - - @GetMapping(path = {"{externalType}"}, produces = "application/json") - public @ResponseBody ResponseEntity>> listExternalReferecnes(@PathVariable(value = "externalType") int externalType, - @RequestParam(value = "query", required = false) String query, - @RequestParam(value = "type", required = false) String type - ) throws HugeResultSet, NoURLFound, InvalidApplicationException { - this.authorizationService.authorizeForce(Permission.AuthenticatedRole); - ExternalReferencesType externalReferencesType = ExternalReferencesType.of((short) externalType); - - List externalReferences = this.externalReferencesService.getExternalReference(externalReferencesType, query, type); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(externalReferences)); - } - -// @Transactional -// @PostMapping(path = {"data-repo/persist"}, consumes = "application/json", produces = "application/json") -// public @ResponseBody -// ResponseEntity> createExternalReferecnes(@RequestBody ExternalReference externalReference) throws Exception { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// ExternalReference newExternalReference = this.externalReferencesService.createDataRepo(externalReference); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); -// } - - - - -// @GetMapping(path = {"{externalType}"}, produces = "application/json") -// public @ResponseBody ResponseEntity>> listExternalReferecnes2(@RequestParam(value = "externalType") String externalType, @RequestParam(value = "query", required = false) String query, -// @RequestParam(value = "type", required = false) String type -// ) throws HugeResultSet, NoURLFound, InvalidApplicationException { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// List externalReferences = this.externalReferencesService.getExternalReference2(externalType, query, type); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(externalReferences)); -// } -// -// @Transactional -// @PostMapping(value = {"{externalType}/persist"}, consumes = "application/json", produces = "application/json") -// public @ResponseBody -// ResponseEntity> create(@RequestBody ExternalReference2 externalReference) throws Exception { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// ExternalReference2 newExternalReference = this.externalReferencesService.create(externalReference); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); -// } - -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java new file mode 100644 index 000000000..21032c347 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java @@ -0,0 +1,163 @@ +package eu.eudat.logic.services.externalreferences; + +import eu.eudat.authorization.Permission; +import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.convention.ConventionService; +import eu.eudat.data.dao.criteria.DataRepositoryCriteria; +import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; +import eu.eudat.data.dao.criteria.RegistryCriteria; +import eu.eudat.data.dao.criteria.ServiceCriteria; +import eu.eudat.data.old.DataRepository; +import eu.eudat.data.old.ExternalDataset; +import eu.eudat.data.old.Registry; +import eu.eudat.data.old.Service; +import eu.eudat.logic.builders.model.criteria.ExternalDatasetCriteriaBuilder; +import eu.eudat.logic.proxy.config.ExternalUrlCriteria; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.proxy.fetching.RemoteFetcher; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.model.deleter.ExternalReferenceDeleter; +import eu.eudat.models.data.FetcherExternalReference; +import eu.eudat.queryable.QueryableList; +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.exception.MyForbiddenException; +import gr.cite.tools.logging.LoggerService; +import jakarta.persistence.EntityManager; +import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; + +import javax.management.InvalidApplicationException; +import java.util.*; +import java.util.stream.Collectors; + +@org.springframework.stereotype.Service +public class ExternalReferenceService { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceService.class)); + private final ApiContext apiContext; + private final UserScope userScope; + private final RemoteFetcher remoteFetcher; + private final EntityManager entityManager; + private final AuthorizationService authorizationService; + private final DeleterFactory deleterFactory; + private final BuilderFactory builderFactory; + private final ConventionService conventionService; + private final MessageSource messageSource; + private final QueryFactory queryFactory; + + public ExternalReferenceService(ApiContext apiContext, + UserScope userScope, + RemoteFetcher remoteFetcher, + EntityManager entityManager, + AuthorizationService authorizationService, + DeleterFactory deleterFactory, + BuilderFactory builderFactory, + ConventionService conventionService, + MessageSource messageSource, + QueryFactory queryFactory) { + this.apiContext = apiContext; + this.userScope = userScope; + this.remoteFetcher = remoteFetcher; + this.entityManager = entityManager; + this.authorizationService = authorizationService; + this.deleterFactory = deleterFactory; + this.builderFactory = builderFactory; + this.conventionService = conventionService; + this.messageSource = messageSource; + this.queryFactory = queryFactory; + } + + public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { + logger.debug("deleting : {}", id); + + this.authorizationService.authorizeForce(Permission.DeleteExternalReference); + + this.deleterFactory.deleter(ExternalReferenceDeleter.class).deleteAndSaveByIds(List.of(id)); + } + + // external references: + // taxonomies, + // licenses, + // publications, + // journals, + // pubRepositories, + // dataRepositories + // registries, + // services + public List searchExternalReference(ExternalReferencesType externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { + ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); + + List> remoteRepos = null; + if (externalType.equals(ExternalReferencesType.Datasets)){ + remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); + }else { + remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); + } + + List list = this.fetchFromDb(externalType, query, type, remoteRepos); + + list.addAll(remoteRepos.stream().map(FetcherExternalReference::fromRemoteModel).toList()); + list = list.stream().filter(x -> x.getName().toLowerCase().contains(query.toLowerCase())).collect(Collectors.toList()); + list.sort(Comparator.comparing(FetcherExternalReference::getName)); + return list; + } + + private List fetchFromDb(ExternalReferencesType externalType, String query, String type, List> remoteRepos) throws InvalidApplicationException { + List list = new LinkedList<>(); + switch (externalType) { + case DataRepositories: + case PubRepositories: + case Journals: { + DataRepositoryCriteria criteria = new DataRepositoryCriteria(); + if (!query.isEmpty()) criteria.setLike(query); + criteria.setCreationUserId(this.userScope.getUserId()); + if (type.equals("")) { + List dataRepositoryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().getWithCriteria(criteria)).toList(); + list = dataRepositoryList.stream().map(item -> new FetcherExternalReference().fromDataRepository(item)).collect(Collectors.toList()); + } + } + case Registries: { + RegistryCriteria criteria = new RegistryCriteria(); + if (!query.isEmpty()) criteria.setLike(query); + criteria.setCreationUserId(this.userScope.getUserId()); + if (type.equals("")) { + List registryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().getWithCriteria(criteria)).toList(); + list = registryList.stream().map(item -> new FetcherExternalReference().fromRegistry(item)).collect(Collectors.toList()); + } + } + case Services: + { + ServiceCriteria criteria = new ServiceCriteria(); + + if (!query.isEmpty()) criteria.setLike(query); + criteria.setCreationUserId(this.userScope.getUserId()); + + if (type.equals("")) { + List serviceList = (this.apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().getWithCriteria(criteria)).toList(); + list = serviceList.stream().map(item -> new FetcherExternalReference().fromService(item)).collect(Collectors.toList()); + } + } + case Datasets:{ + + ExternalDatasetCriteria criteria = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); + + criteria.setCreationUserId(this.userScope.getUserId()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); + + list = items.select(item -> new FetcherExternalReference().fromDataset(item)); + } + case Taxonomies: + case Publications: + case Licenses: + break; + } + + return list; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesService.java deleted file mode 100644 index 0bb69e43e..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesService.java +++ /dev/null @@ -1,217 +0,0 @@ -package eu.eudat.logic.services.externalreferences; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import eu.eudat.commons.enums.ExternalReferencesType; -import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.dao.criteria.DataRepositoryCriteria; -import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; -import eu.eudat.data.dao.criteria.RegistryCriteria; -import eu.eudat.data.dao.criteria.ServiceCriteria; - -import eu.eudat.data.old.DataRepository; -import eu.eudat.data.old.ExternalDataset; -import eu.eudat.data.old.Registry; -import eu.eudat.data.old.Service; -import eu.eudat.logic.builders.model.criteria.ExternalDatasetCriteriaBuilder; -import eu.eudat.logic.proxy.config.ExternalUrlCriteria; -import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; -import eu.eudat.logic.proxy.config.exceptions.NoURLFound; -import eu.eudat.logic.proxy.fetching.RemoteFetcher; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.models.data.ExternalReference; -import eu.eudat.queryable.QueryableList; - -import javax.management.InvalidApplicationException; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@org.springframework.stereotype.Service -public class ExternalReferencesService { - - private final ApiContext apiContext; - private final UserScope userScope; - private final RemoteFetcher remoteFetcher; - - public ExternalReferencesService(ApiContext apiContext, UserScope userScope, RemoteFetcher remoteFetcher) { - this.apiContext = apiContext; - this.userScope = userScope; - this.remoteFetcher = remoteFetcher; - } - - // external references: - // taxonomies, - // licenses, - // publications, - // journals, - // pubRepositories, - // dataRepositories - -// public ExternalReference createDataRepo(ExternalReference externalReference) throws Exception { -// // only dataRepositories, pubRepositories, journals -// DataRepository dataRepository = externalReference.toDataModel(); -// dataRepository.getCreationUser().setId(this.userScope.getUserId()); -// -// dataRepository = apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().createOrUpdate(dataRepository); -// return new ExternalReference().fromDataModel(dataRepository); -// } - -// public List getExternalReference(String externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { -// ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); -// List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); -// -// DataRepositoryCriteria criteria = new DataRepositoryCriteria(); -// if (!query.isEmpty()) criteria.setLike(query); -// -// List list = new LinkedList<>(); -// if((externalType.equals("dataRepositories") || externalType.equals("pubRepositories") || externalType.equals("journals"))){ -// criteria.setCreationUserId(this.userScope.getUserId()); -// if (type.equals("")) { -// List dataRepositoryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().getWithCriteria(criteria)).toList(); -// list = dataRepositoryList.stream().map(item -> new ExternalReference().fromDataModel(item)).collect(Collectors.toList()); -// } -// } -// -// ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); -// list.addAll(remoteRepos.stream().map(item -> mapper.convertValue(item, ExternalReference.class)).collect(Collectors.toList())); -// list = list.stream().filter(x -> x.getName().toLowerCase().contains(query.toLowerCase())).collect(Collectors.toList()); -// return list; -// } - - - - // external references2: - // registries, - // services - -// public ExternalReference2 create(ExternalReference2 externalReference) throws Exception { -// if (externalReference.getLabel() == null || externalReference.getAbbreviation() == null || externalReference.getUri() == null) { -// throw new Exception("Missing mandatory entity."); -// } -// -// ExternalReference2 newExternalReference = null; -// if(externalReference.getExternalType().equals("registries")){ -// Registry registry = externalReference.toDataModelRegistry(); -// registry.getCreationUser().setId(this.userScope.getUserId()); -// registry = apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().createOrUpdate(registry); -// newExternalReference = new ExternalReference2().fromDataModel(registry); -// } else if (externalReference.getExternalType().equals("services")) { -// Service service = externalReference.toDataModelService(); -// service.getCreationUser().setId(this.userScope.getUserId()); -// service = apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().createOrUpdate(service); -// newExternalReference = new ExternalReference2().fromDataModel(service); -// } -// -// return newExternalReference; -// } -// -// -// public List getExternalReference2(String externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { -// ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); -// List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType,externalUrlCriteria, type); -// -// List list = new LinkedList<>(); -// -// if (externalType.equals("registries")){ -// RegistryCriteria criteria = new RegistryCriteria(); -// -// if (!query.isEmpty()) criteria.setLike(query); -// criteria.setCreationUserId(this.userScope.getUserId()); -// -// if (type.equals("")) { -// List registryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().getWithCriteria(criteria)).toList(); -// list = registryList.stream().map(item -> new ExternalReference2().fromDataModel(item)).collect(Collectors.toList()); -// } -// } else if (externalType.equals("services")) { -// ServiceCriteria criteria = new ServiceCriteria(); -// -// if (!query.isEmpty()) criteria.setLike(query); -// criteria.setCreationUserId(this.userScope.getUserId()); -// -// if (type.equals("")) { -// List serviceList = (this.apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().getWithCriteria(criteria)).toList(); -// list = serviceList.stream().map(item -> new ExternalReference2().fromDataModel(item)).collect(Collectors.toList()); -// } -// } -// -// ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); -// list.addAll(remoteRepos.stream().map(item -> mapper.convertValue(item, ExternalReference2.class)).collect(Collectors.toList())); -// -// return list; -// } - - public List getExternalReference(ExternalReferencesType externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { - ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - - List> remoteRepos = null; - if (externalType.equals(ExternalReferencesType.Datasets)){ - remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); - }else { - remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); - } - - List list = this.fetchFromDb(externalType, query, type, remoteRepos); - - list.addAll(remoteRepos.stream().map(ExternalReference::fromRemoteModel).toList()); - list = list.stream().filter(x -> x.getName().toLowerCase().contains(query.toLowerCase())).collect(Collectors.toList()); - list.sort(Comparator.comparing(ExternalReference::getName)); - return list; - } - - private List fetchFromDb(ExternalReferencesType externalType, String query, String type, List> remoteRepos) throws InvalidApplicationException { - List list = new LinkedList<>(); - switch (externalType) { - case DataRepositories: - case PubRepositories: - case Journals: { - DataRepositoryCriteria criteria = new DataRepositoryCriteria(); - if (!query.isEmpty()) criteria.setLike(query); - criteria.setCreationUserId(this.userScope.getUserId()); - if (type.equals("")) { - List dataRepositoryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().getWithCriteria(criteria)).toList(); - list = dataRepositoryList.stream().map(item -> new ExternalReference().fromDataRepository(item)).collect(Collectors.toList()); - } - } - case Registries: { - RegistryCriteria criteria = new RegistryCriteria(); - if (!query.isEmpty()) criteria.setLike(query); - criteria.setCreationUserId(this.userScope.getUserId()); - if (type.equals("")) { - List registryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().getWithCriteria(criteria)).toList(); - list = registryList.stream().map(item -> new ExternalReference().fromRegistry(item)).collect(Collectors.toList()); - } - } - case Services: - { - ServiceCriteria criteria = new ServiceCriteria(); - - if (!query.isEmpty()) criteria.setLike(query); - criteria.setCreationUserId(this.userScope.getUserId()); - - if (type.equals("")) { - List serviceList = (this.apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().getWithCriteria(criteria)).toList(); - list = serviceList.stream().map(item -> new ExternalReference().fromService(item)).collect(Collectors.toList()); - } - } - case Datasets:{ - - ExternalDatasetCriteria criteria = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); - - criteria.setCreationUserId(this.userScope.getUserId()); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); - - list = items.select(item -> new ExternalReference().fromDataset(item)); - } - case Taxonomies: - case Publications: - case Licenses: - break; - } - - return list; - } - -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/FunderService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/FunderService.java deleted file mode 100644 index 5336ebe9d..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/FunderService.java +++ /dev/null @@ -1,69 +0,0 @@ -package eu.eudat.logic.services.externalreferences; - -import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.old.UserInfo; -import eu.eudat.data.query.items.item.funder.FunderCriteriaRequest; -import eu.eudat.logic.builders.model.models.FunderBuilder; -import eu.eudat.logic.proxy.config.ExternalUrlCriteria; -import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; -import eu.eudat.logic.proxy.config.exceptions.NoURLFound; -import eu.eudat.logic.proxy.fetching.RemoteFetcher; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.utilities.helpers.ListHelper; -import eu.eudat.models.data.external.ExternalSourcesItemModel; -import eu.eudat.models.data.external.FundersExternalSourcesModel; -import eu.eudat.models.data.funder.Funder; -import eu.eudat.queryable.QueryableList; -import org.springframework.stereotype.Service; - -import javax.management.InvalidApplicationException; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -public class FunderService { - - private ApiContext apiContext; - private RemoteFetcher remoteFetcher; - private ListHelper listHelper; - private final UserScope userScope; - - public FunderService(ApiContext apiContext, RemoteFetcher remoteFetcher, ListHelper listHelper, UserScope userScope) { - this.apiContext = apiContext; - this.remoteFetcher = remoteFetcher; - this.listHelper = listHelper; - this.userScope = userScope; - } - - public List getCriteriaWithExternal(FunderCriteriaRequest funderCriteria) throws HugeResultSet, NoURLFound, InvalidApplicationException { - UserInfo userInfo = new UserInfo(); - userInfo.setId(this.userScope.getUserId()); - funderCriteria.getCriteria().setReference("dmp:"); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getWithCritetia(funderCriteria.getCriteria()); - QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getAuthenticated(items, userInfo); - List funders = authItems.select(item -> new Funder().fromDataModel(item)); - ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(funderCriteria.getCriteria().getLike()); - List> remoteRepos = remoteFetcher.getFunders(externalUrlCriteria); - FundersExternalSourcesModel fundersExternalSourcesModel = new FundersExternalSourcesModel().fromExternalItem(remoteRepos); - for (ExternalSourcesItemModel externalListingItem : fundersExternalSourcesModel) { - Funder funder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(FunderBuilder.class) - .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) - .status(eu.eudat.data.old.Funder.Status.fromInteger(0)) - .key(externalListingItem.getKey()) - .source(externalListingItem.getTag()) - .build(); - if (externalListingItem.getSource() != null) { - funder.setSource(externalListingItem.getSource()); - } else { - funder.setSource(externalListingItem.getTag()); - } - - funders.add(funder); - } - funders.sort(Comparator.comparing(Funder::getLabel)); - funders = funders.stream().filter(listHelper.distinctByKey(Funder::getLabel)).collect(Collectors.toList()); - return funders; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ProjectService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ProjectService.java deleted file mode 100644 index ebb7c9719..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ProjectService.java +++ /dev/null @@ -1,64 +0,0 @@ -package eu.eudat.logic.services.externalreferences; - -import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.query.items.item.project.ProjectCriteriaRequest; -import eu.eudat.logic.builders.model.models.ProjectBuilder; -import eu.eudat.logic.proxy.config.ExternalUrlCriteria; -import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; -import eu.eudat.logic.proxy.config.exceptions.NoURLFound; -import eu.eudat.logic.proxy.fetching.RemoteFetcher; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.utilities.helpers.ListHelper; -import eu.eudat.models.data.external.ExternalSourcesItemModel; -import eu.eudat.models.data.external.ProjectsExternalSourcesModel; -import eu.eudat.models.data.project.Project; -import eu.eudat.queryable.QueryableList; -import org.springframework.stereotype.Service; - -import javax.management.InvalidApplicationException; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -public class ProjectService { - - private ApiContext apiContext; - private RemoteFetcher remoteFetcher; - private ListHelper listHelper; - private final UserScope userScope; - - public ProjectService(ApiContext apiContext, ListHelper listHelper, UserScope userScope) { - this.apiContext = apiContext; - this.remoteFetcher = apiContext.getOperationsContext().getRemoteFetcher(); - this.listHelper = listHelper; - this.userScope = userScope; - } - - public List getCriteriaWithExternal(ProjectCriteriaRequest projectCriteria) throws HugeResultSet, NoURLFound, InvalidApplicationException { - eu.eudat.data.old.UserInfo userInfo = new eu.eudat.data.old.UserInfo(); - userInfo.setId(this.userScope.getUserId()); - projectCriteria.getCriteria().setReference("dmp:"); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCritetia(projectCriteria.getCriteria()); - QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getAuthenticated(items, userInfo); - List projects = authItems.select(item -> new Project().fromDataModel(item)); - ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(projectCriteria.getCriteria().getLike()); - List> remoteRepos = remoteFetcher.getProjects(externalUrlCriteria); - ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); - for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { - Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) - .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) - .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) - .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.data.old.Project.Status.fromInteger(0)) - .key(externalListingItem.getKey()) - .source(externalListingItem.getTag()) - .build(); - - projects.add(project); - } - projects.sort(Comparator.comparing(Project::getLabel)); - projects = projects.stream().filter(listHelper.distinctByKey(Project::getLabel)).collect(Collectors.toList()); - return projects; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference2.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference2.java deleted file mode 100644 index 764890742..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference2.java +++ /dev/null @@ -1,188 +0,0 @@ -package eu.eudat.models.data; - - - -import eu.eudat.data.old.Registry; -import eu.eudat.data.old.Service; -import eu.eudat.data.old.UserInfo; - -import java.util.Date; -import java.util.UUID; - -public class ExternalReference2 { - private UUID id; - private String label; - private String name; - private String pid; - private String abbreviation; - private String uri; - private Date created; - private Date modified; - private String reference; - private String tag; - private String source; - - private String externalType; - - public UUID getId() { - return id; - } - public void setId(UUID id) { - this.id = id; - } - - public String getLabel() { - return label; - } - public void setLabel(String label) { - this.label = label; - } - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - public String getPid() { - return pid; - } - public void setPid(String pid) { - this.pid = pid; - } - - public String getAbbreviation() { - return abbreviation; - } - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } - - public String getUri() { - return uri; - } - public void setUri(String uri) { - this.uri = uri; - } - - public Date getCreated() { - return created; - } - public void setCreated(Date created) { - this.created = created; - } - - public Date getModified() { - return modified; - } - public void setModified(Date modified) { - this.modified = modified; - } - - public String getReference() { - return reference; - } - public void setReference(String reference) { - this.reference = reference; - } - - public String getTag() { - return tag; - } - public void setTag(String tag) { - this.tag = tag; - } - - public String getSource() { - return source; - } - public void setSource(String source) { - this.source = source; - } - - public String getExternalType() {return externalType;} - - public void setExternalType(String externalType) {this.externalType = externalType;} - - public ExternalReference2 fromDataModel(Service entity) { - this.abbreviation = entity.getAbbreviation(); - this.created = entity.getCreated(); - this.id = entity.getId(); - this.label = entity.getLabel(); - this.name = entity.getLabel(); - this.modified = entity.getModified(); - this.uri = entity.getUri(); - String source = entity.getReference().substring(0, entity.getReference().indexOf(":")); - if (source.equals("dmp")) { - this.source = "Internal"; - } else { - this.source = source; - } - this.externalType = "services"; - return this; - } - - public ExternalReference2 fromDataModel(Registry entity) { - this.id = entity.getId(); - this.abbreviation = entity.getAbbreviation(); - this.created = entity.getCreated(); - this.label = entity.getLabel(); - this.name = entity.getLabel(); - this.modified = entity.getModified(); - this.uri = entity.getUri(); - String source1 = entity.getReference().substring(0, entity.getReference().indexOf(":")); - if (source1.equals("dmp")) { - this.source = "Internal"; - } else { - this.source = source1; - } - this.reference = entity.getReference(); - this.externalType = "registries"; - return this; - } - - public Service toDataModelService() throws Exception { - Service service = new Service(); - service.setId(this.id != null ? this.id : UUID.randomUUID()); - service.setAbbreviation(this.abbreviation); - service.setCreated(this.created != null ? this.created : new Date()); - service.setLabel(this.label != null ? this.label : this.name); - service.setModified(new Date()); - service.setUri(this.uri); - if (this.source == null) this.source = "dmp"; - if (this.reference == null) this.reference = service.getId().toString(); - if (this.source.equals(this.reference.substring(0, this.source.length()))) { - service.setReference(this.reference); - } else { - service.setReference(this.source + ":" + this.reference); - } - service.setModified(new Date()); - service.setStatus((short) 0); - service.setCreationUser(new UserInfo()); - return service; - } - - public Registry toDataModelRegistry() throws Exception { - Registry registry = new Registry(); - registry.setAbbreviation(this.abbreviation); - registry.setCreated(this.created != null ? this.created : new Date()); - registry.setId(this.id != null ? this.id : UUID.randomUUID()); - registry.setLabel(this.label != null ? this.label : this.name); - registry.setUri(this.uri); - registry.setModified(new Date()); - if (this.source == null) this.source = "dmp"; - if (this.source.equals(registry.getId().toString().substring(0, this.source.length()))) { - registry.setReference(registry.getId().toString()); - } else { - registry.setReference(this.source + ":" + registry.getId()); - } - registry.setStatus((short)0); - registry.setCreationUser(new UserInfo()); - return registry; - } - - public String getHint() { - return null; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java similarity index 73% rename from dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference.java rename to dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java index 6bb6446ff..4e3c785fe 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/ExternalReference.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java @@ -4,7 +4,7 @@ import eu.eudat.data.old.*; import java.util.Map; -public class ExternalReference { +public class FetcherExternalReference { private String id; private String name; @@ -133,28 +133,28 @@ public class ExternalReference { this.tag = tag; } - public static ExternalReference fromRemoteModel(Map data) { - ExternalReference externalReference = new ExternalReference(); - if (data == null) return externalReference; + public static FetcherExternalReference fromRemoteModel(Map data) { + FetcherExternalReference fetcherExternalReference = new FetcherExternalReference(); + if (data == null) return fetcherExternalReference; - externalReference.setId(data.getOrDefault("id", null)); - externalReference.setName(data.getOrDefault("name", null)); - externalReference.setPid(data.getOrDefault("pid", null)); - externalReference.setPidTypeField(data.getOrDefault("pidTypeField", null)); - externalReference.setUri(data.getOrDefault("uri", null)); - externalReference.setDescription(data.getOrDefault("description", null)); - externalReference.setSource(data.getOrDefault("source", null)); - externalReference.setCount(data.getOrDefault("count", null)); - externalReference.setPath(data.getOrDefault("path", null)); - externalReference.setHost(data.getOrDefault("host", null)); - externalReference.setTypes(data.getOrDefault("types", null)); - externalReference.setFirstName(data.getOrDefault("firstName", null)); - externalReference.setLastName(data.getOrDefault("lastName", null)); - externalReference.setTag(data.getOrDefault("tag", null)); - return externalReference; + fetcherExternalReference.setId(data.getOrDefault("id", null)); + fetcherExternalReference.setName(data.getOrDefault("name", null)); + fetcherExternalReference.setPid(data.getOrDefault("pid", null)); + fetcherExternalReference.setPidTypeField(data.getOrDefault("pidTypeField", null)); + fetcherExternalReference.setUri(data.getOrDefault("uri", null)); + fetcherExternalReference.setDescription(data.getOrDefault("description", null)); + fetcherExternalReference.setSource(data.getOrDefault("source", null)); + fetcherExternalReference.setCount(data.getOrDefault("count", null)); + fetcherExternalReference.setPath(data.getOrDefault("path", null)); + fetcherExternalReference.setHost(data.getOrDefault("host", null)); + fetcherExternalReference.setTypes(data.getOrDefault("types", null)); + fetcherExternalReference.setFirstName(data.getOrDefault("firstName", null)); + fetcherExternalReference.setLastName(data.getOrDefault("lastName", null)); + fetcherExternalReference.setTag(data.getOrDefault("tag", null)); + return fetcherExternalReference; } - public ExternalReference fromDataRepository(DataRepository entity) { + public FetcherExternalReference fromDataRepository(DataRepository entity) { // this.setAbbreviation(entity.getAbbreviation()); this.setName(entity.getLabel()); this.setUri(entity.getUri()); @@ -169,7 +169,7 @@ public class ExternalReference { return this; } - public ExternalReference fromRegistry(Registry entity){ + public FetcherExternalReference fromRegistry(Registry entity){ this.id = entity.getId().toString(); // this.abbreviation = entity.getAbbreviation(); // this.created = entity.getCreated(); @@ -186,7 +186,7 @@ public class ExternalReference { // this.reference = entity.getReference(); return this; } - public ExternalReference fromService(Service entity) { + public FetcherExternalReference fromService(Service entity) { // this.abbreviation = entity.getAbbreviation(); // this.created = entity.getCreated(); this.id = entity.getId().toString(); @@ -203,7 +203,7 @@ public class ExternalReference { return this; } - public ExternalReference fromResearcher(Researcher entity){ + public FetcherExternalReference fromResearcher(Researcher entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String refParts[] = entity.getReference().split(":"); @@ -216,7 +216,7 @@ public class ExternalReference { return this; } - public ExternalReference fromOrganisation(Organisation entity){ + public FetcherExternalReference fromOrganisation(Organisation entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String refParts[] = entity.getReference().split(":"); @@ -229,7 +229,7 @@ public class ExternalReference { return this; } - public ExternalReference fromDataset(ExternalDataset entity){ + public FetcherExternalReference fromDataset(ExternalDataset entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String source1 = entity.getReference().substring(0, entity.getReference().indexOf(":")); diff --git a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts index 96cf86f17..d8c82574d 100644 --- a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts +++ b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts @@ -60,7 +60,7 @@ export class ExternalSourcesService { } public listExternal(externalType: ExternalReferencesType, query: string, type: string): Observable { - const url = this.configurationService.server + `external-references/${externalType}`; + const url = this.configurationService.server + `external-references/search/${externalType}`; const options = { params: { query: query, type: type } }; return this.http.get(url, options); From 1b66d19bdebe49f723d7824ba3a22f94d401759c Mon Sep 17 00:00:00 2001 From: amentis Date: Wed, 25 Oct 2023 13:01:09 +0300 Subject: [PATCH 05/25] rename frontend external reference to fetcher external reference --- .../external-reference/external-reference.ts | 5 +--- .../external-sources.service.ts | 6 ++--- .../form-field/form-field.component.ts | 24 +++++++++---------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts b/dmp-frontend/src/app/core/model/external-reference/external-reference.ts index 031e03161..82d264c65 100644 --- a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts +++ b/dmp-frontend/src/app/core/model/external-reference/external-reference.ts @@ -1,10 +1,7 @@ -export interface ExternalReference { +export interface FetcherExternalReference { id: string; name: string; - abbreviation: string; pid: string; - originalId: string; - key: string; pidTypeField: string; uri: string; description: string; diff --git a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts index d8c82574d..e3b42585b 100644 --- a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts +++ b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts @@ -14,7 +14,7 @@ import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; import { LicenseCriteria } from '@app/core/query/license/license-criteria'; import {PublicationCriteria} from "@app/core/query/publication/publication-criteria"; -import { ExternalReference } from '@app/core/model/external-reference/external-reference'; +import { FetcherExternalReference } from '@app/core/model/external-reference/external-reference'; import { ExternalReferencesType } from '@app/core/common/enum/external-references-type'; @Injectable() export class ExternalSourcesService { @@ -59,11 +59,11 @@ export class ExternalSourcesService { return this.http.get(this.actionUrl + 'licenses' + '?query=' + requestItem.criteria.like + '&type=' + requestItem.criteria.type, { headers: this.headers }); } - public listExternal(externalType: ExternalReferencesType, query: string, type: string): Observable { + public listExternal(externalType: ExternalReferencesType, query: string, type: string): Observable { const url = this.configurationService.server + `external-references/search/${externalType}`; const options = { params: { query: query, type: type } }; - return this.http.get(url, options); + return this.http.get(url, options); } public searchDatasetTags(requestItem: RequestItem): Observable { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts index f147d095e..222299821 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts @@ -48,7 +48,7 @@ import {MatDialog} from "@angular/material/dialog"; import {HttpError} from "@common/modules/errors/error-handling/http-error-handling.service"; import {HttpErrorResponse} from "@angular/common/http"; import * as FileSaver from "file-saver"; -import { ExternalReference } from '@app/core/model/external-reference/external-reference'; +import { FetcherExternalReference } from '@app/core/model/external-reference/external-reference'; import { ExternalReferencesType } from '@app/core/common/enum/external-references-type'; @Component({ @@ -464,7 +464,7 @@ export class FormFieldComponent extends BaseComponent implements OnInit { } } - searchDatasetExternalDatasets(query: string): Observable { + searchDatasetExternalDatasets(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new ExternalDatasetCriteria(); requestItem.criteria.like = query; @@ -473,42 +473,42 @@ export class FormFieldComponent extends BaseComponent implements OnInit { return this.externalSourcesService.listExternal(ExternalReferencesType.Datasets, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalDataRepositories(query: string): Observable { + searchDatasetExternalDataRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; return this.externalSourcesService.listExternal(ExternalReferencesType.DataRepositories, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalPubRepositories(query: string): Observable { + searchDatasetExternalPubRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; return this.externalSourcesService.listExternal(ExternalReferencesType.PubRepositories, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalJournalRepositories(query: string): Observable { + searchDatasetExternalJournalRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; return this.externalSourcesService.listExternal(ExternalReferencesType.Journals, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalTaxonomies(query: string): Observable { + searchDatasetExternalTaxonomies(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new TaxonomyCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; return this.externalSourcesService.listExternal(ExternalReferencesType.Taxonomies, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalLicences(query: string): Observable { + searchDatasetExternalLicences(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new LicenseCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; return this.externalSourcesService.listExternal(ExternalReferencesType.Licenses, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalPublications(query: string): Observable { + searchDatasetExternalPublications(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new PublicationCriteria(); requestItem.criteria.like = query; @@ -516,7 +516,7 @@ export class FormFieldComponent extends BaseComponent implements OnInit { return this.externalSourcesService.listExternal(ExternalReferencesType.Publications, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalRegistries(query: string): Observable { + searchDatasetExternalRegistries(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new RegistryCriteria(); requestItem.criteria.like = query; @@ -524,7 +524,7 @@ export class FormFieldComponent extends BaseComponent implements OnInit { return this.externalSourcesService.listExternal(ExternalReferencesType.Registries, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalServices(query: string): Observable { + searchDatasetExternalServices(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new ServiceCriteria(); requestItem.criteria.like = query; @@ -591,12 +591,12 @@ export class FormFieldComponent extends BaseComponent implements OnInit { } } - filterOrganisations(value: string): Observable { + filterOrganisations(value: string): Observable { //return this.externalSourcesService.searchDMPOrganizations(value); return this.externalSourcesService.listExternal(ExternalReferencesType.Organizations, value, ''); } - filterResearchers(value: string): Observable { + filterResearchers(value: string): Observable { //return this.externalSourcesService.searchDMPResearchers({ criteria: { name: value, like: null } }); return this.externalSourcesService.listExternal(ExternalReferencesType.Researcher, value, ''); } From c169a103b7c721db56701d583296b14fa860ce58 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Wed, 25 Oct 2023 14:49:37 +0300 Subject: [PATCH 06/25] Updating censors for dmp and description entities --- .../eu/eudat/model/censorship/DescriptionCensor.java | 10 +++++++++- .../main/java/eu/eudat/model/censorship/DmpCensor.java | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 3b1bb2a92..15ee3aae7 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 @@ -2,7 +2,9 @@ package eu.eudat.model.censorship; import eu.eudat.authorization.Permission; import eu.eudat.convention.ConventionService; +import eu.eudat.model.Description; import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.logging.DataLogEntry; import gr.cite.tools.logging.LoggerService; @@ -21,9 +23,12 @@ public class DescriptionCensor extends BaseCensor { protected final AuthorizationService authService; - public DescriptionCensor(ConventionService conventionService, AuthorizationService authService) { + protected final CensorFactory censorFactory; + + public DescriptionCensor(ConventionService conventionService, AuthorizationService authService, CensorFactory censorFactory) { super(conventionService); this.authService = authService; + this.censorFactory = censorFactory; } public void censor(FieldSet fields, UUID userId) { @@ -32,6 +37,9 @@ public class DescriptionCensor extends BaseCensor { return; this.authService.authorizeForce(Permission.BrowseDescription); + + FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(Description._dmp)); + this.censorFactory.censor(DmpCensor.class).censor(dmpFields, 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 11b50eb24..216572666 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 @@ -2,6 +2,7 @@ package eu.eudat.model.censorship; import eu.eudat.authorization.Permission; import eu.eudat.convention.ConventionService; +import eu.eudat.model.Dmp; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.fieldset.FieldSet; @@ -21,6 +22,7 @@ public class DmpCensor extends BaseCensor { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpCensor.class)); protected final AuthorizationService authService; + protected final CensorFactory censorFactory; public DmpCensor(ConventionService conventionService, @@ -37,6 +39,9 @@ public class DmpCensor extends BaseCensor { return; this.authService.authorizeForce(Permission.BrowseDmp); + + FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpDescriptions)); + this.censorFactory.censor(DescriptionCensor.class).censor(dmpDescriptionsFields, userId); } } From 9a78d98751ed01c40650b84c87ee22b3250c1472 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Wed, 25 Oct 2023 16:55:10 +0300 Subject: [PATCH 07/25] Updating permissions.yml for dmps, entity_dois and descriptions --- .../src/main/resources/config/permissions.yml | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/dmp-backend/web/src/main/resources/config/permissions.yml b/dmp-backend/web/src/main/resources/config/permissions.yml index 5d5428d03..de2ec5149 100644 --- a/dmp-backend/web/src/main/resources/config/permissions.yml +++ b/dmp-backend/web/src/main/resources/config/permissions.yml @@ -68,6 +68,26 @@ permissions: clients: [ ] allowAnonymous: true allowAuthenticated: true + # Description + BrowseDescription: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditDescription: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteDescription: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # DescriptionTemplateType BrowseDescriptionTemplateType: roles: @@ -88,6 +108,26 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + # Dmp + BrowseDmp: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditDmp: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteDmp: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # DmpBlueprint BrowseDmpBlueprint: roles: @@ -127,6 +167,26 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + # EntityDoi + BrowseEntityDoi: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditEntityDoi: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteEntityDoi: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # ViewPage Permissions ViewDescriptionTemplateTypePage: From 032b30ed04a695fec48ce4188277f11a2e27b47d Mon Sep 17 00:00:00 2001 From: amentis Date: Wed, 25 Oct 2023 17:37:37 +0300 Subject: [PATCH 08/25] add DmpExternalReference to DmpBlueprint --- .../java/eu/eudat/model/DmpBlueprint.java | 12 +++++++ .../model/builder/DmpBlueprintBuilder.java | 33 ++++++++++++++++++- .../model/censorship/DmpBlueprintCensor.java | 2 ++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java index 53ca6fa82..f9acb6798 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java @@ -5,6 +5,7 @@ import eu.eudat.commons.enums.IsActive; import eu.eudat.model.dmpblueprintdefinition.Definition; import java.time.Instant; +import java.util.List; import java.util.UUID; public class DmpBlueprint { @@ -33,6 +34,9 @@ public class DmpBlueprint { public final static String _hash = "hash"; private String hash; + public static final String _dmpExternalReferences = "dmpExternalReferences"; + private List dmpExternalReferences; + public UUID getId() { return id; } @@ -96,6 +100,14 @@ public class DmpBlueprint { public void setDefinition(Definition definition) { this.definition = definition; } + + public List getDmpExternalReferences() { + return dmpExternalReferences; + } + + public void setDmpExternalReferences(List dmpExternalReferences) { + this.dmpExternalReferences = dmpExternalReferences; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java index 46194e84c..38cb8584f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java @@ -6,9 +6,14 @@ import eu.eudat.commons.types.dmpblueprint.DefinitionEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpBlueprintEntity; import eu.eudat.model.DmpBlueprint; +import eu.eudat.model.DmpExternalReference; +import eu.eudat.model.ExternalReference; import eu.eudat.model.builder.dmpblueprintdefinition.DefinitionBuilder; +import eu.eudat.query.DmpExternalReferenceQuery; 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.fieldset.FieldSet; import gr.cite.tools.logging.DataLogEntry; import gr.cite.tools.logging.LoggerService; @@ -19,21 +24,24 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.*; +import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class DmpBlueprintBuilder extends BaseBuilder { private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; private final XmlHandlingService xmlHandlingService; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public DmpBlueprintBuilder( ConventionService conventionService, - BuilderFactory builderFactory, XmlHandlingService xmlHandlingService) { + BuilderFactory builderFactory, QueryFactory queryFactory, XmlHandlingService xmlHandlingService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpBlueprintBuilder.class))); this.builderFactory = builderFactory; + this.queryFactory = queryFactory; this.xmlHandlingService = xmlHandlingService; } @@ -49,6 +57,9 @@ public class DmpBlueprintBuilder extends BaseBuilder(); FieldSet definitionFields = fields.extractPrefixed(this.asPrefix(DmpBlueprint._definition)); + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asPrefix(ExternalReference._dmpExternalReferences)); + Map> dmpExternalReferenceMap = this.collectDmpExternalReferences(dmpExternalReferencesFields, data); + List models = new ArrayList<>(); for (DmpBlueprintEntity d : data) { DmpBlueprint m = new DmpBlueprint(); @@ -63,9 +74,29 @@ public class DmpBlueprintBuilder extends BaseBuilder> collectDmpExternalReferences(FieldSet fields, List datas) throws MyApplicationException { + if (fields.isEmpty() || datas.isEmpty()) return null; + this.logger.debug("checking related - {}", DmpExternalReference.class.getSimpleName()); + + Map> itemMap = null; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpExternalReference._dmp, DmpBlueprint._id)); + DmpExternalReferenceQuery query = this.queryFactory.query(DmpExternalReferenceQuery.class).authorize(this.authorize).dmpIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpExternalReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); + + if (!fields.hasField(this.asIndexer(DmpExternalReference._dmp, DmpBlueprint._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDmp() != null).map(x -> { + x.getDmp().setId(null); + return x; + }).collect(Collectors.toList()); + } + return itemMap; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java index 538c8cd78..c5b1360fd 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java @@ -41,6 +41,8 @@ public class DmpBlueprintCensor extends BaseCensor { this.authService.authorizeForce(Permission.BrowseDmpBlueprint); FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(DmpBlueprint._definition)); this.censorFactory.censor(DefinitionCensor.class).censor(definitionFields, userId); + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(DmpBlueprint._dmpExternalReferences)); + this.censorFactory.censor(DmpExternalReferenceCensor.class).censor(dmpExternalReferencesFields, userId); } } From d1bac40f0f690523e0f250ce69d75b1d3b72162d Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 25 Oct 2023 17:47:48 +0300 Subject: [PATCH 09/25] more blueprint editor fixes --- .../src/app/core/core-service.module.ts | 4 +- .../services/dmp/dmp-blueprint.service.ts | 2 - .../services/utilities/enum-utils.service.ts | 26 + .../services/utilities/file-utils.service.ts | 24 + .../dataset-profile-editor.component.ts | 24 +- .../dataset-profile-listing.component.ts | 23 +- .../dmp-blueprint-editor.component.html | 310 ++-- .../dmp-blueprint-editor.component.scss | 8 +- .../editor/dmp-blueprint-editor.component.ts | 1242 ++++++++--------- .../dmp-blueprint-listing.component.ts | 21 +- .../user/listing/user-listing.component.ts | 24 +- .../ui/dashboard/drafts/drafts.component.ts | 163 +-- .../recent-edited-activity.component.ts | 183 ++- ...ecent-edited-dataset-activity.component.ts | 130 +- .../recent-edited-dmp-activity.component.ts | 145 +- .../dataset-wizard.component.ts | 30 +- .../dataset-listing-item.component.ts | 69 +- .../overview/dataset-overview.component.ts | 138 +- .../dmp-editor-blueprint.component.ts | 10 +- .../app/ui/dmp/editor/dmp-editor.component.ts | 36 +- .../dmp-listing-item.component.ts | 104 +- .../ui/dmp/overview/dmp-overview.component.ts | 190 ++- .../form-field/form-field.component.ts | 25 +- dmp-frontend/src/assets/i18n/en.json | 136 +- 24 files changed, 1425 insertions(+), 1642 deletions(-) create mode 100644 dmp-frontend/src/app/core/services/utilities/file-utils.service.ts diff --git a/dmp-frontend/src/app/core/core-service.module.ts b/dmp-frontend/src/app/core/core-service.module.ts index 9e8d69031..7de195b04 100644 --- a/dmp-frontend/src/app/core/core-service.module.ts +++ b/dmp-frontend/src/app/core/core-service.module.ts @@ -55,6 +55,7 @@ import { SupportiveMaterialService } from './services/supportive-material/suppor import { UserSettingsHttpService } from './services/user-settings/user-settings-http.service'; import { UserSettingsService } from './services/user-settings/user-settings.service'; import { QueryParamsService } from './services/utilities/query-params.service'; +import { FileUtils } from './services/utilities/file-utils.service'; // // // This is shared module that provides all the services. Its imported only once on the AppModule. @@ -128,7 +129,8 @@ export class CoreServiceModule { QueryParamsService, UserSettingsService, UserSettingsHttpService, - FilterService + FilterService, + FileUtils ], }; } diff --git a/dmp-frontend/src/app/core/services/dmp/dmp-blueprint.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp-blueprint.service.ts index 9e2b0474d..39a0017db 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp-blueprint.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp-blueprint.service.ts @@ -25,11 +25,9 @@ import { Observable, throwError } from 'rxjs'; @Injectable() export class DmpBlueprintService { - private actionUrl: string; private headers = new HttpHeaders(); constructor(private http: BaseHttpV2Service, private httpClient: HttpClient, private configurationService: ConfigurationService, private filterService: FilterService) { - this.actionUrl = configurationService.server + 'dmpprofile/'; } private get apiBase(): string { return `${this.configurationService.server}dmp-blueprint`; } diff --git a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts index 879ef1d9c..a0436f024 100644 --- a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts +++ b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts @@ -14,6 +14,7 @@ import { Role } from '@app/core/common/enum/role'; import { RoleOrganizationType } from '@app/core/common/enum/role-organization-type'; import { ViewStyleType } from '@app/ui/admin/dataset-profile/editor/components/field/view-style-enum'; import { DescriptionTemplateTypeStatus } from '@app/core/common/enum/description-template-type-status'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; @Injectable() export class EnumUtils { @@ -193,4 +194,29 @@ export class EnumUtils { case DescriptionTemplateTypeStatus.Finalized: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-TYPE-STATUS.FINALIZED'); } } + + toDmpBlueprintSystemFieldTypeString(status: DmpBlueprintSystemFieldType): string { + switch (status) { + case DmpBlueprintSystemFieldType.TEXT: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.TEXT'); + case DmpBlueprintSystemFieldType.HTML_TEXT: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.HTML_TEXT'); + case DmpBlueprintSystemFieldType.RESEARCHERS: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.RESEARCHERS'); + case DmpBlueprintSystemFieldType.ORGANIZATIONS: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.ORGANIZATIONS'); + case DmpBlueprintSystemFieldType.LANGUAGE: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.LANGUAGE'); + case DmpBlueprintSystemFieldType.CONTACT: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.CONTACT'); + case DmpBlueprintSystemFieldType.FUNDER: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.FUNDER'); + case DmpBlueprintSystemFieldType.GRANT: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.GRANT'); + case DmpBlueprintSystemFieldType.PROJECT: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.PROJECT'); + case DmpBlueprintSystemFieldType.LICENSE: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.LICENSE'); + case DmpBlueprintSystemFieldType.ACCESS_RIGHTS: return this.language.instant('TYPES.DMP-BLUEPRINT-SYSTEM-FIELD-TYPE.ACCESS_RIGHTS'); + } + } + + toDmpBlueprintExtraFieldDataTypeString(status: DmpBlueprintExtraFieldDataType): string { + switch (status) { + case DmpBlueprintExtraFieldDataType.Date: return this.language.instant('TYPES.DMP-BLUEPRINT-EXTRA-FIELD-DATA-TYPE.DATE'); + case DmpBlueprintExtraFieldDataType.Number: return this.language.instant('TYPES.DMP-BLUEPRINT-EXTRA-FIELD-DATA-TYPE.NUMBER'); + case DmpBlueprintExtraFieldDataType.Text: return this.language.instant('TYPES.DMP-BLUEPRINT-EXTRA-FIELD-DATA-TYPE.TEXT'); + case DmpBlueprintExtraFieldDataType.ExternalAutocomplete: return this.language.instant('TYPES.DMP-BLUEPRINT-EXTRA-FIELD-DATA-TYPE.EXTERNAL-AUTOCOMPLETE'); + } + } } diff --git a/dmp-frontend/src/app/core/services/utilities/file-utils.service.ts b/dmp-frontend/src/app/core/services/utilities/file-utils.service.ts new file mode 100644 index 000000000..2fd956963 --- /dev/null +++ b/dmp-frontend/src/app/core/services/utilities/file-utils.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class FileUtils { + constructor() { } + + getFilenameFromContentDispositionHeader(header: string): string { + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } +} diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index e46b8d802..95ca5fdc4 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -50,6 +50,7 @@ import { DescriptionTemplateType } from '@app/core/model/description-template-ty import { DescriptionTemplateTypeStatus } from '@app/core/common/enum/description-template-type-status'; import { DescriptionTemplateTypeLookup } from '@app/core/query/description-template-type.lookup'; import { nameof } from 'ts-simple-nameof'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -119,7 +120,8 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent private fb: UntypedFormBuilder, private sidenavService: SideNavService, private userService: UserService, - private descriptionTemplateTypeService: DescriptionTemplateTypeService + private descriptionTemplateTypeService: DescriptionTemplateTypeService, + private fileUtils: FileUtils ) { super(); // this.profileID = route.snapshot.params['id']; @@ -584,30 +586,12 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - getDescriptionTemplateTypes(): DescriptionTemplateType[] { let lookup: DescriptionTemplateTypeLookup = new DescriptionTemplateTypeLookup(); lookup.project = { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts index 70857dadb..f9181daab 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts @@ -16,11 +16,12 @@ import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { DatasetProfileCriteriaComponent } from '@app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component'; // import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { BaseComponent } from '@common/base/base.component'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; -import { Observable, merge as observableMerge, of as observableOf } from 'rxjs'; +import { Observable, merge as observableMerge } from 'rxjs'; import { map, startWith, switchMap, takeUntil } from 'rxjs/operators'; import { DialogConfirmationUploadDatasetProfiles } from './criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; @@ -55,6 +56,7 @@ export class DatasetProfileListingComponent extends BaseComponent implements OnI private matomoService: MatomoService, private dialog: MatDialog, private datasetProfileService: DatasetProfileService, + private fileUtils: FileUtils ) { super(); } @@ -160,28 +162,11 @@ export class DatasetProfileListingComponent extends BaseComponent implements OnI .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } deleteTemplate(id: string) { if (id) { diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html index 90843cf9f..5527b1612 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html @@ -23,7 +23,7 @@ -
+
- - Name - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -

Sections

+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.NAME' | translate}} + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+

{{'DMP-BLUEPRINT-EDITOR.FIELDS.SECTIONS' | translate}}

-
+
- Section {{sectionIndex + 1}} - drag_indicator +
+
+ {{'DMP-BLUEPRINT-EDITOR.FIELDS.SECTION-PREFIX' | translate}} {{sectionIndex + 1}} +
+
drag_indicator
+
+ delete +
+
-
+ +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.SECTION-NAME' | translate}} + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.SECTION-DESCRIPTION' | translate}} + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.SYSTEM-FIELDS' | translate}} + + {{enumUtils.toDmpBlueprintSystemFieldTypeString(systemFieldType)}} + + + +
+
+ +
- - Section name - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - Section description - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
-
+
+
-
-
-
- - System fields - - {{f.label}} - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
-
- -
+
+ {{fieldIndex + 1}}
-
- -
- -
-
-
-
-
-
-
- {{fieldIndex + 1}} -
-
- drag_indicator -
-
-
- - - -
- - System Field - - -
-
- - Label - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
-
- - Placeholder - - -
-
- - Description - - -
-
- Required -
-
- delete - {{'DMP-BLUEPRINT-EDITOR.STEPS.TOOLKIT.DELETE' | translate}} -
-
- - -
- - Type - - - {{getExtraFieldTypeValue(extraFieldType)}} - - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
-
- - Label - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
-
- - Placeholder - - -
-
- - Description - - -
-
- - Required - -
-
- delete - {{'DMP-BLUEPRINT-EDITOR.STEPS.TOOLKIT.DELETE' | translate}} -
-
- -
-
-
+
+ drag_indicator +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.SYSTEM-FIELD' | translate}} + + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.FIELD-DATA-TYPE' | translate}} + + + {{enumUtils.toDmpBlueprintExtraFieldDataTypeString(extraFieldDataType)}} + + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.FIELD-LABEL' | translate}} + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.FIELD-PLACEHOLDER' | translate}} + + +
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.FIELD-DESCRIPTION' | translate}} + + +
+
+ {{'DMP-BLUEPRINT-EDITOR.FIELDS.FIELD-REQUIRED' | translate}} +
+
+ delete + {{'DMP-BLUEPRINT-EDITOR.ACTIONS.REMOVE-SYSTEM-FIELD' | translate}} +
+
+ delete + {{'DMP-BLUEPRINT-EDITOR.ACTIONS.REMOVE-EXTRA-FIELD' | translate}}
-
-
+
-
+
- Description Templates + {{'DMP-BLUEPRINT-EDITOR.FIELDS.DESCRIPTION-TEMPLATES' | translate}}
- -
+
+
+
+ + {{'DMP-BLUEPRINT-EDITOR.FIELDS.DESCRIPTION-TEMPLATES' | translate}} + + + +
+
+
+
- - Label + + {{'DMP-BLUEPRINT-EDITOR.FIELDS.DESCRIPTION-TEMPLATE-LABEL' | translate}}
- - Min Multiplicity + + {{'DMP-BLUEPRINT-EDITOR.FIELDS.DESCRIPTION-TEMPLATE-MIN-MULTIPLICITY' | translate}}
- - Max Multiplicity + + {{'DMP-BLUEPRINT-EDITOR.FIELDS.DESCRIPTION-TEMPLATE-MAX-MULTIPLICITY' | translate}}
@@ -242,17 +203,7 @@
-
-
- -
- delete - {{'DMP-BLUEPRINT-EDITOR.STEPS.TOOLKIT.DELETE' | translate}} -
-
-
+
@@ -262,7 +213,7 @@
- +
@@ -281,5 +232,4 @@ -
- \ No newline at end of file +
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.scss b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.scss index fa59f8200..c2e33c533 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.scss @@ -89,10 +89,10 @@ .action-list-icon{ font-size: 1.2em; // padding-right: 1em; - width: 14px; - margin-right: 0.5em; - margin-left: -.09em; - height: auto; + // width: 14px; + // margin-right: 0.5em; + // margin-left: -.09em; + // height: auto; color: var(--primary-color); } 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 75f199026..b58df63a5 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 @@ -1,31 +1,45 @@ import { Component, OnInit } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { FormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; // import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { DatePipe } from '@angular/common'; +import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-field-type'; +import { DmpBlueprintSectionFieldCategory } from '@app/core/common/enum/dmp-blueprint-section-field-category'; +import { DmpBlueprintStatus } from '@app/core/common/enum/dmp-blueprint-status'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { IsActive } from '@app/core/common/enum/is-active.enum'; import { AppPermission } from '@app/core/common/enum/permission.enum'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; +import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; +import { DmpBlueprint, DmpBlueprintPersist } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; import { LoggingService } from '@app/core/services/logging/logging-service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; +import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; import { BaseEditor } from '@common/base/base-editor'; import { FormService } from '@common/forms/form-service'; +import { FormValidationErrorsDialogComponent } from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; import { FilterService } from '@common/modules/text-filter/filter-service'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { Observable } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; -import { DmpBlueprintEditorModel } from './dmp-blueprint-editor.model'; +import { DescriptionTemplatesInSectionEditorModel, DmpBlueprintDefinitionSectionEditorModel, DmpBlueprintEditorModel, FieldInSectionEditorModel } from './dmp-blueprint-editor.model'; import { DmpBlueprintEditorResolver } from './dmp-blueprint-editor.resolver'; import { DmpBlueprintEditorService } from './dmp-blueprint-editor.service'; -import { DmpBlueprint, DmpBlueprintPersist } from '@app/core/model/dmp-blueprint/dmp-blueprint'; -import { IsActive } from '@app/core/common/enum/is-active.enum'; -import { DmpBlueprintSectionFieldCategory } from '@app/core/common/enum/dmp-blueprint-section-field-category'; @Component({ @@ -40,8 +54,21 @@ export class DmpBlueprintEditorComponent extends BaseEditor = []; dmpBlueprintSectionFieldCategory = DmpBlueprintSectionFieldCategory; + dmpBlueprintSystemFieldType = DmpBlueprintSystemFieldType; + public dmpBlueprintSystemFieldTypeEnum = this.enumUtils.getEnumValues(DmpBlueprintSystemFieldType); + dmpBlueprintExtraFieldDataType = DmpBlueprintExtraFieldDataType; + public dmpBlueprintExtraFieldDataTypeEnum = this.enumUtils.getEnumValues(DmpBlueprintExtraFieldDataType); + blueprintsAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { + filterFn: this.filterDescriptionTempaltes.bind(this), + initialItems: (excludedItems: any[]) => this.filterDescriptionTempaltes('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), + displayFn: (item: DatasetProfileModel) => item.label, + titleFn: (item: DatasetProfileModel) => item.label, + subtitleFn: (item: DatasetProfileModel) => item.description, + popupItemActionIcon: 'visibility' + }; protected get canDelete(): boolean { return !this.isDeleted && !this.isNew && this.hasPermission(this.authService.permissionEnum.DeleteDmpBlueprint); @@ -77,12 +104,16 @@ export class DmpBlueprintEditorComponent extends BaseEditor { + section.get('ordinal').setValue(index + 1); + }); + } + + dropSections(event: CdkDragDrop) { + const sectionsFormArray = (this.formGroup.get('definition').get('sections') as FormArray); + + moveItemInArray(sectionsFormArray.controls, event.previousIndex, event.currentIndex); + sectionsFormArray.updateValueAndValidity(); + sectionsFormArray.controls.forEach((section, index) => { + section.get('ordinal').setValue(index + 1); + }); + } + + + // + // + // Fields + // + // + systemFieldDisabled(systemField: DmpBlueprintSystemFieldType) { + return (this.formGroup.get('definition').get('sections') as FormArray)?.controls.some(x => (x.get('fields') as FormArray).controls.some(y => (y as UntypedFormGroup).get('systemFieldType')?.value === systemField)); + // for (let section in (this.formGroup.get('definition').get('sections')as FormArray)?.controls) { + // if (i != sectionIndex) { + // for (let f of this.fieldsArray(i).controls) { + // if ((f.get('category').value == FieldCategory.SYSTEM || f.get('category').value == 'SYSTEM') && f.get('type').value == systemField) { + // return true; + // } + // } + // } + // i++; + // } + // return false; + } + + selectedSystemFieldDisabled(): Array { + return (this.formGroup.get('definition').get('sections') as FormArray)?.controls.flatMap(x => (x.get('fields') as FormArray).controls.map(y => (y as UntypedFormGroup).get('systemFieldType')?.value as DmpBlueprintSystemFieldType)); + } + + addSystemField(sectionIndex: number, systemFieldType: DmpBlueprintSystemFieldType): void { + const field: FieldInSectionEditorModel = new FieldInSectionEditorModel(); + field.id = Guid.create(); + field.ordinal = ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray).length + 1; + field.category = DmpBlueprintSectionFieldCategory.SYSTEM; + field.systemFieldType = systemFieldType; + field.required = (systemFieldType == DmpBlueprintSystemFieldType.TEXT || systemFieldType == DmpBlueprintSystemFieldType.HTML_TEXT) ? true : false; + ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray).push(field.buildForm()); //TODO: dtziotzios validation path + } + + removeSystemField(sectionIndex: number, fieldIndex: number): void { + const formArray = ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray); + formArray.removeAt(fieldIndex); + formArray.controls.forEach((section, index) => { + section.get('ordinal').setValue(index + 1); + }); + } + + addExtraField(sectionIndex: number): void { + const field: FieldInSectionEditorModel = new FieldInSectionEditorModel(); + field.id = Guid.create(); + field.ordinal = ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray).length + 1; + field.category = DmpBlueprintSectionFieldCategory.EXTRA; + ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray).push(field.buildForm()); //TODO: dtziotzios validation path + } + + removeExtraField(sectionIndex: number, fieldIndex: number): void { + const formArray = ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray); + formArray.removeAt(fieldIndex); + formArray.controls.forEach((section, index) => { + section.get('ordinal').setValue(index + 1); + }); + } + + + dropFields(event: CdkDragDrop, sectionIndex: number) { + const fieldsFormArray = ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('fields') as FormArray); + + moveItemInArray(fieldsFormArray.controls, event.previousIndex, event.currentIndex); + fieldsFormArray.updateValueAndValidity(); + fieldsFormArray.controls.forEach((section, index) => { + section.get('ordinal').setValue(index + 1); + }); + } + + // + // + // Autocomplete configuration + // + // + + filterDescriptionTempaltes(value: string): Observable { + const request = new DataTableRequest(null, null, { fields: ['+label'] }); + const criteria = new DatasetProfileCriteria(); + criteria.like = value; + request.criteria = criteria; + return this.dmpService.searchDmpBlueprints(request); + } + + onRemoveDescritionTemplate(event, sectionIndex: number) { + const descriptionTemplateFormArray = (this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('descriptionTemplates') as FormArray; + const foundIndex = descriptionTemplateFormArray.controls.findIndex(blueprint => blueprint.get('descriptionTemplateId').value === event.id); + if (foundIndex !== -1) { + descriptionTemplateFormArray.removeAt(foundIndex); + } + } + + onSelectDescritionTemplate(item, sectionIndex) { + const descriptionTemplate: DescriptionTemplatesInSectionEditorModel = new DescriptionTemplatesInSectionEditorModel(); + descriptionTemplate.id = Guid.create(); + descriptionTemplate.descriptionTemplateId = item.id; + descriptionTemplate.label = item.label; + ((this.formGroup.get('definition').get('sections') as FormArray).at(sectionIndex).get('descriptionTemplates') as FormArray).push(descriptionTemplate.buildForm()); //TODO: dtziotzios validation path + } + + // ngAfterViewInit() { + + + + // this.route.params + // .pipe(takeUntil(this._destroyed)) + // .subscribe((params: Params) => { + // this.dmpBlueprintId = params['id']; + // const cloneId = params['cloneid']; + + // if (this.dmpBlueprintId != null) { + // this.isNew = false; + // this.dmpBlueprintService.getSingleBlueprint(this.dmpBlueprintId).pipe(map(data => data as any)) + // .pipe(takeUntil(this._destroyed)) + // .subscribe(data => { + // this.dmpBlueprintEditor = new DmpBlueprintEditor().fromModel(data); + // this.formGroup = this.dmpBlueprintEditor.buildForm(); + // this.buildSystemFields(); + // this.fillDescriptionTemplatesInMultAutocomplete(); + // if (this.dmpBlueprintEditor.status == DmpBlueprintStatus.Finalized) { + // this.formGroup.disable(); + // this.viewOnly = true + // } + // // this.breadCrumbs = observableOf([{ + // // parentComponentName: 'DmpBlueprintListingComponent', + // // label: this.language.instant('NAV-BAR.TEMPLATE'), + // // url: '/dmp-blueprints/' + this.dmpBlueprintId + // // }]); + // }); + // } else if (cloneId != null) { + // this.isClone = true; + // this.dmpBlueprintService.clone(cloneId).pipe(map(data => data as any), takeUntil(this._destroyed)) + // .subscribe( + // data => { + // this.dmpBlueprintEditor = new DmpBlueprintEditor().fromModel(data); + // this.dmpBlueprintEditor.id = null; + // this.dmpBlueprintEditor.status = DmpBlueprintStatus.Draft; + // this.formGroup = this.dmpBlueprintEditor.buildForm(); + // this.buildSystemFields(); + // this.fillDescriptionTemplatesInMultAutocomplete(); + // }, + // error => this.onCallbackError(error) + // ); + // } else { + // this.dmpBlueprintEditorModel = new DmpBlueprintEditorModel(); + // this.dmpBlueprintEditor = new DmpBlueprintEditor(); + // setTimeout(() => { + // // this.formGroup = this.dmpBlueprintModel.buildForm(); + // // this.addField(); + // this.dmpBlueprintEditor.status = DmpBlueprintStatus.Draft; + // this.formGroup = this.dmpBlueprintEditor.buildForm(); + // }); + // // this.breadCrumbs = observableOf([{ + // // parentComponentName: 'DmpBlueprintListingComponent', + // // label: this.language.instant('NAV-BAR.TEMPLATE'), + // // url: '/dmp-blueprints/' + this.dmpBlueprintId + // // }]); + // } + // }); + + // } + + // buildSystemFields() { + // const sections = this.sectionsArray().controls.length; + // for (let i = 0; i < sections; i++) { + // let systemFieldsInSection = new Array(); + // this.fieldsArray(i).controls.forEach((field) => { + // if ((field.get('category').value == FieldCategory.SYSTEM || field.get('category').value == 'SYSTEM')) { + // systemFieldsInSection.push(this.fieldList.find(f => f.type == field.get('type').value).type); + // } + // }) + // this.systemFieldListPerSection.push(systemFieldsInSection); + // } + // } + + // fillDescriptionTemplatesInMultAutocomplete() { + // const sections = this.sectionsArray().controls.length; + // for (let i = 0; i < sections; i++) { + // let descriptionTemplatesInSection = new Array(); + // this.descriptionTemplatesArray(i).controls.forEach((template) => { + // descriptionTemplatesInSection.push({ id: template.value.descriptionTemplateId, label: template.value.label, description: "" }); + // }) + // this.descriptionTemplatesPerSection.push(descriptionTemplatesInSection); + // } + // } + + // checkForProfiles(event, sectionIndex: number) { + // if (event.checked === false) { + // this.descriptionTemplatesPerSection[sectionIndex] = new Array(); + // this.descriptionTemplatesArray(sectionIndex).clear(); + // } + // } + + + + // sectionsArray(): UntypedFormArray { + // //return this.dmpBlueprintsFormGroup.get('sections') as FormArray; + // return this.formGroup.get('definition').get('sections') as UntypedFormArray; + // } + + + // fieldsArray(sectionIndex: number): UntypedFormArray { + // return this.sectionsArray().at(sectionIndex).get('fields') as UntypedFormArray; + // } + + + + // removeField(sectionIndex: number, fieldIndex: number): void { + // this.fieldsArray(sectionIndex).removeAt(fieldIndex); + // } + + // systemFieldsArray(sectionIndex: number): UntypedFormArray { + // return this.sectionsArray().at(sectionIndex).get('systemFields') as UntypedFormArray; + // } + + // initSystemField(systemField?: SystemFieldType): UntypedFormGroup { + // return this.fb.group({ + // id: this.fb.control(Guid.create().toString()), + // type: this.fb.control(systemField), + // label: this.fb.control(''), + // placeholder: this.fb.control(''), + // description: this.fb.control(''), + // required: this.fb.control(true), + // ordinal: this.fb.control('') + // }); + // } + + // addSystemField(sectionIndex: number, systemField?: SystemFieldType): void { + // this.addField(sectionIndex, FieldCategory.SYSTEM, systemField); + // } + + // transfromEnumToString(type: SystemFieldType): string { + // return this.fieldList.find(f => f.type == type).label; + // } + + // selectedFieldType(type: SystemFieldType, sectionIndex: number): void { + // let index = this.systemFieldListPerSection[sectionIndex].indexOf(type); + // if (index == -1) { + // this.systemFieldListPerSection[sectionIndex].push(type); + // this.addSystemField(sectionIndex, type); + // } + // else { + // this.systemFieldListPerSection[sectionIndex].splice(index, 1); + // this.removeSystemField(sectionIndex, type); + // } + // } + + + + // descriptionTemplatesArray(sectionIndex: number): UntypedFormArray { + // return this.sectionsArray().at(sectionIndex).get('descriptionTemplates') as UntypedFormArray; + // } + + // addDescriptionTemplate(descriptionTemplate, sectionIndex: number): void { + // this.descriptionTemplatesArray(sectionIndex).push(this.fb.group({ + // label: this.fb.control(descriptionTemplate.value) + // })); + // } + + // removeDescriptionTemplate(sectionIndex: number, templateIndex: number): void { + // this.descriptionTemplatesArray(sectionIndex).removeAt(templateIndex); + // } + + // extraFieldsArray(sectionIndex: number): UntypedFormArray { + // return this.sectionsArray().at(sectionIndex).get('extraFields') as UntypedFormArray; + // } + + + + + + + + // getExtraFieldTypes(): Number[] { + // let keys: string[] = Object.keys(ExtraFieldType); + // keys = keys.slice(0, keys.length / 2); + // const values: Number[] = keys.map(Number); + // return values; + // } + + // getExtraFieldTypeValue(extraFieldType: ExtraFieldType): string { + // switch (extraFieldType) { + // case ExtraFieldType.TEXT: return 'Text'; + // case ExtraFieldType.RICH_TEXT: return 'Rich Text'; + // case ExtraFieldType.DATE: return 'Date'; + // case ExtraFieldType.NUMBER: return 'Number'; + // } + // } + + + + // moveItemInFormArray(formArray: UntypedFormArray, fromIndex: number, toIndex: number): void { + // const dir = toIndex > fromIndex ? 1 : -1; + + // const item = formArray.at(fromIndex); + // for (let i = fromIndex; i * dir < toIndex * dir; i = i + dir) { + // const current = formArray.at(i + dir); + // formArray.setControl(i, current); + // } + // formArray.setControl(toIndex, item); + // } + + // // clearForm(): void{ + // // this.dmpBlueprintsFormGroup.reset(); + // // } + + + + // // onPreviewTemplate(event, sectionIndex: number) { + // // const dialogRef = this.dialog.open(DatasetPreviewDialogComponent, { + // // width: '590px', + // // minHeight: '200px', + // // restoreFocus: false, + // // data: { + // // template: event + // // }, + // // panelClass: 'custom-modalbox' + // // }); + // // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + // // if (result) { + // // let blueprints = this.sectionsArray().at(sectionIndex).get('descriptionTemplates').value;//this.formGroup.get('blueprints').value; + // // const blueprint: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor(); + // // blueprint.id = Guid.create().toString(); + // // blueprint.descriptionTemplateId = event.id; + // // blueprint.label = event.label; + // // blueprints.push(blueprint.buildForm()); + // // this.sectionsArray().at(sectionIndex).get('descriptionTemplates').setValue(blueprints);//this.formGroup.get('blueprints').setValue(blueprints); + // // this.blueprintsAutoCompleteConfiguration = { + // // filterFn: this.filterProfiles.bind(this), + // // initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), + // // displayFn: (item) => item['label'], + // // titleFn: (item) => item['label'], + // // subtitleFn: (item) => item['description'], + // // popupItemActionIcon: 'visibility' + // // }; + // // } + // // }); + // // } + + + + checkValidity() { + this.formService.touchAllFormFields(this.formGroup); + if (!this.isFormValid()) { return false; } + let errorMessages = []; + if (!this.hasTitle()) { + errorMessages.push("Title should be set."); + } + if (!this.hasDescription()) { + errorMessages.push("Description should be set."); + } + if (!this.hasDescriptionTemplates()) { + errorMessages.push("At least one section should have description templates."); + } + if (errorMessages.length > 0) { + this.showValidationErrorsDialog(undefined, errorMessages); + return false; + } + return true; + } + + // formSubmit(): void { + // if (this.checkValidity()) + // this.onSubmit(); + // } + + // public isFormValid() { + // return this.formGroup.valid; + // } + + hasTitle(): boolean { + const dmpBlueprint: DmpBlueprintPersist = this.formGroup.value; + return dmpBlueprint.definition.sections.some(section => section.fields.some(field => (field.category === DmpBlueprintSectionFieldCategory.SYSTEM || field.category as unknown === 'SYSTEM') && field.systemFieldType === DmpBlueprintSystemFieldType.TEXT)); + } + + hasDescription(): boolean { + const dmpBlueprint: DmpBlueprintPersist = this.formGroup.value; + return dmpBlueprint.definition.sections.some(section => section.fields.some(field => (field.category === DmpBlueprintSectionFieldCategory.SYSTEM || field.category as unknown === 'SYSTEM') && field.systemFieldType === DmpBlueprintSystemFieldType.HTML_TEXT)); + } + + hasDescriptionTemplates(): boolean { + const dmpBlueprint: DmpBlueprintPersist = this.formGroup.value; + return dmpBlueprint.definition.sections.some(section => section.hasTemplates == true); + } + + private showValidationErrorsDialog(projectOnly?: boolean, errmess?: string[]) { + + const dialogRef = this.dialog.open(FormValidationErrorsDialogComponent, { + disableClose: true, + autoFocus: false, + restoreFocus: false, + data: { + errorMessages: errmess, + projectOnly: projectOnly + }, + }); + + } + + // onSubmit(): void { + // this.dmpBlueprintService.createBlueprint(this.formGroup.value) + // .pipe(takeUntil(this._destroyed)) + // .subscribe( + // complete => this.onCallbackSuccess(), + // error => this.onCallbackError(error) + // ); + // } + + // onCallbackSuccess(): void { + // this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); + // this.router.navigate(['/dmp-blueprints']); + // } + + // onCallbackError(errorResponse: any) { + // this.setErrorModel(errorResponse.error); + // this.formService.validateAllFormFields(this.formGroup); + // } + + // public setErrorModel(validationErrorModel: ValidationErrorModel) { + // Object.keys(validationErrorModel).forEach(item => { + // (this.dmpBlueprintEditor.validationErrorModel)[item] = (validationErrorModel)[item]; + // }); + // } + + public cancel(): void { + this.router.navigate(['/dmp-blueprints']); + } + + // // addField() { + // // (this.formGroup.get('definition').get('fields')).push(new DmpBlueprintFieldEditorModel().buildForm()); + // // } + + // // removeField(index: number) { + // // (this.formGroup.get('definition').get('fields')).controls.splice(index, 1); + // // } + + // getDmpBlueprintFieldDataTypeValues(): Number[] { + // let keys: string[] = Object.keys(DmpBlueprintFieldDataType); + // keys = keys.slice(0, keys.length / 2); + // const values: Number[] = keys.map(Number); + // return values; + // } + + // getDmpBlueprintFieldDataTypeWithLanguage(fieldType: DmpBlueprintFieldDataType): string { + // let result = ''; + // this.language.get(this.enumUtils.toDmpBlueprintFieldDataTypeString(fieldType)) + // .pipe(takeUntil(this._destroyed)) + // .subscribe((value: string) => { + // result = value; + // }); + // return result; + // } + + // getDmpBlueprintFieldTypeValues(): Number[] { + // let keys: string[] = Object.keys(DmpBlueprintType); + // keys = keys.slice(0, keys.length / 2); + // const values: Number[] = keys.map(Number); + // return values; + // } + + // getDmpBlueprintFieldTypeWithLanguage(blueprintType: DmpBlueprintType): string { + // let result = ''; + // this.language.get(this.enumUtils.toDmpBlueprintTypeString(blueprintType)) + // .pipe(takeUntil(this._destroyed)) + // .subscribe((value: string) => { + // result = value; + // }); + // return result; + // } + + // delete() { + // this.dialog.open(ConfirmationDialogComponent, { + // data: { + // isDeleteConfirmation: true, + // confirmButton: this.language.instant('DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.CONFIRM-BUTTON'), + // cancelButton: this.language.instant("DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.CANCEL-BUTTON"), + // message: this.language.instant("DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.MESSAGE") + // } + // }) + // .afterClosed() + // .subscribe( + // confirmed => { + // if (confirmed) { + // if (this.formGroup.get('status').value == DmpBlueprintStatus.Draft) { + // // this.formGroup.get('status').setValue(DmpBlueprintStatus.Deleted); + // this.dmpBlueprintService.createBlueprint(this.formGroup.value) + // .pipe(takeUntil(this._destroyed)) + // .subscribe( + // complete => this.onCallbackSuccess(), + // error => this.onCallbackError(error) + // ); + // } + // else { + // // this.dmpBlueprintService.delete(this.dmpBlueprintId) + // // .pipe(takeUntil(this._destroyed)) + // // .subscribe( + // // complete => this.onCallbackSuccess(), + // // error => { + // // if (error.error.statusCode == 674) { + // // this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DMP-BLUEPRINT-DELETE'), SnackBarNotificationLevel.Error); + // // } else { + // // this.uiNotificationService.snackBarNotification(this.language.instant(error.message), SnackBarNotificationLevel.Error); + // // } + // // } + // // ); + // } + // } + // } + // ) + + // } + + finalize() { + if (this.checkValidity()) { + this.formGroup.get('status').setValue(DmpBlueprintStatus.Finalized); + this.formSubmit(); + } + } + + downloadXML(): void { + const blueprintId = this.formGroup.get('id').value; + if (blueprintId == null) return; + this.dmpBlueprintService.downloadXML(blueprintId) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + // isExternalAutocomplete(formGroup: UntypedFormGroup) { + // if (formGroup.get('dataType').value == DmpBlueprintFieldDataType.ExternalAutocomplete) { + // this.addControl(formGroup); + // return true; + // } else { + // this.removeControl(formGroup); + // return false; + // } + // } + + // addControl(formGroup: UntypedFormGroup) { + // if (formGroup.get('dataType').value == 3) + // formGroup.addControl('externalAutocomplete', new DmpBlueprintExternalAutoCompleteFieldDataEditorModel().buildForm()); + // } + + // removeControl(formGroup: UntypedFormGroup) { + // if (formGroup.get('dataType').value != 3) + // formGroup.removeControl('externalAutocomplete'); + // } } - - -// extends BaseComponent implements AfterViewInit { - -// isNew = true; -// isClone = false; -// viewOnly = false; -// dmpBlueprintEditorModel = new DmpBlueprintEditorModel(); -// dmpBlueprintEditor = new DmpBlueprintEditor(); -// formGroup: UntypedFormGroup = null; -// host: string; -// dmpBlueprintId: string; -// // breadCrumbs: Observable; - -// dmpBlueprintsFormGroup: UntypedFormGroup = null; - -// blueprintsAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; - -// fieldList = [ -// { label: 'Title', type: SystemFieldType.TEXT }, -// { label: 'Description', type: SystemFieldType.HTML_TEXT }, -// { label: 'Researchers', type: SystemFieldType.RESEARCHERS }, -// { label: 'Organizations', type: SystemFieldType.ORGANIZATIONS }, -// { label: 'Language', type: SystemFieldType.LANGUAGE }, -// { label: 'Contact', type: SystemFieldType.CONTACT }, -// { label: 'Funder', type: SystemFieldType.FUNDER }, -// { label: 'Grant', type: SystemFieldType.GRANT }, -// { label: 'Project', type: SystemFieldType.PROJECT }, -// { label: 'License', type: SystemFieldType.LICENSE }, -// { label: 'Access Rights', type: SystemFieldType.ACCESS_RIGHTS } -// ]; -// systemFieldListPerSection: Array> = new Array(); -// descriptionTemplatesPerSection: Array> = new Array>(); - -// constructor( -// private dmpBlueprintService: DmpBlueprintService, -// private _service: DmpService, -// private route: ActivatedRoute, -// private router: Router, -// private language: TranslateService, -// private enumUtils: EnumUtils, -// private uiNotificationService: UiNotificationService, -// private formService: FormService, -// private fb: UntypedFormBuilder, -// private configurationService: ConfigurationService, -// private httpClient: HttpClient, -// private matomoService: MatomoService, -// private dialog: MatDialog -// ) { -// super(); -// this.host = configurationService.server; -// } - -// ngAfterViewInit() { -// this.matomoService.trackPageView('Admin: DMP Profile Edit'); - -// this.blueprintsAutoCompleteConfiguration = { -// filterFn: this.filterProfiles.bind(this), -// initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), -// displayFn: (item) => item['label'], -// titleFn: (item) => item['label'], -// subtitleFn: (item) => item['description'], -// popupItemActionIcon: 'visibility' -// }; - -// this.route.params -// .pipe(takeUntil(this._destroyed)) -// .subscribe((params: Params) => { -// this.dmpBlueprintId = params['id']; -// const cloneId = params['cloneid']; - -// if (this.dmpBlueprintId != null) { -// this.isNew = false; -// this.dmpBlueprintService.getSingleBlueprint(this.dmpBlueprintId).pipe(map(data => data as any)) -// .pipe(takeUntil(this._destroyed)) -// .subscribe(data => { -// this.dmpBlueprintEditor = new DmpBlueprintEditor().fromModel(data); -// this.formGroup = this.dmpBlueprintEditor.buildForm(); -// this.buildSystemFields(); -// this.fillDescriptionTemplatesInMultAutocomplete(); -// if (this.dmpBlueprintEditor.status == DmpBlueprintStatus.Finalized) { -// this.formGroup.disable(); -// this.viewOnly = true -// } -// // this.breadCrumbs = observableOf([{ -// // parentComponentName: 'DmpBlueprintListingComponent', -// // label: this.language.instant('NAV-BAR.TEMPLATE'), -// // url: '/dmp-blueprints/' + this.dmpBlueprintId -// // }]); -// }); -// } else if (cloneId != null) { -// this.isClone = true; -// this.dmpBlueprintService.clone(cloneId).pipe(map(data => data as any), takeUntil(this._destroyed)) -// .subscribe( -// data => { -// this.dmpBlueprintEditor = new DmpBlueprintEditor().fromModel(data); -// this.dmpBlueprintEditor.id = null; -// this.dmpBlueprintEditor.status = DmpBlueprintStatus.Draft; -// this.formGroup = this.dmpBlueprintEditor.buildForm(); -// this.buildSystemFields(); -// this.fillDescriptionTemplatesInMultAutocomplete(); -// }, -// error => this.onCallbackError(error) -// ); -// } else { -// this.dmpBlueprintEditorModel = new DmpBlueprintEditorModel(); -// this.dmpBlueprintEditor = new DmpBlueprintEditor(); -// setTimeout(() => { -// // this.formGroup = this.dmpBlueprintModel.buildForm(); -// // this.addField(); -// this.dmpBlueprintEditor.status = DmpBlueprintStatus.Draft; -// this.formGroup = this.dmpBlueprintEditor.buildForm(); -// }); -// // this.breadCrumbs = observableOf([{ -// // parentComponentName: 'DmpBlueprintListingComponent', -// // label: this.language.instant('NAV-BAR.TEMPLATE'), -// // url: '/dmp-blueprints/' + this.dmpBlueprintId -// // }]); -// } -// }); - -// } - -// buildSystemFields() { -// const sections = this.sectionsArray().controls.length; -// for (let i = 0; i < sections; i++) { -// let systemFieldsInSection = new Array(); -// this.fieldsArray(i).controls.forEach((field) => { -// if ((field.get('category').value == FieldCategory.SYSTEM || field.get('category').value == 'SYSTEM')) { -// systemFieldsInSection.push(this.fieldList.find(f => f.type == field.get('type').value).type); -// } -// }) -// this.systemFieldListPerSection.push(systemFieldsInSection); -// } -// } - -// fillDescriptionTemplatesInMultAutocomplete() { -// const sections = this.sectionsArray().controls.length; -// for (let i = 0; i < sections; i++) { -// let descriptionTemplatesInSection = new Array(); -// this.descriptionTemplatesArray(i).controls.forEach((template) => { -// descriptionTemplatesInSection.push({ id: template.value.descriptionTemplateId, label: template.value.label, description: "" }); -// }) -// this.descriptionTemplatesPerSection.push(descriptionTemplatesInSection); -// } -// } - -// checkForProfiles(event, sectionIndex: number) { -// if (event.checked === false) { -// this.descriptionTemplatesPerSection[sectionIndex] = new Array(); -// this.descriptionTemplatesArray(sectionIndex).clear(); -// } -// } - -// filterProfiles(value: string): Observable { -// const request = new DataTableRequest(null, null, { fields: ['+label'] }); -// const criteria = new DatasetProfileCriteria(); -// criteria.like = value; -// request.criteria = criteria; -// return this._service.searchDmpBlueprints(request); -// } - -// sectionsArray(): UntypedFormArray { -// //return this.dmpBlueprintsFormGroup.get('sections') as FormArray; -// return this.formGroup.get('definition').get('sections') as UntypedFormArray; -// } - -// addSection(): void { -// const section: SectionDmpBlueprintEditor = new SectionDmpBlueprintEditor(); -// section.id = Guid.create().toString(); -// section.ordinal = this.sectionsArray().length + 1; -// section.hasTemplates = false; -// this.sectionsArray().push(section.buildForm()); -// this.systemFieldListPerSection.push(new Array()); -// } - -// removeSection(sectionIndex: number): void { -// this.systemFieldListPerSection.splice(sectionIndex, 1); -// this.sectionsArray().removeAt(sectionIndex); -// this.sectionsArray().controls.forEach((section, index) => { -// section.get('ordinal').setValue(index + 1); -// }); -// } - -// fieldsArray(sectionIndex: number): UntypedFormArray { -// return this.sectionsArray().at(sectionIndex).get('fields') as UntypedFormArray; -// } - -// addField(sectionIndex: number, fieldCategory: FieldCategory, fieldType?: number): void { -// const field: FieldInSectionEditor = new FieldInSectionEditor(); -// field.id = Guid.create().toString(); -// field.ordinal = this.fieldsArray(sectionIndex).length + 1; -// field.category = fieldCategory; -// if (!isNullOrUndefined(fieldType)) { -// field.type = fieldType -// } -// field.required = (!isNullOrUndefined(fieldType) && (fieldType == 0 || fieldType == 1)) ? true : false; -// this.fieldsArray(sectionIndex).push(field.buildForm()); -// } - -// removeField(sectionIndex: number, fieldIndex: number): void { -// this.fieldsArray(sectionIndex).removeAt(fieldIndex); -// } - -// systemFieldsArray(sectionIndex: number): UntypedFormArray { -// return this.sectionsArray().at(sectionIndex).get('systemFields') as UntypedFormArray; -// } - -// initSystemField(systemField?: SystemFieldType): UntypedFormGroup { -// return this.fb.group({ -// id: this.fb.control(Guid.create().toString()), -// type: this.fb.control(systemField), -// label: this.fb.control(''), -// placeholder: this.fb.control(''), -// description: this.fb.control(''), -// required: this.fb.control(true), -// ordinal: this.fb.control('') -// }); -// } - -// addSystemField(sectionIndex: number, systemField?: SystemFieldType): void { -// this.addField(sectionIndex, FieldCategory.SYSTEM, systemField); -// } - -// transfromEnumToString(type: SystemFieldType): string { -// return this.fieldList.find(f => f.type == type).label; -// } - -// selectedFieldType(type: SystemFieldType, sectionIndex: number): void { -// let index = this.systemFieldListPerSection[sectionIndex].indexOf(type); -// if (index == -1) { -// this.systemFieldListPerSection[sectionIndex].push(type); -// this.addSystemField(sectionIndex, type); -// } -// else { -// this.systemFieldListPerSection[sectionIndex].splice(index, 1); -// this.removeSystemField(sectionIndex, type); -// } -// } - -// systemFieldDisabled(systemField: SystemFieldType, sectionIndex: number) { -// let i = 0; -// for (let s in this.sectionsArray().controls) { -// if (i != sectionIndex) { -// for (let f of this.fieldsArray(i).controls) { -// if ((f.get('category').value == FieldCategory.SYSTEM || f.get('category').value == 'SYSTEM') && f.get('type').value == systemField) { -// return true; -// } -// } -// } -// i++; -// } -// return false; -// } - -// removeSystemFieldWithIndex(sectionIndex: number, fieldIndex: number): void { -// let type: SystemFieldType = this.fieldsArray(sectionIndex).at(fieldIndex).get('type').value; -// let index = this.systemFieldListPerSection[sectionIndex].indexOf(type); -// this.systemFieldListPerSection[sectionIndex] = this.systemFieldListPerSection[sectionIndex].filter(types => types != type); -// this.fieldsArray(sectionIndex).removeAt(fieldIndex); -// } - -// removeSystemField(sectionIndex: number, systemField: SystemFieldType): void { -// let i = 0; -// for (let f of this.fieldsArray(sectionIndex).controls) { -// if ((f.get('category').value == FieldCategory.SYSTEM || f.get('category').value == 'SYSTEM') && f.get('type').value == systemField) { -// this.fieldsArray(sectionIndex).removeAt(i); -// return; -// } -// i++; -// } -// } - -// descriptionTemplatesArray(sectionIndex: number): UntypedFormArray { -// return this.sectionsArray().at(sectionIndex).get('descriptionTemplates') as UntypedFormArray; -// } - -// addDescriptionTemplate(descriptionTemplate, sectionIndex: number): void { -// this.descriptionTemplatesArray(sectionIndex).push(this.fb.group({ -// label: this.fb.control(descriptionTemplate.value) -// })); -// } - -// removeDescriptionTemplate(sectionIndex: number, templateIndex: number): void { -// this.descriptionTemplatesArray(sectionIndex).removeAt(templateIndex); -// } - -// extraFieldsArray(sectionIndex: number): UntypedFormArray { -// return this.sectionsArray().at(sectionIndex).get('extraFields') as UntypedFormArray; -// } - -// addExtraField(sectionIndex: number): void { -// this.addField(sectionIndex, FieldCategory.EXTRA); -// } - -// removeExtraField(sectionIndex: number, fieldIndex: number): void { -// this.fieldsArray(sectionIndex).removeAt(fieldIndex); -// } - -// getExtraFieldTypes(): Number[] { -// let keys: string[] = Object.keys(ExtraFieldType); -// keys = keys.slice(0, keys.length / 2); -// const values: Number[] = keys.map(Number); -// return values; -// } - -// getExtraFieldTypeValue(extraFieldType: ExtraFieldType): string { -// switch (extraFieldType) { -// case ExtraFieldType.TEXT: return 'Text'; -// case ExtraFieldType.RICH_TEXT: return 'Rich Text'; -// case ExtraFieldType.DATE: return 'Date'; -// case ExtraFieldType.NUMBER: return 'Number'; -// } -// } - -// drop(event: CdkDragDrop, sectionIndex: number) { -// moveItemInArray(this.fieldsArray(sectionIndex).controls, event.previousIndex, event.currentIndex); -// moveItemInArray(this.fieldsArray(sectionIndex).value, event.previousIndex, event.currentIndex); -// } - -// dropSections(event: CdkDragDrop) { -// moveItemInArray(this.sectionsArray().controls, event.previousIndex, event.currentIndex); -// moveItemInArray(this.sectionsArray().value, event.previousIndex, event.currentIndex); -// this.sectionsArray().controls.forEach((section, index) => { -// section.get('ordinal').setValue(index + 1); -// }); -// } - -// moveItemInFormArray(formArray: UntypedFormArray, fromIndex: number, toIndex: number): void { -// const dir = toIndex > fromIndex ? 1 : -1; - -// const item = formArray.at(fromIndex); -// for (let i = fromIndex; i * dir < toIndex * dir; i = i + dir) { -// const current = formArray.at(i + dir); -// formArray.setControl(i, current); -// } -// formArray.setControl(toIndex, item); -// } - -// // clearForm(): void{ -// // this.dmpBlueprintsFormGroup.reset(); -// // } - -// onRemoveTemplate(event, sectionIndex: number) { -// const blueprints = this.descriptionTemplatesArray(sectionIndex).controls; -// const foundIndex = blueprints.findIndex(blueprint => blueprint.get('descriptionTemplateId').value === event.id); -// foundIndex !== -1 && this.descriptionTemplatesArray(sectionIndex).removeAt(foundIndex); -// } - -// // onPreviewTemplate(event, sectionIndex: number) { -// // const dialogRef = this.dialog.open(DatasetPreviewDialogComponent, { -// // width: '590px', -// // minHeight: '200px', -// // restoreFocus: false, -// // data: { -// // template: event -// // }, -// // panelClass: 'custom-modalbox' -// // }); -// // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { -// // if (result) { -// // let blueprints = this.sectionsArray().at(sectionIndex).get('descriptionTemplates').value;//this.formGroup.get('blueprints').value; -// // const blueprint: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor(); -// // blueprint.id = Guid.create().toString(); -// // blueprint.descriptionTemplateId = event.id; -// // blueprint.label = event.label; -// // blueprints.push(blueprint.buildForm()); -// // this.sectionsArray().at(sectionIndex).get('descriptionTemplates').setValue(blueprints);//this.formGroup.get('blueprints').setValue(blueprints); -// // this.blueprintsAutoCompleteConfiguration = { -// // filterFn: this.filterProfiles.bind(this), -// // initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), -// // displayFn: (item) => item['label'], -// // titleFn: (item) => item['label'], -// // subtitleFn: (item) => item['description'], -// // popupItemActionIcon: 'visibility' -// // }; -// // } -// // }); -// // } - -// onOptionSelected(item, sectionIndex) { -// const blueprint: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor(); -// blueprint.id = Guid.create().toString(); -// blueprint.descriptionTemplateId = item.id; -// blueprint.label = item.label; -// this.descriptionTemplatesArray(sectionIndex).push(blueprint.buildForm()); -// } - -// checkValidity() { -// this.formService.touchAllFormFields(this.formGroup); -// if (!this.isFormValid()) { return false; } -// let errorMessages = []; -// if (!this.hasTitle()) { -// errorMessages.push("Title should be set."); -// } -// if (!this.hasDescription()) { -// errorMessages.push("Description should be set."); -// } -// if (!this.hasDescriptionTemplates()) { -// errorMessages.push("At least one section should have description templates."); -// } -// if (errorMessages.length > 0) { -// this.showValidationErrorsDialog(undefined, errorMessages); -// return false; -// } -// return true; -// } - -// formSubmit(): void { -// if (this.checkValidity()) -// this.onSubmit(); -// } - -// public isFormValid() { -// return this.formGroup.valid; -// } - -// hasTitle(): boolean { -// const dmpBlueprint: DmpBlueprint = this.formGroup.value; -// return dmpBlueprint.definition.sections.some(section => section.fields.some(field => (field.category === FieldCategory.SYSTEM || field.category as unknown === 'SYSTEM') && field.type === SystemFieldType.TEXT)); -// } - -// hasDescription(): boolean { -// const dmpBlueprint: DmpBlueprint = this.formGroup.value; -// return dmpBlueprint.definition.sections.some(section => section.fields.some(field => (field.category === FieldCategory.SYSTEM || field.category as unknown === 'SYSTEM') && field.type === SystemFieldType.HTML_TEXT)); -// } - -// hasDescriptionTemplates(): boolean { -// const dmpBlueprint: DmpBlueprint = this.formGroup.value; -// return dmpBlueprint.definition.sections.some(section => section.hasTemplates == true); -// } - -// private showValidationErrorsDialog(projectOnly?: boolean, errmess?: string[]) { - -// const dialogRef = this.dialog.open(FormValidationErrorsDialogComponent, { -// disableClose: true, -// autoFocus: false, -// restoreFocus: false, -// data: { -// errorMessages: errmess, -// projectOnly: projectOnly -// }, -// }); - -// } - -// onSubmit(): void { -// this.dmpBlueprintService.createBlueprint(this.formGroup.value) -// .pipe(takeUntil(this._destroyed)) -// .subscribe( -// complete => this.onCallbackSuccess(), -// error => this.onCallbackError(error) -// ); -// } - -// onCallbackSuccess(): void { -// this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); -// this.router.navigate(['/dmp-blueprints']); -// } - -// onCallbackError(errorResponse: any) { -// this.setErrorModel(errorResponse.error); -// this.formService.validateAllFormFields(this.formGroup); -// } - -// public setErrorModel(validationErrorModel: ValidationErrorModel) { -// Object.keys(validationErrorModel).forEach(item => { -// (this.dmpBlueprintEditor.validationErrorModel)[item] = (validationErrorModel)[item]; -// }); -// } - -// public cancel(): void { -// this.router.navigate(['/dmp-blueprints']); -// } - -// // addField() { -// // (this.formGroup.get('definition').get('fields')).push(new DmpBlueprintFieldEditorModel().buildForm()); -// // } - -// // removeField(index: number) { -// // (this.formGroup.get('definition').get('fields')).controls.splice(index, 1); -// // } - -// getDmpBlueprintFieldDataTypeValues(): Number[] { -// let keys: string[] = Object.keys(DmpBlueprintFieldDataType); -// keys = keys.slice(0, keys.length / 2); -// const values: Number[] = keys.map(Number); -// return values; -// } - -// getDmpBlueprintFieldDataTypeWithLanguage(fieldType: DmpBlueprintFieldDataType): string { -// let result = ''; -// this.language.get(this.enumUtils.toDmpBlueprintFieldDataTypeString(fieldType)) -// .pipe(takeUntil(this._destroyed)) -// .subscribe((value: string) => { -// result = value; -// }); -// return result; -// } - -// getDmpBlueprintFieldTypeValues(): Number[] { -// let keys: string[] = Object.keys(DmpBlueprintType); -// keys = keys.slice(0, keys.length / 2); -// const values: Number[] = keys.map(Number); -// return values; -// } - -// getDmpBlueprintFieldTypeWithLanguage(blueprintType: DmpBlueprintType): string { -// let result = ''; -// this.language.get(this.enumUtils.toDmpBlueprintTypeString(blueprintType)) -// .pipe(takeUntil(this._destroyed)) -// .subscribe((value: string) => { -// result = value; -// }); -// return result; -// } - -// delete() { -// this.dialog.open(ConfirmationDialogComponent, { -// data: { -// isDeleteConfirmation: true, -// confirmButton: this.language.instant('DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.CONFIRM-BUTTON'), -// cancelButton: this.language.instant("DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.CANCEL-BUTTON"), -// message: this.language.instant("DMP-BLUEPRINT-EDITOR.CONFIRM-DELETE-DIALOG.MESSAGE") -// } -// }) -// .afterClosed() -// .subscribe( -// confirmed => { -// if (confirmed) { -// if (this.formGroup.get('status').value == DmpBlueprintStatus.Draft) { -// // this.formGroup.get('status').setValue(DmpBlueprintStatus.Deleted); -// this.dmpBlueprintService.createBlueprint(this.formGroup.value) -// .pipe(takeUntil(this._destroyed)) -// .subscribe( -// complete => this.onCallbackSuccess(), -// error => this.onCallbackError(error) -// ); -// } -// else { -// // this.dmpBlueprintService.delete(this.dmpBlueprintId) -// // .pipe(takeUntil(this._destroyed)) -// // .subscribe( -// // complete => this.onCallbackSuccess(), -// // error => { -// // if (error.error.statusCode == 674) { -// // this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DMP-BLUEPRINT-DELETE'), SnackBarNotificationLevel.Error); -// // } else { -// // this.uiNotificationService.snackBarNotification(this.language.instant(error.message), SnackBarNotificationLevel.Error); -// // } -// // } -// // ); -// } -// } -// } -// ) - -// } - -// finalize() { -// if (this.checkValidity()) { -// this.formGroup.get('status').setValue(DmpBlueprintStatus.Finalized); -// this.onSubmit(); -// } -// } - -// downloadXML(): void { -// this.dmpBlueprintService.downloadXML(this.dmpBlueprintId) -// .pipe(takeUntil(this._destroyed)) -// .subscribe(response => { -// const blob = new Blob([response.body], { type: 'application/xml' }); -// const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); - -// FileSaver.saveAs(blob, filename); -// }); -// } - - -// getFilenameFromContentDispositionHeader(header: string): string { -// const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - -// const matches = header.match(regex); -// let filename: string; -// for (let i = 0; i < matches.length; i++) { -// const match = matches[i]; -// if (match.includes('filename="')) { -// filename = match.substring(10, match.length - 1); -// break; -// } else if (match.includes('filename=')) { -// filename = match.substring(9); -// break; -// } -// } -// return filename; -// } - -// isExternalAutocomplete(formGroup: UntypedFormGroup) { -// if (formGroup.get('dataType').value == DmpBlueprintFieldDataType.ExternalAutocomplete) { -// this.addControl(formGroup); -// return true; -// } else { -// this.removeControl(formGroup); -// return false; -// } -// } - -// addControl(formGroup: UntypedFormGroup) { -// if (formGroup.get('dataType').value == 3) -// formGroup.addControl('externalAutocomplete', new DmpBlueprintExternalAutoCompleteFieldDataEditorModel().buildForm()); -// } - -// removeControl(formGroup: UntypedFormGroup) { -// if (formGroup.get('dataType').value != 3) -// formGroup.removeControl('externalAutocomplete'); -// } -// } diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts index d3305c9f7..4a12053d6 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts @@ -182,7 +182,7 @@ export class DmpBlueprintListingComponent extends BaseListingComponent { // const blob = new Blob([response.body], { type: 'application/xml' }); - // const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + // const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); // FileSaver.saveAs(blob, filename); // }); } @@ -209,27 +209,10 @@ export class DmpBlueprintListingComponent extends BaseListingComponent { // const blob = new Blob([response.body], { type: 'application/xml' }); - // const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + // const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); // FileSaver.saveAs(blob, filename); // }); // } - // getFilenameFromContentDispositionHeader(header: string): string { - // const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - // const matches = header.match(regex); - // let filename: string; - // for (let i = 0; i < matches.length; i++) { - // const match = matches[i]; - // if (match.includes('filename="')) { - // filename = match.substring(10, match.length - 1); - // break; - // } else if (match.includes('filename=')) { - // filename = match.substring(9); - // break; - // } - // } - // return filename; - // } // deleteTemplate(id: string) { // if (id) { diff --git a/dmp-frontend/src/app/ui/admin/user/listing/user-listing.component.ts b/dmp-frontend/src/app/ui/admin/user/listing/user-listing.component.ts index 82f8119b6..9e5456559 100644 --- a/dmp-frontend/src/app/ui/admin/user/listing/user-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/user/listing/user-listing.component.ts @@ -18,6 +18,7 @@ import { UserCriteria } from '../../../../core/query/user/user-criteria'; import { UserService } from '../../../../core/services/user/user.service'; import { SnackBarNotificationComponent } from '../../../../library/notification/snack-bar/snack-bar-notification.component'; // import { BreadcrumbItem } from '../../../misc/breadcrumb/definition/breadcrumb-item'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { UserCriteriaComponent } from './criteria/user-criteria.component'; export class UsersDataSource extends DataSource { @@ -111,7 +112,8 @@ export class UserListingComponent extends BaseComponent implements OnInit, After private languageService: TranslateService, public snackBar: MatSnackBar, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -151,29 +153,11 @@ export class UserListingComponent extends BaseComponent implements OnInit, After .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/csv' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - public setDefaultAvatar(ev: Event) { (ev.target as HTMLImageElement).src = 'assets/images/profile-placeholder.png'; } diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts index 563ae7ecb..5c726535c 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts @@ -1,50 +1,48 @@ -import {Component, OnInit, Input, EventEmitter, Output, ViewChild} from '@angular/core'; -import { DatasetService } from '../../../core/services/dataset/dataset.service'; -import {DataTableMultiTypeRequest, DataTableRequest} from '../../../core/model/data-table/data-table-request'; -import { DatasetCriteria } from '../../../core/query/dataset/dataset-criteria'; -import { DatasetListingModel } from '../../../core/model/dataset/dataset-listing'; -import { AuthService } from '../../../core/services/auth/auth.service'; -import { RecentActivityType } from '../../../core/common/enum/recent-activity-type'; -import {ActivatedRoute, Router} from '@angular/router'; -import { DmpStatus } from '../../../core/common/enum/dmp-status'; -import { TranslateService } from '@ngx-translate/core'; -import {debounceTime, map, takeUntil} from 'rxjs/operators'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; -import {UntypedFormControl, UntypedFormBuilder, UntypedFormGroup} from '@angular/forms'; -import { BaseComponent } from '@common/base/base.component'; -import { MatDialog } from '@angular/material/dialog'; -import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import { SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; -import * as FileSaver from 'file-saver'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; import { Location } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; import { Role } from '@app/core/common/enum/role'; +import { DatasetUrlListing } from "@app/core/model/dataset/dataset-url-listing"; +import { DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DmpModel } from "@app/core/model/dmp/dmp"; +import { DmpListingModel } from "@app/core/model/dmp/dmp-listing"; +import { RecentActivityModel } from "@app/core/model/recent-activity/recent-activity.model"; +import { RecentDatasetModel } from "@app/core/model/recent-activity/recent-dataset-activity.model"; +import { RecentDmpModel } from "@app/core/model/recent-activity/recent-dmp-activity.model"; +import { RecentActivityCriteria } from "@app/core/query/recent-activity/recent-activity-criteria"; +import { DashboardService } from "@app/core/services/dashboard/dashboard.service"; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; +import { DmpService } from "@app/core/services/dmp/dmp.service"; import { LockService } from '@app/core/services/lock/lock.service'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; -import { HttpClient } from '@angular/common/http'; -import {RecentActivityModel} from "@app/core/model/recent-activity/recent-activity.model"; -import {DmpEditorModel} from "@app/ui/dmp/editor/dmp-editor.model"; -import {DmpService} from "@app/core/services/dmp/dmp.service"; -import {DashboardService} from "@app/core/services/dashboard/dashboard.service"; -import {RecentActivityCriteria} from "@app/core/query/recent-activity/recent-activity-criteria"; -import {RecentDmpModel} from "@app/core/model/recent-activity/recent-dmp-activity.model"; -import {DatasetUrlListing} from "@app/core/model/dataset/dataset-url-listing"; -import {RecentDatasetModel} from "@app/core/model/recent-activity/recent-dataset-activity.model"; -import {DmpListingModel} from "@app/core/model/dmp/dmp-listing"; -import {DmpModel} from "@app/core/model/dmp/dmp"; -import {GrantTabModel} from "@app/ui/dmp/editor/grant-tab/grant-tab-model"; -import {ProjectFormModel} from "@app/ui/dmp/editor/grant-tab/project-form-model"; -import {FunderFormModel} from "@app/ui/dmp/editor/grant-tab/funder-form-model"; -import {ExtraPropertiesFormModel} from "@app/ui/dmp/editor/general-tab/extra-properties-form.model"; -import {CloneDialogComponent} from "@app/ui/dmp/clone/clone-dialog/clone-dialog.component"; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; +import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; +import { CloneDialogComponent } from "@app/ui/dmp/clone/clone-dialog/clone-dialog.component"; +import { DmpEditorModel } from "@app/ui/dmp/editor/dmp-editor.model"; +import { ExtraPropertiesFormModel } from "@app/ui/dmp/editor/general-tab/extra-properties-form.model"; +import { FunderFormModel } from "@app/ui/dmp/editor/grant-tab/funder-form-model"; +import { GrantTabModel } from "@app/ui/dmp/editor/grant-tab/grant-tab-model"; +import { ProjectFormModel } from "@app/ui/dmp/editor/grant-tab/project-form-model"; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; -import { DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint'; -import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { BaseComponent } from '@common/base/base.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { debounceTime, map, takeUntil } from 'rxjs/operators'; +import { DmpStatus } from '../../../core/common/enum/dmp-status'; +import { RecentActivityType } from '../../../core/common/enum/recent-activity-type'; +import { DataTableMultiTypeRequest } from '../../../core/model/data-table/data-table-request'; +import { DatasetListingModel } from '../../../core/model/dataset/dataset-listing'; +import { AuthService } from '../../../core/services/auth/auth.service'; @Component({ selector: 'app-drafts', @@ -67,7 +65,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { offsetLess: number = 0; pageSize: number = 5; dmpFormGroup: UntypedFormGroup; - hasMoreActivity:boolean = true; + hasMoreActivity: boolean = true; public formGroup = new UntypedFormBuilder().group({ like: new UntypedFormControl(), order: new UntypedFormControl() @@ -94,7 +92,8 @@ export class DraftsComponent extends BaseComponent implements OnInit { private location: Location, private lockService: LockService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -102,18 +101,18 @@ export class DraftsComponent extends BaseComponent implements OnInit { ngOnInit() { this.matomoService.trackPageView('Drafts'); this.route.queryParams.subscribe(params => { - if(this.isActive) { + if (this.isActive) { let page = (params['page'] === undefined) ? 1 : +params['page']; this.page = (page <= 0) ? 1 : page; - this.datasetOffset = (this.page-1)*this.pageSize; - this.dmpOffset = (this.page-1)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.datasetOffset = (this.page - 1) * this.pageSize; + this.dmpOffset = (this.page - 1) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } let order = params['order']; - if(order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL)) { + if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL)) { order = this.order.MODIFIED; } this.formGroup.get('order').setValue(order); @@ -129,7 +128,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.formGroup.get('order').setValue(this.order.MODIFIED); } const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; - const allDataTableRequest: DataTableMultiTypeRequest = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, 5, {fields: fields}); + const allDataTableRequest: DataTableMultiTypeRequest = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, 5, { fields: fields }); allDataTableRequest.criteria = new RecentActivityCriteria(); allDataTableRequest.criteria.like = this.formGroup.get('like').value; allDataTableRequest.criteria.order = this.formGroup.get('order').value; @@ -151,11 +150,11 @@ export class DraftsComponent extends BaseComponent implements OnInit { }); this.totalCountRecentEdited.emit(this.allRecentActivities.length); if (this.allRecentActivities.length == 0 && this.page > 1) { - let queryParams = {type: "recent", page: 1, order: this.formGroup.get("order").value}; + let queryParams = { type: "recent", page: 1, order: this.formGroup.get("order").value }; if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], {queryParams: queryParams}) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); this.formGroup.get('like').valueChanges @@ -172,17 +171,17 @@ export class DraftsComponent extends BaseComponent implements OnInit { } ngOnChanges() { - if(this.isActive) { + if (this.isActive) { this.updateUrl(); } } updateUrl() { - let parameters = "?type=drafts"+ - (this.page != 1 ? "&page="+this.page : "") + - (this.formGroup.get("order").value != this.order.MODIFIED ? "&order="+this.formGroup.get("order").value : "") + - (this.formGroup.get("like").value ? ("&keyword="+this.formGroup.get("like").value) : ""); - this.location.go(this.router.url.split('?')[0]+parameters); + let parameters = "?type=drafts" + + (this.page != 1 ? "&page=" + this.page : "") + + (this.formGroup.get("order").value != this.order.MODIFIED ? "&order=" + this.formGroup.get("order").value : "") + + (this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : ""); + this.location.go(this.router.url.split('?')[0] + parameters); } getDatasets(activity: RecentDmpModel): DatasetUrlListing[] { @@ -492,7 +491,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); @@ -504,7 +503,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); @@ -516,7 +515,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); @@ -528,7 +527,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -547,7 +546,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", dataset.id); @@ -559,7 +558,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", dataset.id); @@ -572,31 +571,13 @@ export class DraftsComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", dataset.id); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - viewVersions(rowId: String, rowLabel: String, activity: DmpListingModel) { if (activity.public && !this.isUserOwner(activity)) { let url = this.router.createUrlTree(['/explore-plans/versions/', rowId, { groupLabel: rowLabel }]); @@ -702,14 +683,14 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.allRecentActivities.forEach(recentActivity => { if (recentActivity.type === RecentActivityType.Dataset) { // this.datasetOffset = this.datasetOffset + 1; - this.datasetOffset = this.page*this.pageSize; + this.datasetOffset = this.page * this.pageSize; } else if (recentActivity.type === RecentActivityType.Dmp) { // this.dmpOffset = this.dmpOffset + 1; - this.dmpOffset = this.page*this.pageSize; + this.dmpOffset = this.page * this.pageSize; } }); - if(response.length< this.pageSize) { + if (response.length < this.pageSize) { this.hasMoreActivity = false; } else { this.hasMoreActivity = true; @@ -722,10 +703,10 @@ export class DraftsComponent extends BaseComponent implements OnInit { const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; // const fields: Array = ["-modified"]; let request; - if(more) { - request = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, this.pageSize, {fields: fields}); + if (more) { + request = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, this.pageSize, { fields: fields }); } else { - request = new DataTableMultiTypeRequest(this.offsetLess, this.offsetLess, this.pageSize, {fields: fields}); + request = new DataTableMultiTypeRequest(this.offsetLess, this.offsetLess, this.pageSize, { fields: fields }); } request.criteria = new RecentActivityCriteria(); request.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : ""; @@ -754,7 +735,7 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.offsetLess = (this.page - 2) * this.pageSize; } - if(result.length < this.pageSize) { + if (result.length < this.pageSize) { this.hasMoreActivity = false; } else { this.hasMoreActivity = true; diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index cc3cdc585..95f441e3e 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -1,52 +1,50 @@ -import {Component, OnInit, Output, EventEmitter, Input, ViewChild} from '@angular/core'; +import { Location } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; -import {ActivatedRoute, Router} from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; import { RecentActivityType } from '@app/core/common/enum/recent-activity-type'; -import { DataTableRequest, DataTableMultiTypeRequest } from '@app/core/model/data-table/data-table-request'; +import { Role } from '@app/core/common/enum/role'; +import { DataTableMultiTypeRequest } from '@app/core/model/data-table/data-table-request'; +import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; +import { DatasetUrlListing } from '@app/core/model/dataset/dataset-url-listing'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; -import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; +import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model'; +import { RecentDatasetModel } from '@app/core/model/recent-activity/recent-dataset-activity.model'; +import { RecentDmpModel } from '@app/core/model/recent-activity/recent-dmp-activity.model'; +import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { DashboardService } from '@app/core/services/dashboard/dashboard.service'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { BaseComponent } from '@common/base/base.component'; -import { TranslateService } from '@ngx-translate/core'; -import * as FileSaver from 'file-saver'; -import { takeUntil, map, debounceTime } from 'rxjs/operators'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { DmpStatus } from '@app/core/common/enum/dmp-status'; -import { DatasetService } from '@app/core/services/dataset/dataset.service'; -import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; -import { Role } from '@app/core/common/enum/role'; -import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model'; -import { DashboardService } from '@app/core/services/dashboard/dashboard.service'; -import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria'; -import { RecentDmpModel } from '@app/core/model/recent-activity/recent-dmp-activity.model'; -import { RecentDatasetModel } from '@app/core/model/recent-activity/recent-dataset-activity.model'; -import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; -import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import { UntypedFormControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; -import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; -import { Location } from '@angular/common'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { DatasetUrlListing } from '@app/core/model/dataset/dataset-url-listing'; +import { CloneDialogComponent } from '@app/ui/dmp/clone/clone-dialog/clone-dialog.component'; import { DmpEditorModel } from '@app/ui/dmp/editor/dmp-editor.model'; +import { ExtraPropertiesFormModel } from '@app/ui/dmp/editor/general-tab/extra-properties-form.model'; +import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model'; import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model'; -import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model'; -import { ExtraPropertiesFormModel } from '@app/ui/dmp/editor/general-tab/extra-properties-form.model'; -import { DmpModel } from '@app/core/model/dmp/dmp'; -import { CloneDialogComponent } from '@app/ui/dmp/clone/clone-dialog/clone-dialog.component'; -import { MatomoService } from '@app/core/services/matomo/matomo-service'; -import { HttpClient } from '@angular/common/http'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; -import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; -import { nameof } from 'ts-simple-nameof'; +import { BaseComponent } from '@common/base/base.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { Guid } from '@common/types/guid'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { debounceTime, map, takeUntil } from 'rxjs/operators'; +import { nameof } from 'ts-simple-nameof'; @Component({ selector: 'app-recent-edited-activity', @@ -69,7 +67,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn offsetLess: number = 0; pageSize: number = 5; dmpFormGroup: UntypedFormGroup; - hasMoreActivity:boolean = true; + hasMoreActivity: boolean = true; public formGroup = new UntypedFormBuilder().group({ like: new UntypedFormControl(), order: new UntypedFormControl() @@ -96,7 +94,8 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn private location: Location, private lockService: LockService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -104,23 +103,23 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn ngOnInit() { this.matomoService.trackPageView('Recent Edited Activity'); this.route.queryParams.subscribe(params => { - if(this.isActive) { + if (this.isActive) { let page = (params['page'] === undefined) ? 1 : +params['page']; this.page = (page <= 0) ? 1 : page; - this.datasetOffset = (this.page-1)*this.pageSize; - this.dmpOffset = (this.page-1)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.datasetOffset = (this.page - 1) * this.pageSize; + this.dmpOffset = (this.page - 1) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } let order = params['order']; if (this.isAuthenticated()) { - if(order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { + if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { order = this.order.MODIFIED; } } else { - if(order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) { + if (order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) { order = this.order.PUBLISHED; } } @@ -133,7 +132,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn } }); if (this.isAuthenticated()) { - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.MODIFIED); } const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; @@ -150,19 +149,19 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn this.allRecentActivities.forEach(recentActivity => { if (recentActivity.type === RecentActivityType.Dataset) { // this.datasetOffset = this.datasetOffset + 1; - this.datasetOffset = this.page*this.pageSize; + this.datasetOffset = this.page * this.pageSize; } else if (recentActivity.type === RecentActivityType.Dmp) { // this.dmpOffset = this.dmpOffset + 1; - this.dmpOffset = this.page*this.pageSize; + this.dmpOffset = this.page * this.pageSize; } }); this.totalCountRecentEdited.emit(this.allRecentActivities.length); - if(this.allRecentActivities.length == 0 && this.page > 1) { + if (this.allRecentActivities.length == 0 && this.page > 1) { let queryParams = { type: "recent", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); this.formGroup.get('like').valueChanges @@ -177,7 +176,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn }); } else { this.publicMode = true; - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.PUBLISHED); } const allDataTableRequest = this.setPublicDataTableRequest(); @@ -189,19 +188,19 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn this.allRecentActivities.forEach(recentActivity => { if (recentActivity.type === RecentActivityType.Dataset) { // this.datasetOffset = this.datasetOffset + 1; - this.datasetOffset = this.page*this.pageSize; + this.datasetOffset = this.page * this.pageSize; } else if (recentActivity.type === RecentActivityType.Dmp) { // this.dmpOffset = this.dmpOffset + 1; - this.dmpOffset = this.page*this.pageSize; + this.dmpOffset = this.page * this.pageSize; } }); this.totalCountRecentEdited.emit(this.allRecentActivities.length); - if(this.allRecentActivities.length == 0 && this.page > 1) { + if (this.allRecentActivities.length == 0 && this.page > 1) { let queryParams = { type: "recent", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); this.formGroup.get('like').valueChanges @@ -218,20 +217,20 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn } ngOnChanges() { - if(this.isActive) { + if (this.isActive) { this.updateUrl(); } } updateUrl() { let parameters = ""; - parameters += (this.page != 1 ? "&page="+this.page : ""); - parameters += (((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 : ""); - parameters += (this.formGroup.get("like").value ? ("&keyword="+this.formGroup.get("like").value) : ""); - if(parameters) { - parameters = "?type=recent" + parameters; - } - this.location.go(this.router.url.split('?')[0]+parameters); + parameters += (this.page != 1 ? "&page=" + this.page : ""); + parameters += (((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 : ""); + parameters += (this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : ""); + if (parameters) { + parameters = "?type=recent" + parameters; + } + this.location.go(this.router.url.split('?')[0] + parameters); } getDatasets(activity: RecentDmpModel): DatasetUrlListing[] { @@ -348,10 +347,10 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.maxMultiplicity)].join('.'), ] ) - .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) - .subscribe( - data => successFunction(data), - ); + .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) + .subscribe( + data => successFunction(data), + ); } @@ -596,7 +595,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); @@ -608,7 +607,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); @@ -620,7 +619,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); @@ -632,7 +631,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -651,7 +650,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", dataset.id); @@ -663,7 +662,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", dataset.id); @@ -676,31 +675,13 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", dataset.id); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - // newVersion(id: String, label: String) { // let url = this.router.createUrlTree(['/plans/new_version/', id, { dmpLabel: label }]); // window.open(url.toString(), '_blank'); @@ -809,14 +790,14 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn this.allRecentActivities.forEach(recentActivity => { if (recentActivity.type === RecentActivityType.Dataset) { // this.datasetOffset = this.datasetOffset + 1; - this.datasetOffset = this.page*this.pageSize; + this.datasetOffset = this.page * this.pageSize; } else if (recentActivity.type === RecentActivityType.Dmp) { // this.dmpOffset = this.dmpOffset + 1; - this.dmpOffset = this.page*this.pageSize; + this.dmpOffset = this.page * this.pageSize; } }); - if(response.length< this.pageSize) { + if (response.length < this.pageSize) { this.hasMoreActivity = false; } else { this.hasMoreActivity = true; @@ -829,10 +810,10 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; // const fields: Array = ["-modified"]; let request; - if(more) { - request = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, this.pageSize, {fields: fields}); + if (more) { + request = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, this.pageSize, { fields: fields }); } else { - request = new DataTableMultiTypeRequest(this.offsetLess, this.offsetLess, this.pageSize, {fields: fields}); + request = new DataTableMultiTypeRequest(this.offsetLess, this.offsetLess, this.pageSize, { fields: fields }); } request.criteria = new RecentActivityCriteria(); request.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : ""; @@ -860,7 +841,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn this.offsetLess = (this.page - 2) * this.pageSize; } - if(result.length < this.pageSize) { + if (result.length < this.pageSize) { this.hasMoreActivity = false; } else { this.hasMoreActivity = true; diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts index d509a03f4..1a12aee40 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts @@ -1,31 +1,32 @@ -import {Component, OnInit, Output, EventEmitter, Input, ViewChild} from '@angular/core'; -import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; -import { DatasetService } from '@app/core/services/dataset/dataset.service'; -import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; -import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria'; -import { AuthService } from '@app/core/services/auth/auth.service'; -import { BaseComponent } from '@common/base/base.component'; -import { TranslateService } from '@ngx-translate/core'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { UntypedFormControl, UntypedFormBuilder } from '@angular/forms'; -import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; +import { Location } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; -import { debounceTime, takeUntil } from 'rxjs/operators'; -import {ActivatedRoute, Router} from '@angular/router'; -import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import * as FileSaver from 'file-saver'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; -import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { ActivatedRoute, Router } from '@angular/router'; import { DatasetStatus } from '@app/core/common/enum/dataset-status'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; import { Role } from '@app/core/common/enum/role'; -import { Location } from '@angular/common'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; +import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; +import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { ConfigurationService } from "@app/core/services/configuration/configuration.service"; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { DatasetService } from '@app/core/services/dataset/dataset.service'; import { LockService } from '@app/core/services/lock/lock.service'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; -import { HttpClient } from '@angular/common/http'; -import {ConfigurationService} from "@app/core/services/configuration/configuration.service"; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; +import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; +import { BaseComponent } from '@common/base/base.component'; +import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { debounceTime, takeUntil } from 'rxjs/operators'; @Component({ selector: 'app-recent-edited-dataset-activity', @@ -42,7 +43,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen totalCount: number; startIndex: number = 0; offsetLess: number = 0; - hasMoreResults:boolean = true; + hasMoreResults: boolean = true; pageSize: number = 5; public formGroup = new UntypedFormBuilder().group({ like: new UntypedFormControl(), @@ -69,7 +70,8 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen private lockService: LockService, private httpClient: HttpClient, private matomoService: MatomoService, - private configurationService: ConfigurationService + private configurationService: ConfigurationService, + private fileUtils: FileUtils ) { super(); } @@ -77,22 +79,22 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen ngOnInit() { this.matomoService.trackPageView('Recent Dataset Activity'); this.route.queryParams.subscribe(params => { - if(this.isActive) { + if (this.isActive) { let page = (params['page'] === undefined) ? 1 : +params['page']; this.page = (page <= 0) ? 1 : page; - this.startIndex = (this.page-1)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.startIndex = (this.page - 1) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } let order = params['order']; if (this.isAuthenticated()) { - if(order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { + if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { order = this.order.MODIFIED; } } else { - if(order === undefined || (order != this.order.DATASETPUBLISHED && order != this.order.LABEL)) { + if (order === undefined || (order != this.order.DATASETPUBLISHED && order != this.order.LABEL)) { order = this.order.DATASETPUBLISHED; } } @@ -106,7 +108,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen }); if (this.isAuthenticated()) { // const fields: Array = ["-modified"]; - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.MODIFIED); } const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; @@ -120,15 +122,15 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen this.datasetActivities = response.data; this.totalCount = response.totalCount; this.totalCountDatasets.emit(this.datasetActivities.length) - if(this.totalCount > 0 && this.totalCount <= (this.page-1)*this.pageSize && this.page > 1) { + if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) { let queryParams = { type: "datasets", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); - this.formGroup.get('like').valueChanges + this.formGroup.get('like').valueChanges .pipe(takeUntil(this._destroyed), debounceTime(500)) .subscribe(x => this.refresh()); this.formGroup.get('order').valueChanges @@ -136,7 +138,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen .subscribe(x => this.refresh()); } else { this.publicMode = true; - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.DATASETPUBLISHED); } const dataTableRequest = this.setPublicDataTableRequest(); @@ -144,12 +146,12 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen this.datasetActivities = response.data; this.totalCount = response.totalCount; this.totalCountDatasets.emit(this.datasetActivities.length); - if(this.totalCount > 0 && this.totalCount <= (this.page-1)*this.pageSize && this.page > 1) { + if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) { let queryParams = { type: "datasets", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); this.formGroup.get('like').valueChanges @@ -162,17 +164,17 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen } ngOnChanges() { - if(this.isActive) { + if (this.isActive) { this.updateUrl(); } } updateUrl() { - let parameters = "?type=datasets"+ - (this.page != 1 ? "&page="+this.page : "") + - (((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.DATASETPUBLISHED && this.publicMode)) ? "&order="+this.formGroup.get("order").value : "") + - (this.formGroup.get("like").value ? ("&keyword="+this.formGroup.get("like").value) : ""); - this.location.go(this.router.url.split('?')[0]+parameters); + let parameters = "?type=datasets" + + (this.page != 1 ? "&page=" + this.page : "") + + (((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.DATASETPUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") + + (this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : ""); + this.location.go(this.router.url.split('?')[0] + parameters); } setPublicDataTableRequest(fields?: Array, more: boolean = true): DataTableRequest { @@ -207,7 +209,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen this.datasetActivities = response.data; this.totalCount = response.totalCount; this.totalCountDatasets.emit(this.datasetActivities.length); - if(response.data.length< this.pageSize) { + if (response.data.length < this.pageSize) { this.hasMoreResults = false; } else { this.hasMoreResults = true; @@ -220,12 +222,12 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; let request; - this.startIndex = (this.page)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.startIndex = (this.page) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } - if(this.isAuthenticated()) { - if(more) { + if (this.isAuthenticated()) { + if (more) { request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); } else { request = new DataTableRequest(this.offsetLess, this.pageSize, { fields: fields }); @@ -249,7 +251,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen // this.datasetActivities = this.datasetActivities.length > 0 ? this.mergeTwoSortedLists(this.datasetActivities, result.data, this.formGroup.get('order').value) : result.data; this.datasetActivities = result.data; - if(result.data.length < this.pageSize) { + if (result.data.length < this.pageSize) { this.hasMoreResults = false; } else { this.hasMoreResults = true; @@ -384,30 +386,12 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - downloadPDF(dataset: DatasetListingModel): void { this.datasetWizardService.downloadPDF(dataset.id as string) .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", dataset.id); @@ -419,7 +403,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", dataset.id); @@ -432,7 +416,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", dataset.id); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts index 4d62b678f..d8be29cb0 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts @@ -1,43 +1,43 @@ -import {Component, OnInit, Output, EventEmitter, Input, ViewChild} from '@angular/core'; +import { Location } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; -import {ActivatedRoute, Router} from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; import { RecentActivityType } from '@app/core/common/enum/recent-activity-type'; +import { Role } from '@app/core/common/enum/role'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; +import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { DatasetService } from '@app/core/services/dataset/dataset.service'; +import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { BaseComponent } from '@common/base/base.component'; -import { TranslateService } from '@ngx-translate/core'; -import * as FileSaver from 'file-saver'; -import { takeUntil, map, debounceTime } from 'rxjs/operators'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { DmpStatus } from '@app/core/common/enum/dmp-status'; -import { DatasetService } from '@app/core/services/dataset/dataset.service'; -import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; -import { Role } from '@app/core/common/enum/role'; -import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; -import { Location } from '@angular/common'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { ExploreDmpCriteriaModel } from '@app/core/query/explore-dmp/explore-dmp-criteria'; -import { DmpModel } from '@app/core/model/dmp/dmp'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { CloneDialogComponent } from '@app/ui/dmp/clone/clone-dialog/clone-dialog.component'; import { DmpEditorModel } from '@app/ui/dmp/editor/dmp-editor.model'; -import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model'; import { ExtraPropertiesFormModel } from '@app/ui/dmp/editor/general-tab/extra-properties-form.model'; import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model'; +import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model'; -import { MatomoService } from '@app/core/services/matomo/matomo-service'; -import { HttpClient } from '@angular/common/http'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; -import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { BaseComponent } from '@common/base/base.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { Guid } from '@common/types/guid'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { debounceTime, map, takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; @Component({ @@ -60,7 +60,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O totalCount: number; startIndex: number = 0; offsetLess: number = 0; - hasMoreResults:boolean = true; + hasMoreResults: boolean = true; pageSize: number = 5; dmpFormGroup: UntypedFormGroup; public formGroup = new UntypedFormBuilder().group({ @@ -88,7 +88,8 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O private location: Location, private lockService: LockService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -96,22 +97,22 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O ngOnInit() { this.matomoService.trackPageView('Recent DMP Activity'); this.route.queryParams.subscribe(params => { - if(this.isActive) { + if (this.isActive) { let page = (params['page'] === undefined) ? 1 : +params['page']; this.page = (page <= 0) ? 1 : page; - this.startIndex = (this.page-1)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.startIndex = (this.page - 1) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } let order = params['order']; if (this.isAuthenticated()) { - if(order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { + if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) { order = this.order.MODIFIED; } } else { - if(order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) { + if (order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) { order = this.order.PUBLISHED; } } @@ -125,7 +126,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O }); if (this.isAuthenticated()) { // const fields: Array = ["-modified"]; - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.MODIFIED); } const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; @@ -139,12 +140,12 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.dmpActivities = response.data; this.totalCount = response.totalCount; this.totalCountDmps.emit(this.dmpActivities.length); - if(this.totalCount > 0 && this.totalCount <= (this.page-1)*this.pageSize && this.page > 1) { + if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) { let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } // this.totalCount < this.pageSize ? this.totalCountDmps.emit(response.totalCount) : this.totalCountDmps.emit(this.pageSize); // this.totalCountDmps.emit(this.totalCount); @@ -179,7 +180,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O // }); } else { this.publicMode = true; - if(!this.formGroup.get('order').value) { + if (!this.formGroup.get('order').value) { this.formGroup.get('order').setValue(this.order.PUBLISHED); } const dataTableRequest = this.setPublicDataTableRequest(); @@ -188,12 +189,12 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.dmpActivities = response.data; this.totalCount = response.totalCount; this.totalCountDmps.emit(this.dmpActivities.length); - if(this.totalCount > 0 && this.totalCount <= (this.page-1)*this.pageSize && this.page > 1) { + if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) { let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value }; - if(this.formGroup.get("like").value) { + if (this.formGroup.get("like").value) { queryParams['keyword'] = this.formGroup.get("like").value; } - this.router.navigate(["/home"], { queryParams: queryParams }) + this.router.navigate(["/home"], { queryParams: queryParams }) } }); this.formGroup.get('like').valueChanges @@ -206,17 +207,17 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O } ngOnChanges() { - if(this.isActive) { + if (this.isActive) { this.updateUrl(); } } updateUrl() { - let parameters = "?type=dmps"+ - (this.page != 1 ? "&page="+this.page : "") + - (((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 : "") + - (this.formGroup.get("like").value ? ("&keyword="+this.formGroup.get("like").value) : ""); - this.location.go(this.router.url.split('?')[0]+parameters); + let parameters = "?type=dmps" + + (this.page != 1 ? "&page=" + this.page : "") + + (((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 : "") + + (this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : ""); + this.location.go(this.router.url.split('?')[0] + parameters); } public isAuthenticated(): boolean { @@ -299,10 +300,10 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.maxMultiplicity)].join('.'), ] ) - .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) - .subscribe( - data => successFunction(data), - ); + .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) + .subscribe( + data => successFunction(data), + ); } private checkForGrant(blueprint: DmpBlueprintDefinition) { @@ -522,7 +523,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); @@ -534,7 +535,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); @@ -546,7 +547,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); @@ -558,7 +559,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -572,24 +573,6 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - // newVersion(id: String, label: String) { // let url = this.router.createUrlTree(['/plans/new_version/', id, { dmpLabel: label }]); // window.open(url.toString(), '_blank'); @@ -624,7 +607,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.dmpActivities = response.data; this.totalCount = response.totalCount; this.totalCountDmps.emit(this.dmpActivities.length); - if(response.data.length< this.pageSize) { + if (response.data.length < this.pageSize) { this.hasMoreResults = false; } else { this.hasMoreResults = true; @@ -637,15 +620,15 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O const fields: Array = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value]; let request; - this.startIndex = (this.page)*this.pageSize; - if(this.page > 1) { - this.offsetLess = (this.page-2)*this.pageSize; + this.startIndex = (this.page) * this.pageSize; + if (this.page > 1) { + this.offsetLess = (this.page - 2) * this.pageSize; } - if(this.isAuthenticated()) { - if(more) { - request = new DataTableRequest(this.startIndex, this.pageSize, {fields: fields}) + if (this.isAuthenticated()) { + if (more) { + request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }) } else { - request = new DataTableRequest(this.offsetLess, this.pageSize, {fields: fields}) + request = new DataTableRequest(this.offsetLess, this.pageSize, { fields: fields }) } } else { request = this.setPublicDataTableRequest(fields, more); @@ -666,7 +649,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O // this.dmpActivities = this.dmpActivities.length > 0 ? this.mergeTwoSortedLists(this.dmpActivities, result.data, this.formGroup.get('order').value) : result.data; this.dmpActivities = result.data; - if(result.data.length < this.pageSize) { + if (result.data.length < this.pageSize) { this.hasMoreResults = false; } else { this.hasMoreResults = true; diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index e9f3c2e1a..09399b259 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -32,6 +32,7 @@ import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; @@ -68,7 +69,7 @@ import { catchError, debounceTime, filter, map, takeUntil } from 'rxjs/operators templateUrl: 'dataset-wizard.component.html', styleUrls: ['./dataset-wizard.component.scss'] }) -export class DatasetWizardComponent extends CheckDeactivateBaseComponent implements OnInit {//IBreadCrumbComponent +export class DatasetWizardComponent extends CheckDeactivateBaseComponent implements OnInit {//IBreadCrumbComponent canDeactivate(): boolean { return !this.isDirty(); } @@ -141,7 +142,8 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme private authService: AuthService, private configurationService: ConfigurationService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -1026,7 +1028,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", id); @@ -1038,7 +1040,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", id); @@ -1051,7 +1053,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", id); @@ -1079,24 +1081,6 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme // }); // } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - public redirectToGrant() { this.router.navigate(['grants/edit/' + this.datasetWizardModel.dmp.grant.id]); } diff --git a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts index 7c25ac8bf..da184bdb4 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts @@ -1,26 +1,26 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { DatasetListingModel } from '../../../../core/model/dataset/dataset-listing'; -import { Router } from '@angular/router'; -import { DatasetStatus } from '../../../../core/common/enum/dataset-status'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import { BaseComponent } from '@common/base/base.component'; -import { takeUntil } from 'rxjs/operators'; -import * as FileSaver from 'file-saver'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { MatDialog } from '@angular/material/dialog'; -import { DatasetCopyDialogueComponent } from '../../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; -import { UntypedFormControl } from '@angular/forms'; -import { TranslateService } from '@ngx-translate/core'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; -import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; -import { AuthService } from '@app/core/services/auth/auth.service'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { Role } from '@app/core/common/enum/role'; import { Location } from '@angular/common'; -import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { UntypedFormControl } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { Role } from '@app/core/common/enum/role'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; +import { BaseComponent } from '@common/base/base.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { takeUntil } from 'rxjs/operators'; +import { DatasetStatus } from '../../../../core/common/enum/dataset-status'; +import { DatasetListingModel } from '../../../../core/model/dataset/dataset-listing'; +import { DatasetCopyDialogueComponent } from '../../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; @Component({ selector: 'app-dataset-listing-item-component', @@ -49,7 +49,8 @@ export class DatasetListingItemComponent extends BaseComponent implements OnInit private lockService: LockService, private location: Location, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -95,7 +96,7 @@ export class DatasetListingItemComponent extends BaseComponent implements OnInit .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", dataset.id); @@ -107,7 +108,7 @@ export class DatasetListingItemComponent extends BaseComponent implements OnInit .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", dataset.id); @@ -120,31 +121,13 @@ export class DatasetListingItemComponent extends BaseComponent implements OnInit .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", dataset.id); }); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - openShareDialog(dmpRowId: any, dmpRowName: any) { const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { // height: '250px', diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index db028f03d..1e4de03b2 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -1,38 +1,37 @@ import { Component, OnInit } from '@angular/core'; -import { BaseComponent } from '@common/base/base.component'; import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview'; +import { BaseComponent } from '@common/base/base.component'; // import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; -import { Observable, of as observableOf } from 'rxjs'; -import { ActivatedRoute, Router, Params } from '@angular/router'; -import { DatasetService } from '@app/core/services/dataset/dataset.service'; -import { TranslateService } from '@ngx-translate/core'; -import { AuthService } from '@app/core/services/auth/auth.service'; -import { MatDialog } from '@angular/material/dialog'; -import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; -import { UserService } from '@app/core/services/user/user.service'; -import { filter, takeUntil } from 'rxjs/operators'; -import { Role } from '@app/core/common/enum/role'; import { Location } from '@angular/common'; -import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; -import { DatasetStatus } from '@app/core/common/enum/dataset-status'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import * as FileSaver from 'file-saver'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { DatasetWizardEditorModel } from '../dataset-wizard/dataset-wizard-editor.model'; -import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import { UntypedFormControl } from '@angular/forms'; -import { DatasetCopyDialogueComponent } from '../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; -import { DmpService } from '@app/core/services/dmp/dmp.service'; -import { ResearcherModel } from '@app/core/model/researcher/researcher'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard'; -import { DmpStatus } from '@app/core/common/enum/dmp-status'; -import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview'; -import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; +import { UntypedFormControl } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Params, Router } from '@angular/router'; +import { DatasetStatus } from '@app/core/common/enum/dataset-status'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { Role } from '@app/core/common/enum/role'; +import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard'; +import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview'; +import { ResearcherModel } from '@app/core/model/researcher/researcher'; +import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { DatasetService } from '@app/core/services/dataset/dataset.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { UserService } from '@app/core/services/user/user.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; +import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { filter, takeUntil } from 'rxjs/operators'; +import { DatasetCopyDialogueComponent } from '../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; @Component({ @@ -73,7 +72,8 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { private datasetWizardService: DatasetWizardService, private lockService: LockService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -140,11 +140,13 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) .subscribe(lockStatus => { this.lockStatus = lockStatus - if(lockStatus){ - this.dialog.open(PopupNotificationDialogComponent,{data:{ - title:this.language.instant('DATASET-OVERVIEW.LOCKED.TITLE'), - message:this.language.instant('DATASET-OVERVIEW.LOCKED.MESSAGE') - }, maxWidth:'30em'}); + if (lockStatus) { + this.dialog.open(PopupNotificationDialogComponent, { + data: { + title: this.language.instant('DATASET-OVERVIEW.LOCKED.TITLE'), + message: this.language.instant('DATASET-OVERVIEW.LOCKED.MESSAGE') + }, maxWidth: '30em' + }); } }); } @@ -308,9 +310,9 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { } onUpdateCallbackError(error) { - this.uiNotificationService.snackBarNotification(error.error.message ? this.tryTranslate( error.error.message) : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error); + this.uiNotificationService.snackBarNotification(error.error.message ? this.tryTranslate(error.error.message) : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error); } - tryTranslate(errorMessage: string): string{ + tryTranslate(errorMessage: string): string { return errorMessage.replace('Field value of', this.language.instant('Field value of')) .replace('must be filled', this.language.instant('must be filled')); } @@ -335,7 +337,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "pdf", id); @@ -347,7 +349,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "docx", id); @@ -359,7 +361,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('datasets', "xml", id); @@ -372,29 +374,11 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { // .pipe(takeUntil(this._destroyed)) // .subscribe(response => { // const blob = new Blob([response.body], { type: 'application/json' }); - // const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + // const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); // FileSaver.saveAs(blob, filename); // }) // } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - openDmpSearchDialogue() { const formControl = new UntypedFormControl(); const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, { @@ -490,14 +474,14 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { }, maxWidth: '30em' }) - .afterClosed() - .pipe( - filter(x => x), - takeUntil(this._destroyed) - ) - .subscribe( _ =>{ - this.router.navigate(['datasets','edit',dataset.id, 'finalize']); - }) + .afterClosed() + .pipe( + filter(x => x), + takeUntil(this._destroyed) + ) + .subscribe(_ => { + this.router.navigate(['datasets', 'edit', dataset.id, 'finalize']); + }) @@ -547,17 +531,17 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result) { this.datasetWizardService.getSingle(dataset.id) - .pipe(takeUntil(this._destroyed)) - .subscribe(data => { - this.datasetWizardModel = data; - this.datasetWizardModel.status = DatasetStatus.Draft; - this.datasetWizardService.createDataset(this.datasetWizardModel) .pipe(takeUntil(this._destroyed)) - .subscribe( - data => this.onUpdateCallbackSuccess(), - error => this.onUpdateCallbackError(error) - ); - }); + .subscribe(data => { + this.datasetWizardModel = data; + this.datasetWizardModel.status = DatasetStatus.Draft; + this.datasetWizardService.createDataset(this.datasetWizardModel) + .pipe(takeUntil(this._destroyed)) + .subscribe( + data => this.onUpdateCallbackSuccess(), + error => this.onUpdateCallbackError(error) + ); + }); } }); } diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts index e9be2d83a..761e92394 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts @@ -2,11 +2,13 @@ import { Component, OnInit } from '@angular/core'; import { AbstractControl, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; -import { DmpBlueprintStatus } from '@app/core/common/enum/dmp-blueprint-status'; +import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-extra-field-data-type'; +import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { Role } from '@app/core/common/enum/role'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpDatasetProfile } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile'; import { DmpDatasetProfileSectionsFormModel } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile-sections-form.model'; @@ -16,7 +18,6 @@ import { LockModel } from '@app/core/model/lock/lock.model'; import { UserModel } from '@app/core/model/user/user'; import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; -import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; import { LicenseCriteria } from '@app/core/query/license/license-criteria'; import { RequestItem } from '@app/core/query/request-item'; import { AuthService } from '@app/core/services/auth/auth.service'; @@ -44,6 +45,7 @@ import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { Observable, interval } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; +import { nameof } from 'ts-simple-nameof'; import { DatasetPreviewDialogComponent } from '../dataset-preview/dataset-preview-dialog.component'; import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component'; import { AddOrganizationComponent } from '../editor/add-organization/add-organization.component'; @@ -54,10 +56,6 @@ import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '../editor/grant-tab/project-form-model'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; -import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-extra-field-data-type'; -import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; -import { nameof } from 'ts-simple-nameof'; interface Visible { value: boolean; diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index cbb4c5c1f..bde80aa87 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -5,13 +5,11 @@ import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { Role } from "@app/core/common/enum/role"; -import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { LockModel } from '@app/core/model/lock/lock.model'; import { UserModel } from '@app/core/model/user/user'; import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; import { BaseCriteria } from '@app/core/query/base-criteria'; -import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; import { GrantCriteria } from '@app/core/query/grant/grant-criteria'; import { RequestItem } from '@app/core/query/request-item'; import { AuthService } from '@app/core/services/auth/auth.service'; @@ -34,6 +32,8 @@ import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-mode import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model'; // import { IBreadCrumbComponent } from '@app/ui/misc/breadcrumb/definition/IBreadCrumbComponent'; // import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; +import { DmpBlueprint, DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { FormService } from '@common/forms/form-service'; import { FormValidationErrorsDialogComponent } from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component'; import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; @@ -41,11 +41,10 @@ import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; -import { Observable, interval, of as observableOf } from 'rxjs'; +import { interval } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component'; import { ExtraPropertiesFormModel } from './general-tab/extra-properties-form.model'; -import { DmpBlueprint, DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint'; @Component({ selector: 'app-dmp-editor-component', @@ -111,7 +110,8 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements private formService: FormService, private lockService: LockService, private configurationService: ConfigurationService, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -697,7 +697,7 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); }); @@ -708,7 +708,7 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); }); @@ -719,7 +719,7 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); }); @@ -730,7 +730,7 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -744,24 +744,6 @@ export class DmpEditorComponent extends CheckDeactivateBaseComponent implements this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - public enableForm() { if (this.formGroup.get('status').value !== DmpStatus.Finalized) { this.editMode = true; diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts index 7653744a1..716eeca7c 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts @@ -1,37 +1,38 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { DmpListingModel } from '../../../../core/model/dmp/dmp-listing'; -import { MatDialog } from '@angular/material/dialog'; -import { DmpInvitationDialogComponent } from '../../invitation/dmp-invitation-dialog.component'; -import { Router, ActivatedRoute } from '@angular/router'; -import { AuthService } from '../../../../core/services/auth/auth.service'; -import { LangChangeEvent, TranslateService } from '@ngx-translate/core'; -import { DmpStatus } from '../../../../core/common/enum/dmp-status'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { DmpService } from '@app/core/services/dmp/dmp.service'; -import { takeUntil, map } from 'rxjs/operators'; -import { BaseComponent } from '@common/base/base.component'; -import * as FileSaver from 'file-saver'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; -import { Role } from '@app/core/common/enum/role'; -import { LockService } from '@app/core/services/lock/lock.service'; import { Location } from '@angular/common'; -import { DmpModel } from '@app/core/model/dmp/dmp'; -import { UntypedFormGroup } from '@angular/forms'; -import { DmpEditorModel } from '../../editor/dmp-editor.model'; -import { CloneDialogComponent } from '../../clone/clone-dialog/clone-dialog.component'; -import { ProjectFormModel } from '../../editor/grant-tab/project-form-model'; -import { FunderFormModel } from '../../editor/grant-tab/funder-form-model'; -import { ExtraPropertiesFormModel } from '../../editor/general-tab/extra-properties-form.model'; -import { GrantTabModel } from '../../editor/grant-tab/grant-tab-model'; -import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; -import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { UntypedFormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { Router } from '@angular/router'; import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { Role } from '@app/core/common/enum/role'; import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; -import { nameof } from 'ts-simple-nameof'; +import { DmpModel } from '@app/core/model/dmp/dmp'; +import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; +import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; +import { BaseComponent } from '@common/base/base.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { Guid } from '@common/types/guid'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { map, takeUntil } from 'rxjs/operators'; +import { nameof } from 'ts-simple-nameof'; +import { DmpStatus } from '../../../../core/common/enum/dmp-status'; +import { DmpListingModel } from '../../../../core/model/dmp/dmp-listing'; +import { AuthService } from '../../../../core/services/auth/auth.service'; +import { CloneDialogComponent } from '../../clone/clone-dialog/clone-dialog.component'; +import { DmpEditorModel } from '../../editor/dmp-editor.model'; +import { ExtraPropertiesFormModel } from '../../editor/general-tab/extra-properties-form.model'; +import { FunderFormModel } from '../../editor/grant-tab/funder-form-model'; +import { GrantTabModel } from '../../editor/grant-tab/grant-tab-model'; +import { ProjectFormModel } from '../../editor/grant-tab/project-form-model'; +import { DmpInvitationDialogComponent } from '../../invitation/dmp-invitation-dialog.component'; @Component({ selector: 'app-dmp-listing-item-component', @@ -63,7 +64,8 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { private lockService: LockService, private location: Location, private httpClient: HttpClient, - private matomoService: MatomoService) { + private matomoService: MatomoService, + private fileUtils: FileUtils) { super(); } @@ -180,10 +182,10 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { if (!isNullOrUndefined(this.dmpFormGroup.get('profile').value)) { this.getBlueprintDefinition(Guid.parse(this.dmpFormGroup.get('profile').value), result => { - this.checkForGrant(result.definition); - this.checkForFunder(result.definition); - this.checkForProject(result.definition); - }); + this.checkForGrant(result.definition); + this.checkForFunder(result.definition); + this.checkForProject(result.definition); + }); } if (!isNewVersion) { @@ -218,10 +220,10 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.maxMultiplicity)].join('.'), ] ) - .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) - .subscribe( - data => successFunction(data), - ); + .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) + .subscribe( + data => successFunction(data), + ); } private checkForGrant(blueprint: DmpBlueprintDefinition) { @@ -309,7 +311,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); @@ -321,7 +323,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); @@ -333,7 +335,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); @@ -345,7 +347,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -359,24 +361,6 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - deleteClicked(id: string) { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) .subscribe(lockStatus => { diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 0a19048fd..6b93ccacd 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -1,56 +1,57 @@ -import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {ActivatedRoute, Params, Router} from '@angular/router'; -import {DatasetStatus} from '@app/core/common/enum/dataset-status'; -import {DmpStatus} from '@app/core/common/enum/dmp-status'; -import {DatasetOverviewModel} from '@app/core/model/dataset/dataset-overview'; -import {DatasetsToBeFinalized} from '@app/core/model/dataset/datasets-toBeFinalized'; -import {DmpOverviewModel} from '@app/core/model/dmp/dmp-overview'; -import {UserInfoListingModel} from '@app/core/model/user/user-info-listing'; -import {AuthService} from '@app/core/services/auth/auth.service'; -import {DmpService} from '@app/core/services/dmp/dmp.service'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Params, Router } from '@angular/router'; +import { DatasetStatus } from '@app/core/common/enum/dataset-status'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview'; +import { DatasetsToBeFinalized } from '@app/core/model/dataset/datasets-toBeFinalized'; +import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview'; +import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import {ConfirmationDialogComponent} from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { DmpFinalizeDialogComponent, DmpFinalizeDialogInput, DmpFinalizeDialogOutput } from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; // import {BreadcrumbItem} from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; -import {BaseComponent} from '@common/base/base.component'; -import {TranslateService} from '@ngx-translate/core'; -import * as FileSaver from 'file-saver'; -import {Observable, of as observableOf} from 'rxjs'; -import {map, takeUntil} from 'rxjs/operators'; -import {Role} from "@app/core/common/enum/role"; -import {DmpInvitationDialogComponent} from '../invitation/dmp-invitation-dialog.component'; -import {ConfigurationService} from '@app/core/services/configuration/configuration.service'; -import {Location} from '@angular/common'; -import {UntypedFormGroup} from '@angular/forms'; -import {LockService} from '@app/core/services/lock/lock.service'; -import {VersionListingModel} from '@app/core/model/version/version-listing.model'; -import {CloneDialogComponent} from '../clone/clone-dialog/clone-dialog.component'; -import {DmpModel} from '@app/core/model/dmp/dmp'; -import {DmpEditorModel} from '../editor/dmp-editor.model'; -import {FunderFormModel} from '../editor/grant-tab/funder-form-model'; -import {ProjectFormModel} from '../editor/grant-tab/project-form-model'; -import {GrantTabModel} from '../editor/grant-tab/grant-tab-model'; -import {ExtraPropertiesFormModel} from '../editor/general-tab/extra-properties-form.model'; -import {StartNewDmpDialogComponent} from '../start-new-dmp-dialogue/start-new-dmp-dialog.component'; -import {MatomoService} from '@app/core/services/matomo/matomo-service'; -import {PopupNotificationDialogComponent} from '@app/library/notification/popup/popup-notification.component'; -import {DepositRepositoriesService} from '@app/core/services/deposit-repositories/deposit-repositories.service'; -import {DepositConfigurationModel} from '@app/core/model/deposit/deposit-configuration'; -import {DoiModel} from '@app/core/model/doi/doi'; -import {isNullOrUndefined} from '@app/utilities/enhancers/utils'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; -import { Guid } from '@common/types/guid'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { Location } from '@angular/common'; +import { UntypedFormGroup } from '@angular/forms'; import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; +import { Role } from "@app/core/common/enum/role"; +import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DmpModel } from '@app/core/model/dmp/dmp'; +import { DoiModel } from '@app/core/model/doi/doi'; +import { VersionListingModel } from '@app/core/model/version/version-listing.model'; +import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; +import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service'; +import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; +import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; +import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; +import { BaseComponent } from '@common/base/base.component'; +import { Guid } from '@common/types/guid'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { Observable } from 'rxjs'; +import { map, takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; +import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component'; +import { DmpEditorModel } from '../editor/dmp-editor.model'; +import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model'; +import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; +import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; +import { ProjectFormModel } from '../editor/grant-tab/project-form-model'; +import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component'; +import { StartNewDmpDialogComponent } from '../start-new-dmp-dialogue/start-new-dmp-dialog.component'; @Component({ selector: 'app-dmp-overview', @@ -95,7 +96,8 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { private configurationService: ConfigurationService, private location: Location, private lockService: LockService, - private matomoService: MatomoService + private matomoService: MatomoService, + private fileUtils: FileUtils ) { super(); } @@ -115,7 +117,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; - if(!this.hasDoi()) { + if (!this.hasDoi()) { this.selectedModel = this.dmp.dois[0]; } this.checkLockStatus(this.dmp.id); @@ -142,7 +144,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; - if(!this.hasDoi()) { + if (!this.hasDoi()) { this.selectedModel = this.dmp.dois[0]; } // this.checkLockStatus(this.dmp.id); @@ -162,12 +164,12 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } }); this.depositRepositoriesService.getAvailableRepos() - .pipe(takeUntil(this._destroyed)) - .subscribe( - repos => { - this.depositRepos = repos; - }, - error => this.depositRepos = []); + .pipe(takeUntil(this._destroyed)) + .subscribe( + repos => { + this.depositRepos = repos; + }, + error => this.depositRepos = []); } onFetchingDeletedCallbackError(redirectRoot: string) { @@ -252,11 +254,11 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.maxMultiplicity)].join('.'), ] ) - .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) - .subscribe( - data => successFunction(data), - error => this.onCallbackError(error) - ); + .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) + .subscribe( + data => successFunction(data), + error => this.onCallbackError(error) + ); } private checkForGrant(blueprint: DmpBlueprintDefinition) { @@ -426,7 +428,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "xml", id); @@ -438,7 +440,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "docx", id); @@ -450,7 +452,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "pdf", id); @@ -462,7 +464,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(complete => { const blob = new Blob([complete.body], { type: 'application/json' }); - const filename = this.getFilenameFromContentDispositionHeader(complete.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(complete.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('dmps', "json", id); }, async error => { @@ -476,24 +478,6 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error); } - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - roleDisplayFromList(value: UserInfoListingModel[]) { const principalId: string = this.authentication.userId()?.toString(); let role: number; @@ -603,7 +587,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { return this.depositRepos.filter(repo => !this.dmp.dois.find(doi => doi.repositoryId === repo.repositoryId)); } - moreDeposit(){ + moreDeposit() { return (this.dmp.dois.length < this.depositRepos.length); } @@ -648,17 +632,17 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe( complete => { - if(extraProperties.visible){ + if (extraProperties.visible) { //this.publish(this.dmp.id); this.dmpService.publish(this.dmp.id) - .pipe(takeUntil(this._destroyed)) - .subscribe(() => { - //this.hasPublishButton = false; - this.dmp.status = DmpStatus.Finalized; - this.onUpdateCallbackSuccess(); - }); + .pipe(takeUntil(this._destroyed)) + .subscribe(() => { + //this.hasPublishButton = false; + this.dmp.status = DmpStatus.Finalized; + this.onUpdateCallbackSuccess(); + }); } - else{ + else { this.dmp.status = DmpStatus.Finalized; this.onUpdateCallbackSuccess(); } @@ -679,22 +663,22 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { return this.dmpBlueprintService.getSingle(Guid.parse(blueprintId)) .pipe(map(result => { return result.definition.sections.some(section => { - if(!section.hasTemplates) + if (!section.hasTemplates) return false; return section.descriptionTemplates.some(template => { - if(!(template.minMultiplicity > 0)) + if (!(template.minMultiplicity > 0)) return false; let count = 0; dmpModel.datasets.filter(dataset => dataset.dmpSectionIndex === (section.ordinal - 1)).forEach(dataset => { - if(Guid.parse(dataset.profile.id) === template.descriptionTemplateId){ + if (Guid.parse(dataset.profile.id) === template.descriptionTemplateId) { count++; } }) - if(count < template.minMultiplicity){ + if (count < template.minMultiplicity) { this.dialog.open(PopupNotificationDialogComponent, { data: { - title: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.TITLE', {'minMultiplicity': template.minMultiplicity}), - message: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.MESSAGE', ) + title: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.TITLE', { 'minMultiplicity': template.minMultiplicity }), + message: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.MESSAGE',) }, maxWidth: '30em' }); return true; @@ -766,7 +750,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.router.navigate(['/datasets', 'new', this.dmp.id]); } - selectDoi(doiModel: DoiModel){ + selectDoi(doiModel: DoiModel) { this.selectedModel = doiModel; const foundIdx = this.dmp.dois.findIndex(el => el.id == doiModel.id); this.dmp.dois.splice(foundIdx, 1); @@ -775,17 +759,17 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { createDoiLink(doiModel: DoiModel): string { const repository = this.depositRepos.find(r => r.repositoryId == doiModel.repositoryId); - if(typeof repository !== "undefined"){ - if(doiModel.repositoryId == "Zenodo"){ + if (typeof repository !== "undefined") { + if (doiModel.repositoryId == "Zenodo") { const doiarr = doiModel.doi.split('.'); const id = doiarr[doiarr.length - 1]; return repository.repositoryRecordUrl + id; } - else{ + else { return repository.repositoryRecordUrl + doiModel.doi; } } - else{ + else { return ""; } } @@ -888,11 +872,13 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) .subscribe(lockStatus => { this.lockStatus = lockStatus - if(lockStatus){ - this.dialog.open(PopupNotificationDialogComponent,{data:{ - title:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.TITLE'), - message:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.MESSAGE') - }, maxWidth:'30em'}); + if (lockStatus) { + this.dialog.open(PopupNotificationDialogComponent, { + data: { + title: this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.TITLE'), + message: this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.MESSAGE') + }, maxWidth: '30em' + }); } }); } diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts index 222299821..c11d835c6 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts @@ -50,6 +50,7 @@ import {HttpErrorResponse} from "@angular/common/http"; import * as FileSaver from "file-saver"; import { FetcherExternalReference } from '@app/core/model/external-reference/external-reference'; import { ExternalReferencesType } from '@app/core/common/enum/external-references-type'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; @Component({ selector: 'app-form-field', @@ -129,7 +130,8 @@ export class FormFieldComponent extends BaseComponent implements OnInit { private fileService: FileService, private cdr: ChangeDetectorRef, private uiNotificationService: UiNotificationService, - public dialog: MatDialog + public dialog: MatDialog, + private fileUtils: FileUtils ) { super(); @@ -704,31 +706,12 @@ export class FormFieldComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(response => { const blob = new Blob([response.body], {type: this.form.value.value.type}); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); }); } - // create a fileUtils/ fileHelper file and add this function (and any other possibly generic) there - getFilenameFromContentDispositionHeader(header: string): string { - const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); - - const matches = header.match(regex); - let filename: string; - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; - if (match.includes('filename="')) { - filename = match.substring(10, match.length - 1); - break; - } else if (match.includes('filename=')) { - filename = match.substring(9); - break; - } - } - return filename; - } - // isImageFile(fileType: string) { // if(!fileType) { // return false; diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 81990f863..42d059b9e 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -200,13 +200,13 @@ }, "COMMONS": { "LISTING-COMPONENT": { - "SEARCH-FILTER-BTN":"Filter Results", + "SEARCH-FILTER-BTN": "Filter Results", "CLEAR-ALL-FILTERS": "clear all filters", - "FILTERS-SAVE-AS":"Save as", - "CANCEL":"Cancel", - "APPLY-FILTERS":"Apply Filters", - "TITLE":"Filters", - "ADD-NEW":"Add new", + "FILTERS-SAVE-AS": "Save as", + "CANCEL": "Cancel", + "APPLY-FILTERS": "Apply Filters", + "TITLE": "Filters", + "ADD-NEW": "Add new", "SETTINGS": { "TITLE": "Settings", "APPLY": "Apply", @@ -221,15 +221,15 @@ }, "SETTINGS-PICKER": { "DRAFT-FILTERS": "Draft profile", - "RENAME":"Rename", - "NAME":"Name", - "USER":"User", - "SHARE":"Share", - "CANCEL":"Cancel" + "RENAME": "Rename", + "NAME": "Name", + "USER": "User", + "SHARE": "Share", + "CANCEL": "Cancel" }, "BREADCRUMBS": { - "OVERVIEW":"Overview", - "HOME":"Board", + "OVERVIEW": "Overview", + "HOME": "Board", "DESCRIPTION-TEMPLATE-TYPES": "Description Types", "NEW-DESCRIPTION-TEMPLATE-TYPE": "New", "EDIT-DESCRIPTION-TEMPLATE-TYPE": "Edit", @@ -362,8 +362,8 @@ "UNTITLED": "Untitled", "QUESTION": "Question", "TEMPLATE-OUTLINE": "Template outline", - "ERRORS":{ - "USER-NOT-FOUND":"User not found." + "ERRORS": { + "USER-NOT-FOUND": "User not found." } }, "PAGE-INFO": { @@ -539,7 +539,7 @@ "FIELD-VALIDATOR-TITLE": "Validator Data", "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", "EXTERNAL-DATASET-TYPE-NAME": "Type", - "EXTERNAL-DATASET-TYPES":{ + "EXTERNAL-DATASET-TYPES": { "PRODUCED": "Produced dataset", "REUSED": "Reused dataset", "OTHER": "Other" @@ -564,9 +564,9 @@ "ACTIONS": { "ADD-RULE": "Add Visibility Rule +" }, - "STATUS":{ - "CALCULATING-PREVIEW":"... calculating preview", - "PREVIEW-UPDATED":"Preview updated!" + "STATUS": { + "CALCULATING-PREVIEW": "... calculating preview", + "PREVIEW-UPDATED": "Preview updated!" } }, "RULE": { @@ -805,9 +805,9 @@ "DOWNLOAD-DOCX": "Download DOCX", "COPY-DESCRIPTION": "Copy Description", "UPDATE-DATASET-PROFILE": "Update Template", - "VALIDATE":"Validate", - "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", - "CONFIRM" : "Yes", + "VALIDATE": "Validate", + "UNDO-FINALIZATION-QUESTION": "Undo finalization?", + "CONFIRM": "Yes", "REJECT": "No" }, "MESSAGES": { @@ -843,8 +843,8 @@ "NEXT": "Next", "ERROR-MESSAGE": "Does not contain this Dataset Template" }, - "LOCKED":{ - "TITLE":"Dataset is locked", + "LOCKED": { + "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, @@ -881,9 +881,9 @@ "AUTHORIZE": "Proceed to authorization", "CANCEL": "Cancel" }, - "LOCKED-DIALOG":{ + "LOCKED-DIALOG": { "TITLE": "DMP is locked", - "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." + "MESSAGE": "Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." }, "MIN-DESCRIPTIONS-DIALOG": { "TITLE": "Min({{minMultiplicity}}) datasets needed using this template.", @@ -896,14 +896,14 @@ "DELETED-DATASET": "The requested dataset is deleted", "FORBIDEN-DATASET": "You are not allowed to access this dataset" }, - "LOCKED":{ + "LOCKED": { "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." }, - "FINALISE-POPUP":{ - "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", - "CONFIRM":"OK", - "CANCEL":"Cancel" + "FINALISE-POPUP": { + "MESSAGE": "You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM": "OK", + "CANCEL": "Cancel" } }, "DATASET-LISTING": { @@ -1023,18 +1023,17 @@ "CANCEL": "Cancel", "APPLY-FILTERS": "Apply filters" }, - "CONFIRM-DELETE-DIALOG":{ + "CONFIRM-DELETE-DIALOG": { "MESSAGE": "Would you like to delete this Description Type?", "CONFIRM-BUTTON": "Yes, delete", "CANCEL-BUTTON": "No" }, "ACTIONS": { "DELETE": "Delete", - "EDIT":"Edit" + "EDIT": "Edit" }, "SUCCESSFUL-DELETE": "Successful Delete", "UNSUCCESSFUL-DELETE": "This item could not be deleted." - }, "DATASET-UPLOAD": { "TITLE": "Import Dataset", @@ -1072,10 +1071,23 @@ }, "FIELDS": { "TITLE": "Fields", - "LABEL": "Name", - "TYPE": "Type", - "DATATYPE": "Data Type", - "REQUIRED": "Required", + "NAME": "Name", + "SECTIONS": "Sections", + "SECTION-PREFIX": "Section", + "SECTION-NAME": "Section Name", + "SECTION-DESCRIPTION": "Section Description", + "SYSTEM-FIELDS": "System Fields", + "SYSTEM-FIELD": "System Field", + "FIELD-TYPE": "Field Type", + "FIELD-LABEL": "Label", + "FIELD-PLACEHOLDER": "Placeholder", + "FIELD-DESCRIPTION": "Description", + "FIELD-DATA-TYPE": "Data Type", + "FIELD-REQUIRED": "Required", + "DESCRIPTION-TEMPLATES": "Description Templates", + "DESCRIPTION-TEMPLATE-LABEL": "Label", + "DESCRIPTION-TEMPLATE-MIN-MULTIPLICITY": "Min Multiplicity", + "DESCRIPTION-TEMPLATE-MAX-MULTIPLICITY": "Max Multiplicity", "EXTERNAL-AUTOCOMPLETE": { "TITLE": "Autocomplete Data", "MULTIPLE-AUTOCOMPLETE": "Multiple Autocomplete", @@ -1087,13 +1099,18 @@ } }, "ACTIONS": { + "ADD-EXTRA-FIELD": "Add extra field", + "REMOVE-SYSTEM-FIELD": "Delete", + "REMOVE-EXTRA-FIELD": "Delete", + "REMOVE-SECTION": "Remove Section", + "ADD-SECTION": "Add Section", "SAVE": "Save", "CANCEL": "Cancel", "DELETE": "Delete", "FINALIZE": "Finalize", "DOWNLOAD-XML": "Download XML" }, - "CONFIRM-DELETE-DIALOG":{ + "CONFIRM-DELETE-DIALOG": { "MESSAGE": "Would you like to delete this DMP template?", "CONFIRM-BUTTON": "Yes, delete", "CANCEL-BUTTON": "No" @@ -1226,7 +1243,7 @@ "ORGANISATION-IDENTIFIER-EXSTS": "Organization identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organization in the organizations list.", - "SAVE":"Save", + "SAVE": "Save", "CANCEL": "Cancel" }, "FUNDING-INFO": { @@ -1257,9 +1274,9 @@ "SAVE": "Save", "CANCEL": "Cancel" }, - "LOCKED":{ - "TITLE":"DMP is locked", - "MESSAGE":"Somebody else is modifying the DMP at this moment. You may view the dataset but you cannot make any changes." + "LOCKED": { + "TITLE": "DMP is locked", + "MESSAGE": "Somebody else is modifying the DMP at this moment. You may view the dataset but you cannot make any changes." } }, "DMP-BLUEPRINT-LISTING": { @@ -1278,16 +1295,16 @@ "CANCEL": "Cancel", "APPLY-FILTERS": "Apply filters" }, - "CONFIRM-DELETE-DIALOG":{ + "CONFIRM-DELETE-DIALOG": { "MESSAGE": "Would you like to delete this DMP Blueprint?", "CONFIRM-BUTTON": "Yes, delete", "CANCEL-BUTTON": "No" }, "ACTIONS": { "DELETE": "Delete", - "EDIT":"Edit", + "EDIT": "Edit", "CLONE": "Clone", - "DOWNLOAD-XML":"Download XML" + "DOWNLOAD-XML": "Download XML" }, "IMPORT": { "UPLOAD-XML": "Import", @@ -1298,7 +1315,7 @@ }, "SUCCESSFUL-DELETE": "Successful Delete", "UNSUCCESSFUL-DELETE": "This item could not be deleted.", - "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" + "TEMPLATE-UPLOAD-SUCCESS": "Template successfully uploaded" }, "DYNAMIC-FORM": { "FIELDS": { @@ -1426,7 +1443,7 @@ "ABOUT": "Versioning is automated.", "QUESTION": "It seems your Dataset Template is outdated. Do you want to update it to the latest version?" }, - "ERRORS":{ + "ERRORS": { "ERROR-OCCURED": "An error occurred.", "MESSAGE": "Message: " }, @@ -1603,9 +1620,28 @@ "PUBLISHED": "Published", "STATUS": "Status" }, - "DESCRIPTION-TEMPLATE-TYPE-STATUS":{ + "DESCRIPTION-TEMPLATE-TYPE-STATUS": { "FINALIZED": "Finalized", "DRAFT": "Draft" + }, + "DMP-BLUEPRINT-SYSTEM-FIELD-TYPE": { + "TEXT": "Title", + "HTML_TEXT": "Description", + "RESEARCHERS": "Researchers", + "ORGANIZATIONS": "Organizations", + "LANGUAGE": "Language", + "CONTACT": "Contact", + "FUNDER": "Funder", + "GRANT": "Grant", + "PROJECT": "Project", + "LICENSE": "License", + "ACCESS_RIGHTS": "Access" + }, + "DMP-BLUEPRINT-EXTRA-FIELD-DATA-TYPE": { + "DATE": "Date", + "NUMBER": "Number", + "TEXT": "Text", + "EXTERNAL-AUTOCOMPLETE": "External AutoComplete" } }, "ADDRESEARCHERS-EDITOR": { @@ -2050,4 +2086,4 @@ "FINALIZED": "Finalized", "DELETED": "Deleted" } -} +} \ No newline at end of file From 51cc5f4fd96b22887d788da54f915028cc614822 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 25 Oct 2023 18:15:41 +0300 Subject: [PATCH 10/25] dmp blueprint frontend cleanup --- .../dmp-blueprint/dmp-associated-profile.ts | 4 -- .../dmp-blueprint-external-autocomplete.ts | 7 -- .../dmp-blueprint/dmp-blueprint-field.ts | 13 ---- .../src/app/core/model/dmp/dmp-listing.ts | 2 - .../src/app/core/model/dmp/dmp-overview.ts | 2 - .../recent-dmp-activity.model.ts | 6 +- .../dmp-blueprint/dmp-blueprint.module.ts | 8 +-- .../editor/dmp-blueprint-editor.component.ts | 20 ------ ...l-autocomplete-field-editor.component.html | 22 ------ ...l-autocomplete-field-editor.component.scss | 13 ---- ...nal-autocomplete-field-editor.component.ts | 17 ----- ...xternal-autocomplete-field-editor.model.ts | 32 --------- .../dmp-blueprint-criteria.component.html | 23 ------ .../dmp-blueprint-criteria.component.scss | 17 ----- .../dmp-blueprint-criteria.component.ts | 69 ------------------ .../dmp-blueprint-listing.component.html | 34 ++++----- .../dmp-blueprint-listing.component.ts | 53 +++++++++++--- ...mport-dmp-blueprint.dialog.component.html} | 2 +- ...mport-dmp-blueprint.dialog.component.scss} | 0 .../import-dmp-blueprint.dialog.component.ts} | 27 ++++--- .../src/app/ui/dashboard/dashboard.module.ts | 2 - .../dmp-info-counter.component.css | 71 ------------------- .../dmp-info-counter.component.html | 32 --------- .../dmp-info-counter.component.ts | 28 -------- .../dataset-copy-dialogue.component.ts | 5 -- .../src/app/ui/dmp/editor/dmp-editor.model.ts | 39 ---------- 26 files changed, 74 insertions(+), 474 deletions(-) delete mode 100644 dmp-frontend/src/app/core/model/dmp-blueprint/dmp-associated-profile.ts delete mode 100644 dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-external-autocomplete.ts delete mode 100644 dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-field.ts delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.html delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.scss delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.ts delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model.ts delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.html delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.scss delete mode 100644 dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.ts rename dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/{criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.html => import-dmp-blueprint/import-dmp-blueprint.dialog.component.html} (96%) rename dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/{criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.scss => import-dmp-blueprint/import-dmp-blueprint.dialog.component.scss} (100%) rename dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/{criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.ts => import-dmp-blueprint/import-dmp-blueprint.dialog.component.ts} (60%) delete mode 100644 dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.css delete mode 100644 dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.html delete mode 100644 dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.ts diff --git a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-associated-profile.ts b/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-associated-profile.ts deleted file mode 100644 index 668762d52..000000000 --- a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-associated-profile.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DmpAssociatedProfileModel { - id: String; - label: String; -} diff --git a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-external-autocomplete.ts b/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-external-autocomplete.ts deleted file mode 100644 index de6f53f7a..000000000 --- a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-external-autocomplete.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface DmpBlueprintExternalAutoCompleteField { - url: string; - optionsRoot: string; - multiAutoComplete: boolean; - label: string; - value: string; -} diff --git a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-field.ts b/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-field.ts deleted file mode 100644 index 35b0a85da..000000000 --- a/dmp-frontend/src/app/core/model/dmp-blueprint/dmp-blueprint-field.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DmpBlueprintExtraFieldDataType } from '../../common/enum/dmp-blueprint-field-type'; -import { DmpBlueprintType } from '../../common/enum/dmp-blueprint-type'; -import { DmpBlueprintExternalAutoCompleteFieldDataEditorModel } from '../../../ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model'; - -export interface DmpBlueprintField { - id: string; - type: DmpBlueprintType; - dataType: DmpBlueprintExtraFieldDataType; - required: boolean; - label: string; - value: any; - externalAutocomplete?: DmpBlueprintExternalAutoCompleteFieldDataEditorModel; -} diff --git a/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts b/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts index 65179ce21..b7423fa67 100644 --- a/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts +++ b/dmp-frontend/src/app/core/model/dmp/dmp-listing.ts @@ -1,5 +1,4 @@ import { DmpStatus } from "../../common/enum/dmp-status"; -import { DmpAssociatedProfileModel } from '../dmp-blueprint/dmp-associated-profile'; export interface DmpListingModel { id: string; @@ -18,7 +17,6 @@ export interface DmpListingModel { groupId: string; version: number; datasets: any[]; - associatedProfiles: DmpAssociatedProfileModel[]; users: any[]; public: boolean; } diff --git a/dmp-frontend/src/app/core/model/dmp/dmp-overview.ts b/dmp-frontend/src/app/core/model/dmp/dmp-overview.ts index d8679633e..9dfff2490 100644 --- a/dmp-frontend/src/app/core/model/dmp/dmp-overview.ts +++ b/dmp-frontend/src/app/core/model/dmp/dmp-overview.ts @@ -1,6 +1,5 @@ import { OrganizationModel } from "../organisation/organization"; import { UserInfoListingModel } from "../user/user-info-listing"; -import { DmpAssociatedProfileModel } from "../dmp-blueprint/dmp-associated-profile"; import { ResearcherModel } from "../researcher/researcher"; import { GrantOverviewModel } from "../grant/grant-overview"; import { DatasetOverviewModel } from "../dataset/dataset-overview"; @@ -18,7 +17,6 @@ export interface DmpOverviewModel { groupId: string; description: string; grant: GrantOverviewModel; - associatedProfiles: DmpAssociatedProfileModel[]; users: UserInfoListingModel[]; organisations: OrganizationModel[]; datasets: DatasetOverviewModel[]; diff --git a/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts b/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts index 77fdf6486..b9037b771 100644 --- a/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts +++ b/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts @@ -1,14 +1,10 @@ -import { RecentActivityModel } from './recent-activity.model'; -import { RecentDatasetModel } from './recent-dataset-activity.model'; -import { DmpAssociatedProfileModel } from '../dmp-blueprint/dmp-associated-profile'; -import { UserInfoListingModel } from '../user/user-info-listing'; import { DatasetUrlListing } from '../dataset/dataset-url-listing'; +import { RecentActivityModel } from './recent-activity.model'; export class RecentDmpModel extends RecentActivityModel { doi: String; extraProperties: Map; datasets: DatasetUrlListing[]; - associatedProfiles: DmpAssociatedProfileModel[]; organisations: String; groupId: string; } diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/dmp-blueprint.module.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/dmp-blueprint.module.ts index aabdcff94..c0cce8cea 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/dmp-blueprint.module.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/dmp-blueprint.module.ts @@ -12,11 +12,9 @@ import { CommonUiModule } from '@common/ui/common-ui.module'; import { NgxDropzoneModule } from "ngx-dropzone"; import { DmpBlueprintRoutingModule } from './dmp-blueprint.routing'; import { DmpBlueprintEditorComponent } from './editor/dmp-blueprint-editor.component'; -import { DmpBlueprintExternalAutocompleteFieldEditorComponent } from './editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component'; -import { DialodConfirmationUploadDmpBlueprints } from './listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component'; -import { DmpBlueprintCriteriaComponent } from './listing/criteria/dmp-blueprint-criteria.component'; import { DmpBlueprintListingComponent } from './listing/dmp-blueprint-listing.component'; import { DmpBlueprintListingFiltersComponent } from "./listing/filters/dmp-blueprint-listing-filters.component"; +import { ImportDmpBlueprintDialogComponent } from './listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component'; @NgModule({ imports: [ @@ -37,9 +35,7 @@ import { DmpBlueprintListingFiltersComponent } from "./listing/filters/dmp-bluep DmpBlueprintEditorComponent, DmpBlueprintListingComponent, DmpBlueprintListingFiltersComponent, - DmpBlueprintCriteriaComponent, - DialodConfirmationUploadDmpBlueprints, - DmpBlueprintExternalAutocompleteFieldEditorComponent + ImportDmpBlueprintDialogComponent ] }) export class DmpBlueprintModule { } 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 b58df63a5..f25269990 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 @@ -770,24 +770,4 @@ export class DmpBlueprintEditorComponent extends BaseEditor -
-
{{'DMP-BLUEPRINT-EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE.TITLE' | translate}}
- - {{'DMP-BLUEPRINT-EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE.MULTIPLE-AUTOCOMPLETE' | translate}} - - - - - - - - - - - - - - -
-
diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.scss b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.scss deleted file mode 100644 index fdb51b6d5..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -.external-autocomplete { - margin-bottom: 10px; - - .centered-row-item { - align-items: center; - display: flex; - } -} - -.external-autocomplete-field { - margin-left: auto; - background: aliceblue; -} diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.ts deleted file mode 100644 index cf297e202..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; -import { DmpBlueprintExternalAutoCompleteFieldDataEditorModel } from './dmp-blueprint-external-autocomplete-field-editor.model'; - -@Component({ - selector: 'app-dmp-blueprint-external-autocomplete-field-editor-component', - styleUrls: ['./dmp-blueprint-external-autocomplete-field-editor.component.scss'], - templateUrl: './dmp-blueprint-external-autocomplete-field-editor.component.html' -}) -export class DmpBlueprintExternalAutocompleteFieldEditorComponent implements OnInit { - - @Input() form: UntypedFormGroup - private externalAutocomplete: DmpBlueprintExternalAutoCompleteFieldDataEditorModel; - - ngOnInit() { - } -} diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model.ts deleted file mode 100644 index 35c4bf1e2..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { UntypedFormGroup, UntypedFormBuilder } from "@angular/forms"; -import { DmpBlueprintExternalAutoCompleteField } from "../../../../../core/model/dmp-blueprint/dmp-blueprint-external-autocomplete"; - -export class DmpBlueprintExternalAutoCompleteFieldDataEditorModel { - - public url: string; - public optionsRoot: string; - public multiAutoComplete: boolean = false; - public label: string; - public value: string; - - buildForm(disabled: boolean = false, skipDisable: Array = []): UntypedFormGroup { - const formGroup = new UntypedFormBuilder().group({ - url: [{ value: this.url, disabled: (disabled && !skipDisable.includes('DmpBlueprintExternalAutoCompleteFieldDataEditorModel.url')) }], - optionsRoot: [{ value: this.optionsRoot, disabled: (disabled && !skipDisable.includes('DmpBlueprintExternalAutoCompleteFieldDataEditorModel.optionsRoot')) }], - multiAutoComplete: [{ value: this.multiAutoComplete, disabled: (disabled && !skipDisable.includes('DmpBlueprintExternalAutoCompleteFieldDataEditorModel.multiAutoComplete')) }], - label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('DmpBlueprintExternalAutoCompleteFieldDataEditorModel.label')) }], - value: [{ value: this.value, disabled: (disabled && !skipDisable.includes('DmpBlueprintExternalAutoCompleteFieldDataEditorModel.value')) }], - - }); - return formGroup; - } - - fromModel(item: DmpBlueprintExternalAutoCompleteField): DmpBlueprintExternalAutoCompleteFieldDataEditorModel { - this.url = item.url; - this.optionsRoot = item.optionsRoot; - this.multiAutoComplete = item.multiAutoComplete; - this.label = item.label; - this.value = item.value; - return this; - } -} diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.html b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.html deleted file mode 100644 index f1a256ced..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
- {{'CRITERIA.USERS.SHOW' | translate}}: -
- - - - {{'BLUEPRINT-STATUS.NONE' | translate}} - {{'BLUEPRINT-STATUS.DRAFT' | translate}} - {{'BLUEPRINT-STATUS.FINALIZED' | translate}} - - - -
-
- - - search - -
-
diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.scss b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.scss deleted file mode 100644 index 9b64c055a..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -.mat-form-field{ - display: inline-block !important; -} - -:host ::ng-deep .status-form-field .mat-form-field-wrapper { - background-color: white !important; - padding-bottom: 0 !important; -} - -:host ::ng-deep .search-form-field .mat-form-field-wrapper { - background-color: white !important; - padding-bottom: 0 !important; -} - -:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { - padding: 0.3rem 0rem 0.6rem 0rem !important; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.ts deleted file mode 100644 index 5d832395c..000000000 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dmp-blueprint-criteria.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; -import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service'; -import { BaseCriteriaComponent } from '@app/ui/misc/criteria/base-criteria.component'; -import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; -import { TranslateService } from '@ngx-translate/core'; - -@Component({ - selector: 'app-dmp-blueprint-criteria-component', - templateUrl: './dmp-blueprint-criteria.component.html', - styleUrls: ['./dmp-blueprint-criteria.component.scss'], -}) -export class DmpBlueprintCriteriaComponent extends BaseCriteriaComponent implements OnInit { - - public criteria: DmpBlueprintCriteria = new DmpBlueprintCriteria(); - - constructor( - private dmpBlueprintService: DmpBlueprintService, - private dialog: MatDialog, - private language: TranslateService - ) { - super(new ValidationErrorModel()); - } - - ngOnInit() { - super.ngOnInit(); - if (this.criteria == null) { this.criteria = new DmpBlueprintCriteria(); } - } - - setCriteria(criteria: DmpBlueprintCriteria): void { - this.criteria = criteria; - } - - onCallbackError(error: any) { - this.setErrorModel(error.error); - } - - controlModified(): void { - this.clearErrorModel(); - if (this.refreshCallback != null && - (this.criteria.like == null || this.criteria.like.length === 0 || this.criteria.like.length > 2) - ) { - this.refreshCallback(); - } - } - - - // openDialog(): void { - // const dialogRef = this.dialog.open(DialodConfirmationUploadDmpBlueprints, { - // restoreFocus: false, - // data: { - // message: this.language.instant('DMP-BLUEPRINT-LISTING.UPLOAD.UPLOAD-XML-FILE-TITLE'), - // confirmButton: this.language.instant('DMP-BLUEPRINT-LISTING.UPLOAD.UPLOAD-XML'), - // cancelButton: this.language.instant('DMP-BLUEPRINT-LISTING.UPLOAD.UPLOAD-XML-FILE-CANCEL'), - // name: '', - // file: FileList, - // sucsess: false - // } - // }); - // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(data => { - // if (data && data.sucsess && data.name != null && data.file != null) { - // this.dmpBlueprintService.uploadFile(data.file, data.name) - // .pipe(takeUntil(this._destroyed)) - // .subscribe(); - // } - // }); - // } -} diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html index 858d209f7..8819138a9 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html @@ -8,27 +8,26 @@
- +
+ +
+
- + - + - + @@ -43,15 +42,13 @@
- {{item?.label | nullifyValue}} + {{item?.label | nullifyValue}}
-
+
{{enumUtils.toDescriptionTemplateTypeStatusString(item.status) | nullifyValue}}
@@ -80,8 +77,7 @@
-
+
{{enumUtils.toDescriptionTemplateTypeStatusString(row.status) | nullifyValue}}
diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts index 4a12053d6..4a49a52ed 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts @@ -11,6 +11,7 @@ import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.servic import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseListingComponent } from '@common/base/base-listing-component'; import { PipeService } from '@common/formatting/pipe.service'; @@ -21,9 +22,11 @@ import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/ import { ColumnDefinition, ColumnsChangedEvent, HybridListingComponent, PageLoadEvent } from '@common/modules/hybrid-listing/hybrid-listing.component'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; +import { ImportDmpBlueprintDialogComponent } from './import-dmp-blueprint/import-dmp-blueprint.dialog.component'; @Component({ @@ -66,7 +69,8 @@ export class DmpBlueprintListingComponent extends BaseListingComponent { - // const blob = new Blob([response.body], { type: 'application/xml' }); - // const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); - // FileSaver.saveAs(blob, filename); - // }); + this.dmpBlueprintService.downloadXML(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + FileSaver.saveAs(blob, filename); + }); + } + + import(): void { + const dialogRef = this.dialog.open(ImportDmpBlueprintDialogComponent, { + restoreFocus: false, + data: { + message: this.language.instant('DMP-BLUEPRINT-LISTING.IMPORT.UPLOAD-XML-FILE-TITLE'), + confirmButton: this.language.instant('DMP-BLUEPRINT-LISTING.IMPORT.UPLOAD-XML'), + cancelButton: this.language.instant('DMP-BLUEPRINT-LISTING.IMPORT.UPLOAD-XML-FILE-CANCEL'), + name: '', + file: FileList, + sucsess: false + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(data => { + if (data && data.sucsess && data.name != null && data.file != null) { + this.dmpBlueprintService.uploadFile(data.file, data.name) + .pipe(takeUntil(this._destroyed)) + .subscribe(_ => { + this.uiNotificationService.snackBarNotification(this.language.instant('DMP-BLUEPRINT-LISTING.MESSAGES.TEMPLATE-UPLOAD-SUCCESS'), SnackBarNotificationLevel.Success); + this.ngOnInit(); + }, + error => { + this.uiNotificationService.snackBarNotification(error.message, SnackBarNotificationLevel.Error); + }); + } + }); } } @@ -277,9 +308,9 @@ export class DmpBlueprintListingComponent extends BaseListingComponent
- +
diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.scss b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component.scss similarity index 100% rename from dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.scss rename to dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component.scss diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component.ts similarity index 60% rename from dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.ts rename to dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component.ts index 6e8151659..5e214cdca 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/criteria/dialog-confirmation-upload-blueprint/dialog-confirmation-upload-blueprints.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/import-dmp-blueprint/import-dmp-blueprint.dialog.component.ts @@ -1,39 +1,38 @@ +import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Inject, Component } from '@angular/core'; @Component({ - selector: 'app-dialog-confirmation-upload', - templateUrl: './dialog-confirmation-upload-blueprints.component.html', - styleUrls: ['./dialog-confirmation-upload-blueprints.component.scss'] + templateUrl: './import-dmp-blueprint.dialog.component.html', + styleUrls: ['./import-dmp-blueprint.dialog.component.scss'] }) -export class DialodConfirmationUploadDmpBlueprints { +export class ImportDmpBlueprintDialogComponent { sizeError = false; - selectFile =false; + selectFile = false; maxFileSize: number = 1048576; selectedFileName: string; constructor( - public dialogRef: MatDialogRef, + public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any ) { } selectXML(event) { let file: FileList = null; - if(event.target && event.target.files){ + if (event.target && event.target.files) { file = event.target.files; - }else if(event.addedFiles && event.addedFiles.length){ + } else if (event.addedFiles && event.addedFiles.length) { file = event.addedFiles; } - if(!file) return;//no select closed with cancel . no file selected + if (!file) return;//no select closed with cancel . no file selected const size: number = file[0].size; // Get file size. this.sizeError = size > this.maxFileSize; // Checks if file size is valid. const formdata: FormData = new FormData(); if (!this.sizeError) { this.data.file = file; - this.selectFile=true; + this.selectFile = true; this.selectedFileName = file[0].name; } this.data.name = file[0].name; @@ -50,12 +49,12 @@ export class DialodConfirmationUploadDmpBlueprints { this.dialogRef.close(this.data); } - hasBlueprint():boolean{ + hasBlueprint(): boolean { return (this.selectFile && !this.sizeError); } //remove selected file - onRemove(){ - this.data.name=""; + onRemove() { + this.data.name = ""; this.selectFile = false; this.selectedFileName = ""; } diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.module.ts b/dmp-frontend/src/app/ui/dashboard/dashboard.module.ts index f5db07c30..48e536d65 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.module.ts +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.module.ts @@ -4,7 +4,6 @@ import { CardComponent } from '@app/ui/dashboard/card/card.component'; import { DashboardComponent } from '@app/ui/dashboard/dashboard.component'; import { DashboardRoutingModule } from '@app/ui/dashboard/dashboard.routing'; import { DatasetInfoCounterComponent } from '@app/ui/dashboard/dataset-info-counter/dataset-info-counter.component'; -import { DmpInfoCounterComponent } from '@app/ui/dashboard/dmp-info-counter/dmp-info-counter.component'; import { DraftsComponent } from '@app/ui/dashboard/drafts/drafts.component'; import { InfoCounterComponent } from '@app/ui/dashboard/info-counter/info-counter.component'; import { QuickWizardCreateAdd } from '@app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component'; @@ -41,7 +40,6 @@ import { FormattingModule } from '@app/core/formatting.module'; RecentVisitedActivityComponent, RecentEditedActivityComponent, DraftsComponent, - DmpInfoCounterComponent, DatasetInfoCounterComponent, RecentEditedDatasetActivityComponent, RecentEditedDmpActivityComponent diff --git a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.css b/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.css deleted file mode 100644 index 23ba20a1a..000000000 --- a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.css +++ /dev/null @@ -1,71 +0,0 @@ -.listing-item { - background-color: #ffffff; -} - -.icon { - /* color: rgb(112, 173, 71); */ - color: #08bd63; - /* color: #92d050; */ -} - -.gray-container { - letter-spacing: 5px; - color: #aaaaaa; -} - -.container-header { - display: flex; - align-items: baseline; - margin-top: 0px; - padding-top: 10px; - text-transform: uppercase; -} - -.container-header p { - letter-spacing: 5px; - color: #aaaaaa; - margin-bottom: 0px; -} - -/* .container-header :hover { - color: #4687e6; -} */ - -.about-item { - display: flex; - flex-wrap: wrap; -} - -.about-item .title { - margin: 2px 10px; -} - -.about-item p { - margin-left: auto; - margin-bottom: 0px; - padding-top: 7px; - color: #aaaaaa; -} - -.draft-icon { - color: #aaaaaa; -} - -.more-horiz { - font-size: 28px; - color: #aaaaaa; -} - -hr { - margin: 0.6em 0em; -} - -.date { - display: flex; -} - -.date p { - margin-left: auto; - margin-bottom: 0em; - color: #aaaaaa; -} diff --git a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.html b/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.html deleted file mode 100644 index a0aa2a65c..000000000 --- a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
-
-
-
-

- {{dmp.grantAbbreviation}}

-
-
-
-
- radio_button_checked -

{{dmp.label}}

-
-
-
-
-

{{dmp.description}}

-
-
-
-
-
-
{{profile.label}}
-
-
-
-
-
-

{{'DMP-BLUEPRINT-LISTING.COLUMNS.PUBLISHED' | translate}} {{dmp.creationTime | date: "shortDate"}}

-
-
-
diff --git a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.ts b/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.ts deleted file mode 100644 index f83c724c4..000000000 --- a/dmp-frontend/src/app/ui/dashboard/dmp-info-counter/dmp-info-counter.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; -import { Router } from '@angular/router'; -import { DmpListingModel } from '../../../core/model/dmp/dmp-listing'; - -@Component({ - selector: 'app-dmp-info-counter', - templateUrl: './dmp-info-counter.component.html', - styleUrls: ['./dmp-info-counter.component.css'] -}) -export class DmpInfoCounterComponent implements OnInit { - - @Input() dmp: DmpListingModel; - @Output() onClick: EventEmitter = new EventEmitter(); - - constructor(public router: Router) { } - - ngOnInit() { - } - - itemClicked() { - this.onClick.emit(this.dmp); - } - - grantClicked(grantId: String) { - // this.router.navigate(['/datasets/publicEdit/' + grantId]); - } - -} diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts index d0ba0a000..dc98a3e37 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts @@ -11,7 +11,6 @@ import { DmpService } from "../../../../core/services/dmp/dmp.service"; import { Inject } from "@angular/core"; import { DmpModel } from "../../../../core/model/dmp/dmp"; import { TranslateService } from "@ngx-translate/core"; -import { DmpAssociatedProfileModel } from '../../../../core/model/dmp-blueprint/dmp-associated-profile'; @Component({ selector: 'dataset-copy-dialogue-component', @@ -65,10 +64,6 @@ export class DatasetCopyDialogueComponent { return this.dmpService.getPaged(dmpDataTableRequest, "profiles").pipe(map(x => x.data)); } - existsDatasetDescriptionTemplate(associatedProfiles: DmpAssociatedProfileModel[]): boolean { - return associatedProfiles.some((profile) => profile.id === this.data.datasetProfileId); - } - datasetProfileValidate() { return this.dmpService.getSingle(this.data.formControl.value.id).pipe(map(result => result as DmpModel), map(result => { diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts index ffd71195b..119d31dfc 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts @@ -2,7 +2,6 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from "@angular/forms import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-field-type'; import { DmpBlueprintType } from '@app/core/common/enum/dmp-blueprint-type'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; -import { DmpBlueprintField } from '@app/core/model/dmp-blueprint/dmp-blueprint-field'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpDynamicField } from '@app/core/model/dmp/dmp-dynamic-field'; import { DmpDynamicFieldDependency } from '@app/core/model/dmp/dmp-dynamic-field-dependency'; @@ -11,7 +10,6 @@ import { ResearcherModel } from '@app/core/model/researcher/researcher'; import { UserModel } from '@app/core/model/user/user'; import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; import { ValidJsonValidator } from '@app/library/auto-complete/auto-complete-custom-validator'; -import { DmpBlueprintExternalAutoCompleteFieldDataEditorModel } from '@app/ui/admin/dmp-blueprint/editor/external-autocomplete/dmp-blueprint-external-autocomplete-field-editor.model'; import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model'; import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model'; @@ -214,40 +212,3 @@ export class DmpDynamicFieldDependencyEditorModel { }); } } - -export class DmpDefinitionFieldEditorModel implements DmpBlueprintField { - public id: string; - public type: DmpBlueprintType; - public dataType: DmpBlueprintExtraFieldDataType; - public required = false; - public label: string; - public value: any; - public externalAutocomplete?: DmpBlueprintExternalAutoCompleteFieldDataEditorModel; - - fromModel(item: DmpBlueprintField): DmpDefinitionFieldEditorModel { - this.type = item.type; - this.dataType = item.dataType; - this.required = item.required; - this.label = item.label; - this.id = item.id; - this.value = item.value; - if (item.externalAutocomplete) - this.externalAutocomplete = new DmpBlueprintExternalAutoCompleteFieldDataEditorModel().fromModel(item.externalAutocomplete); - return this; - } - - buildForm(): UntypedFormGroup { - const formGroup = new UntypedFormBuilder().group({ - type: [this.type], - id: [this.id], - dataType: [this.dataType], - required: [this.required], - label: [this.label], - value: [this.value] - }); - if (this.externalAutocomplete) { - formGroup.addControl('externalAutocomplete', this.externalAutocomplete.buildForm()); - } - return formGroup; - } -} From 129dbd163a7c65cf635c9e6844518b22408203e2 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 25 Oct 2023 20:53:47 +0300 Subject: [PATCH 11/25] minor fixes dmp blueprints and Dmps. --- .../model/builder/DmpBlueprintBuilder.java | 2 +- .../SystemFieldBuilder.java | 14 +- .../multiple-auto-complete.component.html | 4 +- .../dmp-editor-blueprint.component.html | 145 +++++++++--------- .../dmp-editor-blueprint.component.ts | 24 ++- dmp-frontend/src/app/ui/dmp/dmp.routing.ts | 15 +- .../editor/main-info/main-info.component.html | 1 + dmp-frontend/src/assets/config/config.json | 1 + dmp-frontend/src/assets/i18n/en.json | 4 + 9 files changed, 115 insertions(+), 95 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java index 38cb8584f..9bdd92024 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java @@ -74,7 +74,7 @@ public class DmpBlueprintBuilder extends BaseBuilder { +public class SystemFieldBuilder extends FieldBuilder { @Autowired public SystemFieldBuilder( @@ -21,12 +21,12 @@ public class SystemFieldBuilder extends FieldBuilder - + @@ -23,7 +23,7 @@ --> arrow_drop_down
-
+ diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html index bd2a4de2b..b9f8924af 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html @@ -33,6 +33,56 @@
+ + +
+
+
+
{{'DMP-EDITOR.FIELDS.NAME' | translate}} *
+
+ + {{'DMP-EDITOR.FIELDS.NAME' | translate}} + + + +
+
+
+
+
{{'DMP-EDITOR.FIELDS.DESCRIPTION' | translate}} *
+ + +
+
+
+
{{'DMP-EDITOR.FIELDS.BLUEPRINT' | translate}} *
+ + {{'DMP-EDITOR.FIELDS.BLUEPRINT' | translate}} + + + +
+
+
+ +
+
+
+
+

{{'DMP-EDITOR.ACTIONS.OR-CONTINUE-WITH' | translate}}

+
+
+ +
+
+
+
+
+
+
DMP Blueprint
@@ -73,58 +123,15 @@
- - +
-
-
-
-
0.1 Title of DMP *
- - Title - - - -
-
-
0.2 Description of DMP *
- - -
-
-
0.3 Blueprint of DMP *
- - Select blueprint - - - -
-
-
- -
-
-
-
-

or continue with

-
-
- -
-
-
-
-
-
+
@@ -139,8 +146,8 @@
{{i + 1}}.{{j + 1}} {{field.label}}*
{{field.description}}
-
-
+
+
@@ -149,12 +156,11 @@ {{'GENERAL.VALIDATION.REQUIRED' | translate}}
-
- +
+
-
+
{{'DMP-EDITOR.PLACEHOLDER.RESEARCHERS' | translate}} @@ -172,7 +178,7 @@ {{'DMP-EDITOR.ACTIONS.INSERT-MANUALLY' | translate}}
-
+
{{'DMP-EDITOR.PLACEHOLDER.ORGANIZATION' | translate}} @@ -189,7 +195,7 @@ {{'DMP-EDITOR.ACTIONS.INSERT-MANUALLY' | translate}}
-
+
@@ -202,7 +208,7 @@ {{'GENERAL.VALIDATION.REQUIRED' | translate}}
-
+
@@ -217,16 +223,16 @@
-
+
-
+
-
+
-
+
@@ -236,7 +242,7 @@ {{'GENERAL.VALIDATION.REQUIRED' | translate}}
-
+
@@ -249,7 +255,7 @@ {{'GENERAL.VALIDATION.REQUIRED' | translate}}
-
-
-
+
+
-
+
- +
-
+
-
+
@@ -342,6 +347,6 @@
-
+
-
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts index 761e92394..2b1b5d76d 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts @@ -56,6 +56,7 @@ import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '../editor/grant-tab/project-form-model'; +import { DmpBlueprintSectionFieldCategory } from '@app/core/common/enum/dmp-blueprint-section-field-category'; interface Visible { value: boolean; @@ -86,6 +87,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im isCreateNew = false; isCreateNewProject = false; isCreateNewFunder = false; + dmp: DmpEditorModel; dmpSectionIndex: number = 0; @@ -110,8 +112,6 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im sectionTemplates: Array> = new Array>(); - extraFieldTypesEnum = DmpBlueprintExtraFieldDataType; - private associates: UserModel[] = []; visibles: Visible[] = [ @@ -128,6 +128,16 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; + + + + + dmpBlueprintSectionFieldCategory = DmpBlueprintSectionFieldCategory; + dmpBlueprintSystemFieldType = DmpBlueprintSystemFieldType; + //public dmpBlueprintSystemFieldTypeEnum = this.enumUtils.getEnumValues(DmpBlueprintSystemFieldType); + dmpBlueprintExtraFieldDataType = DmpBlueprintExtraFieldDataType; + //public dmpBlueprintExtraFieldDataTypeEnum = this.enumUtils.getEnumValues(DmpBlueprintExtraFieldDataType); + constructor( private dmpBlueprintService: DmpBlueprintService, private datasetService: DatasetService, @@ -858,11 +868,11 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im nameof(x => x.isActive) ] ) - .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) - .subscribe( - data => successFunction(data), - error => this.onCallbackError(error) - ); + .pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed)) + .subscribe( + data => successFunction(data), + error => this.onCallbackError(error) + ); } registerFormEventsForDmpBlueprint(): void { diff --git a/dmp-frontend/src/app/ui/dmp/dmp.routing.ts b/dmp-frontend/src/app/ui/dmp/dmp.routing.ts index 3f8e41b86..2ea3435b6 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.routing.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.routing.ts @@ -1,14 +1,13 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '@app/core/auth-guard.service'; +import { CanDeactivateGuard } from '@app/library/deactivate/can-deactivate.guard'; +import { DmpCloneComponent } from './clone/dmp-clone.component'; +import { DmpEditorBlueprintComponent } from './dmp-editor-blueprint/dmp-editor-blueprint.component'; import { DmpEditorComponent } from './editor/dmp-editor.component'; import { InvitationAcceptedComponent } from './invitation/accepted/dmp-invitation-accepted.component'; import { DmpListingComponent } from './listing/dmp-listing.component'; -import { DmpWizardComponent } from './wizard/dmp-wizard.component'; import { DmpOverviewComponent } from './overview/dmp-overview.component'; -import { DmpCloneComponent } from './clone/dmp-clone.component'; -import { AuthGuard } from '@app/core/auth-guard.service'; -import { CanDeactivateGuard } from '@app/library/deactivate/can-deactivate.guard'; -import { DmpEditorBlueprintComponent } from './dmp-editor-blueprint/dmp-editor-blueprint.component'; const routes: Routes = [ { @@ -40,7 +39,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DMP-EDIT' }, - canDeactivate:[CanDeactivateGuard] + canDeactivate: [CanDeactivateGuard] }, { path: 'publicEdit/:publicId', @@ -49,7 +48,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DMP-PUBLIC-EDIT' }, - canDeactivate:[CanDeactivateGuard] + canDeactivate: [CanDeactivateGuard] }, { path: 'overview/:id', @@ -83,7 +82,7 @@ const routes: Routes = [ breadcrumbs: 'new', title: 'GENERAL.TITLES.DMP-NEW' }, - canDeactivate:[CanDeactivateGuard] + canDeactivate: [CanDeactivateGuard] }, // { // path: 'new/dataset', diff --git a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html index a083fdafb..61242374a 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html @@ -5,6 +5,7 @@
+ dgdfgdfgdf
1.1 {{'DMP-EDITOR.FIELDS.NAME' | translate}}*
diff --git a/dmp-frontend/src/assets/config/config.json b/dmp-frontend/src/assets/config/config.json index 95f451e8d..1ee43b27b 100644 --- a/dmp-frontend/src/assets/config/config.json +++ b/dmp-frontend/src/assets/config/config.json @@ -50,6 +50,7 @@ "value": "pl" } ], + "defaultBlueprintId": "86635178-36a6-484f-9057-a934e4eeecd5", "keycloak": { "enabled": true, "address": null, diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 42d059b9e..47bfb505e 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1156,6 +1156,7 @@ "RELATED-GRANT": "Related Grant", "DESCRIPTION": "Description", "DESCRIPTION-HINT": "Briefly describe the context and purpose of the DMP", + "BLUEPRINT": "Blueprint", "ORGANISATIONS": "Organizations", "ORGANISATIONS-HINT": "Add here the names of the organizations contributing to the creation and revision of the DMPs", "RESEARCHERS": "Researchers", @@ -1189,6 +1190,8 @@ }, "ACTIONS": { "GO-TO-GRANT": "Go To DMP Grant", + "DEFAULT-BLUEPRINT": "Default Blueprint", + "OR-CONTINUE-WITH": "or continue with", "GO-TO-DATASETS": "Go To Datasets", "SAVE-CHANGES": "Save Changes", "SAVE": "Save", @@ -1206,6 +1209,7 @@ "PLACEHOLDER": { "DESCRIPTION": "Fill with description", "ORGANIZATION": "Select organization", + "BLUEPRINT": "Select Blueprint", "AUTHORS": "Select authors", "RESEARCHERS": "Select researchers" }, From 4eca9b32c91cd4aaffd58cf555fd00da589b6143 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Thu, 26 Oct 2023 11:21:33 +0300 Subject: [PATCH 12/25] various backend fixes --- .../ExtraFieldBuilder.java | 2 +- .../dmpblueprintdefinition/FieldBuilder.java | 1 + .../SystemFieldBuilder.java | 2 +- .../dmpblueprintdefinition/ExtraField.java | 12 ++++---- .../dmpblueprintdefinition/SystemField.java | 12 ++++---- .../dmpblueprintdefinition/FieldPersist.java | 4 +-- .../src/main/resources/config/application.yml | 3 +- .../web/src/main/resources/config/errors.yml | 28 +++++++++++++++++++ 8 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 dmp-backend/web/src/main/resources/config/errors.yml diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/dmpblueprintdefinition/ExtraFieldBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/dmpblueprintdefinition/ExtraFieldBuilder.java index 6ebcafe4a..a64fd8412 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/dmpblueprintdefinition/ExtraFieldBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/dmpblueprintdefinition/ExtraFieldBuilder.java @@ -26,7 +26,7 @@ public class ExtraFieldBuilder extends FieldBuilder Date: Thu, 26 Oct 2023 12:07:04 +0300 Subject: [PATCH 13/25] rename External Reference to Reference --- ...nceEntity.java => DmpReferenceEntity.java} | 4 +- ...erenceEntity.java => ReferenceEntity.java} | 4 +- .../src/main/java/eu/eudat/model/Dmp.java | 11 ++ .../java/eu/eudat/model/DmpBlueprint.java | 11 -- ...ternalReference.java => DmpReference.java} | 18 +-- ...{ExternalReference.java => Reference.java} | 12 +- .../model/builder/DmpBlueprintBuilder.java | 33 +---- .../eu/eudat/model/builder/DmpBuilder.java | 25 +++- .../builder/DmpExternalReferenceBuilder.java | 130 ------------------ .../model/builder/DmpReferenceBuilder.java | 130 ++++++++++++++++++ .../builder/ExternalReferenceBuilder.java | 101 -------------- .../eudat/model/builder/ReferenceBuilder.java | 101 ++++++++++++++ .../model/censorship/DmpBlueprintCensor.java | 2 - .../eu/eudat/model/censorship/DmpCensor.java | 2 + ...nceCensor.java => DmpReferenceCensor.java} | 20 +-- ...erenceCensor.java => ReferenceCensor.java} | 16 +-- ...eDeleter.java => DmpReferenceDeleter.java} | 18 +-- ...enceDeleter.java => ReferenceDeleter.java} | 18 +-- ...renceQuery.java => DmpReferenceQuery.java} | 56 ++++---- ...eferenceQuery.java => ReferenceQuery.java} | 113 ++++++++------- ...nceLookup.java => DmpReferenceLookup.java} | 8 +- ...erenceLookup.java => ReferenceLookup.java} | 8 +- ...ntroller.java => ReferenceController.java} | 56 ++++---- .../ExternalReferencesCacheOptions.java | 2 +- .../ExternalReferencesCacheService.java | 2 +- .../ReferenceService.java} | 30 ++-- 26 files changed, 460 insertions(+), 471 deletions(-) rename dmp-backend/core/src/main/java/eu/eudat/data/{DmpExternalReferenceEntity.java => DmpReferenceEntity.java} (94%) rename dmp-backend/core/src/main/java/eu/eudat/data/{ExternalReferenceEntity.java => ReferenceEntity.java} (98%) rename dmp-backend/core/src/main/java/eu/eudat/model/{DmpExternalReference.java => DmpReference.java} (60%) rename dmp-backend/core/src/main/java/eu/eudat/model/{ExternalReference.java => Reference.java} (90%) delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java rename dmp-backend/core/src/main/java/eu/eudat/model/censorship/{DmpExternalReferenceCensor.java => DmpReferenceCensor.java} (66%) rename dmp-backend/core/src/main/java/eu/eudat/model/censorship/{ExternalReferenceCensor.java => ReferenceCensor.java} (73%) rename dmp-backend/core/src/main/java/eu/eudat/model/deleter/{DmpExternalReferenceDeleter.java => DmpReferenceDeleter.java} (77%) rename dmp-backend/core/src/main/java/eu/eudat/model/deleter/{ExternalReferenceDeleter.java => ReferenceDeleter.java} (79%) rename dmp-backend/core/src/main/java/eu/eudat/query/{DmpExternalReferenceQuery.java => DmpReferenceQuery.java} (61%) rename dmp-backend/core/src/main/java/eu/eudat/query/{ExternalReferenceQuery.java => ReferenceQuery.java} (55%) rename dmp-backend/core/src/main/java/eu/eudat/query/lookup/{DmpExternalReferenceLookup.java => DmpReferenceLookup.java} (66%) rename dmp-backend/core/src/main/java/eu/eudat/query/lookup/{ExternalReferenceLookup.java => ReferenceLookup.java} (89%) rename dmp-backend/web/src/main/java/eu/eudat/controllers/v2/{ExternalReferenceController.java => ReferenceController.java} (73%) rename dmp-backend/web/src/main/java/eu/eudat/logic/services/{externalreferences => references}/ExternalReferencesCacheOptions.java (86%) rename dmp-backend/web/src/main/java/eu/eudat/logic/services/{externalreferences => references}/ExternalReferencesCacheService.java (97%) rename dmp-backend/web/src/main/java/eu/eudat/logic/services/{externalreferences/ExternalReferenceService.java => references/ReferenceService.java} (87%) diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java similarity index 94% rename from dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java rename to dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java index 072024af8..aa0f98e06 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DmpExternalReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java @@ -8,8 +8,8 @@ import jakarta.persistence.Table; import java.util.UUID; @Entity -@Table(name = "\"DmpExternalReference\"") -public class DmpExternalReferenceEntity { +@Table(name = "\"DmpReference\"") +public class DmpReferenceEntity { @Id @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java similarity index 98% rename from dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java rename to dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java index 8cb605ae1..bb3b1db63 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/ExternalReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/ReferenceEntity.java @@ -12,8 +12,8 @@ import java.time.Instant; import java.util.UUID; @Entity -@Table(name = "\"ExternalReference\"") -public class ExternalReferenceEntity { +@Table(name = "\"Reference\"") +public class ReferenceEntity { @Id @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java index c57b5d5fc..c02eb147e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java @@ -93,6 +93,9 @@ public class Dmp { public static final String _dmpDescriptions = "dmpDescriptions"; + public static final String _dmpExternalReferences = "dmpExternalReferences"; + private List dmpReferences; + public UUID getId() { return id; } @@ -260,4 +263,12 @@ public class Dmp { public void setDmpDescriptions(List dmpDescriptions) { this.dmpDescriptions = dmpDescriptions; } + + public List getDmpExternalReferences() { + return dmpReferences; + } + + public void setDmpExternalReferences(List dmpReferences) { + this.dmpReferences = dmpReferences; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java index f9acb6798..89f67ad50 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpBlueprint.java @@ -34,9 +34,6 @@ public class DmpBlueprint { public final static String _hash = "hash"; private String hash; - public static final String _dmpExternalReferences = "dmpExternalReferences"; - private List dmpExternalReferences; - public UUID getId() { return id; } @@ -100,14 +97,6 @@ public class DmpBlueprint { public void setDefinition(Definition definition) { this.definition = definition; } - - public List getDmpExternalReferences() { - return dmpExternalReferences; - } - - public void setDmpExternalReferences(List dmpExternalReferences) { - this.dmpExternalReferences = dmpExternalReferences; - } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java similarity index 60% rename from dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java rename to dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java index 67deac0a8..77b3ff6b4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpExternalReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java @@ -2,15 +2,15 @@ package eu.eudat.model; import java.util.UUID; -public class DmpExternalReference { +public class DmpReference { private UUID id; public static final String _id = "id"; - private DmpBlueprint dmp; + private Dmp dmp; public static final String _dmp = "dmp"; - private ExternalReference externalReference; + private Reference reference; public static final String _externalReference = "externalReference"; private String data; @@ -24,20 +24,20 @@ public class DmpExternalReference { this.id = id; } - public DmpBlueprint getDmp() { + public Dmp getDmp() { return dmp; } - public void setDmp(DmpBlueprint dmp) { + public void setDmp(Dmp dmp) { this.dmp = dmp; } - public ExternalReference getExternalReference() { - return externalReference; + public Reference getExternalReference() { + return reference; } - public void setExternalReference(ExternalReference externalReference) { - this.externalReference = externalReference; + public void setExternalReference(Reference reference) { + this.reference = reference; } public String getData() { diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java similarity index 90% rename from dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java rename to dmp-backend/core/src/main/java/eu/eudat/model/Reference.java index d8d279c05..9343e8158 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/ExternalReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java @@ -8,7 +8,7 @@ import java.time.Instant; import java.util.List; import java.util.UUID; -public class ExternalReference { +public class Reference { private UUID id; public static final String _id = "id"; @@ -49,7 +49,7 @@ public class ExternalReference { //private UserInfo createdBy; ToDo //public static final String _createdBy = "createdBy"; - private List dmpExternalReferences; + private List dmpReferences; public static final String _dmpExternalReferences = "dmpExternalReferences"; public UUID getId() { @@ -148,11 +148,11 @@ public class ExternalReference { this.updatedAt = updatedAt; } - public List getDmpExternalReferences() { - return dmpExternalReferences; + public List getDmpExternalReferences() { + return dmpReferences; } - public void setDmpExternalReferences(List dmpExternalReferences) { - this.dmpExternalReferences = dmpExternalReferences; + public void setDmpExternalReferences(List dmpReferences) { + this.dmpReferences = dmpReferences; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java index 9bdd92024..46194e84c 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBlueprintBuilder.java @@ -6,14 +6,9 @@ import eu.eudat.commons.types.dmpblueprint.DefinitionEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpBlueprintEntity; import eu.eudat.model.DmpBlueprint; -import eu.eudat.model.DmpExternalReference; -import eu.eudat.model.ExternalReference; import eu.eudat.model.builder.dmpblueprintdefinition.DefinitionBuilder; -import eu.eudat.query.DmpExternalReferenceQuery; 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.fieldset.FieldSet; import gr.cite.tools.logging.DataLogEntry; import gr.cite.tools.logging.LoggerService; @@ -24,24 +19,21 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.*; -import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class DmpBlueprintBuilder extends BaseBuilder { private final BuilderFactory builderFactory; - private final QueryFactory queryFactory; private final XmlHandlingService xmlHandlingService; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public DmpBlueprintBuilder( ConventionService conventionService, - BuilderFactory builderFactory, QueryFactory queryFactory, XmlHandlingService xmlHandlingService) { + BuilderFactory builderFactory, XmlHandlingService xmlHandlingService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpBlueprintBuilder.class))); this.builderFactory = builderFactory; - this.queryFactory = queryFactory; this.xmlHandlingService = xmlHandlingService; } @@ -57,9 +49,6 @@ public class DmpBlueprintBuilder extends BaseBuilder(); FieldSet definitionFields = fields.extractPrefixed(this.asPrefix(DmpBlueprint._definition)); - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asPrefix(ExternalReference._dmpExternalReferences)); - Map> dmpExternalReferenceMap = this.collectDmpExternalReferences(dmpExternalReferencesFields, data); - List models = new ArrayList<>(); for (DmpBlueprintEntity d : data) { DmpBlueprint m = new DmpBlueprint(); @@ -74,29 +63,9 @@ public class DmpBlueprintBuilder extends BaseBuilder> collectDmpExternalReferences(FieldSet fields, List datas) throws MyApplicationException { - if (fields.isEmpty() || datas.isEmpty()) return null; - this.logger.debug("checking related - {}", DmpExternalReference.class.getSimpleName()); - - Map> itemMap = null; - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpExternalReference._dmp, DmpBlueprint._id)); - DmpExternalReferenceQuery query = this.queryFactory.query(DmpExternalReferenceQuery.class).authorize(this.authorize).dmpIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DmpExternalReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); - - if (!fields.hasField(this.asIndexer(DmpExternalReference._dmp, DmpBlueprint._id))) { - itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDmp() != null).map(x -> { - x.getDmp().setId(null); - return x; - }).collect(Collectors.toList()); - } - return itemMap; - } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java index 12573d759..3eff0fdd2 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java @@ -3,9 +3,9 @@ package eu.eudat.model.builder; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpEntity; -import eu.eudat.model.Description; -import eu.eudat.model.Dmp; +import eu.eudat.model.*; import eu.eudat.query.DescriptionQuery; +import eu.eudat.query.DmpReferenceQuery; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyApplicationException; @@ -57,6 +57,8 @@ public class DmpBuilder extends BaseBuilder { FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asPrefix(Dmp._dmpDescriptions)); Map> dmpDescriptionsMap = this.collectDmpDescriptions(dmpDescriptionsFields, data); + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpExternalReferences)); + Map> dmpReferenceMap = this.collectDmpReferences(dmpReferencesFields, data); for (DmpEntity d : data) { Dmp m = new Dmp(); @@ -96,6 +98,7 @@ public class DmpBuilder extends BaseBuilder { if (!dmpDescriptionsFields.isEmpty() && dmpDescriptionsMap != null && dmpDescriptionsMap.containsKey(d.getId())) m.setDmpDescriptions(dmpDescriptionsMap.get(d.getId())); + if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) m.setDmpExternalReferences(dmpReferenceMap.get(d.getId())); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); @@ -123,4 +126,22 @@ public class DmpBuilder extends BaseBuilder { return itemMap; } + private Map> collectDmpReferences(FieldSet fields, List datas) throws MyApplicationException { + if (fields.isEmpty() || datas.isEmpty()) return null; + this.logger.debug("checking related - {}", DmpReference.class.getSimpleName()); + + Map> itemMap = null; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpReference._dmp, Dmp._id)); + DmpReferenceQuery query = this.queryFactory.query(DmpReferenceQuery.class).authorize(this.authorize).dmpIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); + + if (!fields.hasField(this.asIndexer(DmpReference._dmp, Dmp._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDmp() != null).map(x -> { + x.getDmp().setId(null); + return x; + }).collect(Collectors.toList()); + } + return itemMap; + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java deleted file mode 100644 index 25c7400ab..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpExternalReferenceBuilder.java +++ /dev/null @@ -1,130 +0,0 @@ -package eu.eudat.model.builder; - -import eu.eudat.authorization.AuthorizationFlags; -import eu.eudat.convention.ConventionService; -import eu.eudat.data.DmpExternalReferenceEntity; -import eu.eudat.model.DmpBlueprint; -import eu.eudat.model.DmpExternalReference; -import eu.eudat.model.ExternalReference; -import eu.eudat.query.DmpBlueprintQuery; -import eu.eudat.query.ExternalReferenceQuery; -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.fieldset.FieldSet; -import gr.cite.tools.logging.DataLogEntry; -import gr.cite.tools.logging.LoggerService; -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.util.*; -import java.util.stream.Collectors; - -@Component -@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class DmpExternalReferenceBuilder extends BaseBuilder{ - - private final BuilderFactory builderFactory; - private final QueryFactory queryFactory; - private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); - - @Autowired - public DmpExternalReferenceBuilder( - ConventionService conventionService, - BuilderFactory builderFactory, QueryFactory queryFactory) { - super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceBuilder.class))); - this.builderFactory = builderFactory; - this.queryFactory = queryFactory; - } - - public DmpExternalReferenceBuilder authorize(EnumSet values) { - this.authorize = values; - return this; - } - - @Override - public List build(FieldSet fields, List data) throws MyApplicationException { - this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); - this.logger.trace(new DataLogEntry("requested fields", fields)); - if (fields == null || data == null || fields.isEmpty()) - return new ArrayList<>(); - FieldSet externalReferenceFields = fields.extractPrefixed(this.asPrefix(DmpExternalReference._externalReference)); - Map externalReferenceItemsMap = this.collectExternalReferences(externalReferenceFields, data); - - FieldSet dmpFields = fields.extractPrefixed(this.asPrefix(DmpExternalReference._dmp)); - Map dmpBlueprintItemsMap = this.collectDmps(dmpFields, data); - - List models = new ArrayList<>(); - for (DmpExternalReferenceEntity d : data) { - DmpExternalReference m = new DmpExternalReference(); - if (fields.hasField(this.asIndexer(DmpExternalReference._id))) m.setId(d.getId()); - if (fields.hasField(this.asIndexer(DmpExternalReference._data))) m.setData(d.getData()); - if(!externalReferenceFields.isEmpty() && externalReferenceItemsMap != null && externalReferenceItemsMap.containsKey(d.getReferenceId())){ - m.setExternalReference(externalReferenceItemsMap.get(d.getReferenceId())); - } - if(!dmpFields.isEmpty() && dmpBlueprintItemsMap != null && dmpBlueprintItemsMap.containsKey(d.getDmpId())){ - m.setDmp(dmpBlueprintItemsMap.get(d.getDmpId())); - } - models.add(m); - } - this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); - return models; - } - - private Map collectExternalReferences(FieldSet fields, List data) throws MyApplicationException { - if (fields.isEmpty() || data.isEmpty()) return null; - this.logger.debug("checking related - {}", ExternalReference.class.getSimpleName()); - - Map itemMap; - if (!fields.hasOtherField(this.asIndexer(ExternalReference._id))) { - itemMap = this.asEmpty( - data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList()), - x -> { - ExternalReference item = new ExternalReference(); - item.setId(x); - return item; - }, - ExternalReference::getId); - } else { - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(ExternalReference._id); - ExternalReferenceQuery q = this.queryFactory.query(ExternalReferenceQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(this.authorize).asForeignKey(q, clone, ExternalReference::getId); - } - if (!fields.hasField(ExternalReference._id)) { - itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); - } - - return itemMap; - } - - private Map collectDmps(FieldSet fields, List data) throws MyApplicationException { - if (fields.isEmpty() || data.isEmpty()) return null; - this.logger.debug("checking related - {}", DmpBlueprint.class.getSimpleName()); - - Map itemMap; - if (!fields.hasOtherField(this.asIndexer(DmpBlueprint._id))) { - itemMap = this.asEmpty( - data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList()), - x -> { - DmpBlueprint item = new DmpBlueprint(); - item.setId(x); - return item; - }, - DmpBlueprint::getId); - } else { - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(DmpBlueprint._id); - DmpBlueprintQuery q = this.queryFactory.query(DmpBlueprintQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(this.authorize).asForeignKey(q, clone, DmpBlueprint::getId); - } - if (!fields.hasField(DmpBlueprint._id)) { - itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); - } - - return itemMap; - } - -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java new file mode 100644 index 000000000..cbd3a58fd --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java @@ -0,0 +1,130 @@ +package eu.eudat.model.builder; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.convention.ConventionService; +import eu.eudat.data.DmpReferenceEntity; +import eu.eudat.model.Dmp; +import eu.eudat.model.DmpReference; +import eu.eudat.model.Reference; +import eu.eudat.query.DmpQuery; +import eu.eudat.query.ReferenceQuery; +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.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; +import java.util.stream.Collectors; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DmpReferenceBuilder extends BaseBuilder{ + + private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public DmpReferenceBuilder( + ConventionService conventionService, + BuilderFactory builderFactory, QueryFactory queryFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpReferenceBuilder.class))); + this.builderFactory = builderFactory; + this.queryFactory = queryFactory; + } + + public DmpReferenceBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + FieldSet referenceFields = fields.extractPrefixed(this.asPrefix(DmpReference._externalReference)); + Map referenceItemsMap = this.collectReferences(referenceFields, data); + + FieldSet dmpFields = fields.extractPrefixed(this.asPrefix(DmpReference._dmp)); + Map dmpItemsMap = this.collectDmps(dmpFields, data); + + List models = new ArrayList<>(); + for (DmpReferenceEntity d : data) { + DmpReference m = new DmpReference(); + if (fields.hasField(this.asIndexer(DmpReference._id))) m.setId(d.getId()); + if (fields.hasField(this.asIndexer(DmpReference._data))) m.setData(d.getData()); + if(!referenceFields.isEmpty() && referenceItemsMap != null && referenceItemsMap.containsKey(d.getReferenceId())){ + m.setExternalReference(referenceItemsMap.get(d.getReferenceId())); + } + if(!dmpFields.isEmpty() && dmpItemsMap != null && dmpItemsMap.containsKey(d.getDmpId())){ + m.setDmp(dmpItemsMap.get(d.getDmpId())); + } + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } + + private Map collectReferences(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) return null; + this.logger.debug("checking related - {}", Reference.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(Reference._id))) { + itemMap = this.asEmpty( + data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList()), + x -> { + Reference item = new Reference(); + item.setId(x); + return item; + }, + Reference::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(Reference._id); + ReferenceQuery q = this.queryFactory.query(ReferenceQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getReferenceId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(ReferenceBuilder.class).authorize(this.authorize).asForeignKey(q, clone, Reference::getId); + } + if (!fields.hasField(Reference._id)) { + itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); + } + + return itemMap; + } + + private Map collectDmps(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) return null; + this.logger.debug("checking related - {}", Dmp.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(Dmp._id))) { + itemMap = this.asEmpty( + data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList()), + x -> { + Dmp item = new Dmp(); + item.setId(x); + return item; + }, + Dmp::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(Dmp._id); + DmpQuery q = this.queryFactory.query(DmpQuery.class).authorize(this.authorize).ids(data.stream().map(x -> x.getDmpId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpBuilder.class).authorize(this.authorize).asForeignKey(q, clone, Dmp::getId); + } + if (!fields.hasField(Dmp._id)) { + itemMap.values().stream().filter(Objects::nonNull).peek(x -> x.setId(null)).collect(Collectors.toList()); + } + + return itemMap; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java deleted file mode 100644 index d2280800f..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ExternalReferenceBuilder.java +++ /dev/null @@ -1,101 +0,0 @@ -package eu.eudat.model.builder; - -import eu.eudat.authorization.AuthorizationFlags; -import eu.eudat.convention.ConventionService; -import eu.eudat.data.ExternalReferenceEntity; -import eu.eudat.model.DmpExternalReference; -import eu.eudat.model.ExternalReference; -import eu.eudat.query.DmpExternalReferenceQuery; -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.fieldset.FieldSet; -import gr.cite.tools.logging.DataLogEntry; -import gr.cite.tools.logging.LoggerService; -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.util.*; -import java.util.stream.Collectors; - -@Component -@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ExternalReferenceBuilder extends BaseBuilder{ - - private final BuilderFactory builderFactory; - private final QueryFactory queryFactory; - private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); - - @Autowired - public ExternalReferenceBuilder( - ConventionService conventionService, - BuilderFactory builderFactory, QueryFactory queryFactory) { - super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalReferenceBuilder.class))); - this.builderFactory = builderFactory; - this.queryFactory = queryFactory; - } - - public ExternalReferenceBuilder authorize(EnumSet values) { - this.authorize = values; - return this; - } - - @Override - public List build(FieldSet fields, List data) throws MyApplicationException { - this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); - this.logger.trace(new DataLogEntry("requested fields", fields)); - if (fields == null || data == null || fields.isEmpty()) - return new ArrayList<>(); - - //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); - - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asPrefix(ExternalReference._dmpExternalReferences)); - Map> dmpExternalReferenceMap = this.collectDmpExternalReferences(dmpExternalReferencesFields, data); - - List models = new ArrayList<>(); - for (ExternalReferenceEntity d : data) { - ExternalReference m = new ExternalReference(); - if (fields.hasField(this.asIndexer(ExternalReference._id))) m.setId(d.getId()); - if (fields.hasField(this.asIndexer(ExternalReference._label))) m.setLabel(d.getLabel()); - if (fields.hasField(this.asIndexer(ExternalReference._createdAt))) m.setCreatedAt(d.getCreatedAt()); - if (fields.hasField(this.asIndexer(ExternalReference._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); - if (fields.hasField(this.asIndexer(ExternalReference._isActive))) m.setIsActive(d.getIsActive()); - if (fields.hasField(this.asIndexer(ExternalReference._definition))) m.setReference(d.getDefinition()); - if (fields.hasField(this.asIndexer(ExternalReference._reference))) m.setReference(d.getReference()); - if (fields.hasField(this.asIndexer(ExternalReference._abbreviation))) m.setAbbreviation(d.getAbbreviation()); - if (fields.hasField(this.asIndexer(ExternalReference._description))) m.setDescription(d.getDescription()); - if (fields.hasField(this.asIndexer(ExternalReference._source))) m.setSource(d.getSource()); - if (fields.hasField(this.asIndexer(ExternalReference._sourceType))) m.setSourceType(d.getSourceType()); - if (fields.hasField(this.asIndexer(ExternalReference._type))) m.setType(d.getType()); -// if (!userInfoFields.isEmpty() && d.getCreatedBy() != null){ -// //ToDo -// } - if (!dmpExternalReferenceMap.isEmpty() && dmpExternalReferenceMap != null && dmpExternalReferenceMap.containsKey(d.getId())) m.setDmpExternalReferences(dmpExternalReferenceMap.get(d.getId())); - models.add(m); - } - this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); - return models; - } - - private Map> collectDmpExternalReferences(FieldSet fields, List datas) throws MyApplicationException { - if (fields.isEmpty() || datas.isEmpty()) return null; - this.logger.debug("checking related - {}", DmpExternalReference.class.getSimpleName()); - - Map> itemMap = null; - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpExternalReference._externalReference, ExternalReference._id)); - DmpExternalReferenceQuery query = this.queryFactory.query(DmpExternalReferenceQuery.class).authorize(this.authorize).referenceIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DmpExternalReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getExternalReference().getId()); - - if (!fields.hasField(this.asIndexer(DmpExternalReference._externalReference, ExternalReference._id))) { - itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getExternalReference() != null).map(x -> { - x.getExternalReference().setId(null); - return x; - }).collect(Collectors.toList()); - } - return itemMap; - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java new file mode 100644 index 000000000..8bfb99753 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java @@ -0,0 +1,101 @@ +package eu.eudat.model.builder; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.convention.ConventionService; +import eu.eudat.data.ReferenceEntity; +import eu.eudat.model.DmpReference; +import eu.eudat.model.Reference; +import eu.eudat.query.DmpReferenceQuery; +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.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; +import java.util.stream.Collectors; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ReferenceBuilder extends BaseBuilder{ + + private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public ReferenceBuilder( + ConventionService conventionService, + BuilderFactory builderFactory, QueryFactory queryFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(ReferenceBuilder.class))); + this.builderFactory = builderFactory; + this.queryFactory = queryFactory; + } + + public ReferenceBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + + //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); + + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpExternalReferences)); + Map> dmpReferenceMap = this.collectDmpReferences(dmpReferencesFields, data); + + List models = new ArrayList<>(); + for (ReferenceEntity d : data) { + Reference m = new Reference(); + if (fields.hasField(this.asIndexer(Reference._id))) m.setId(d.getId()); + if (fields.hasField(this.asIndexer(Reference._label))) m.setLabel(d.getLabel()); + if (fields.hasField(this.asIndexer(Reference._createdAt))) m.setCreatedAt(d.getCreatedAt()); + if (fields.hasField(this.asIndexer(Reference._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); + if (fields.hasField(this.asIndexer(Reference._isActive))) m.setIsActive(d.getIsActive()); + if (fields.hasField(this.asIndexer(Reference._definition))) m.setReference(d.getDefinition()); + if (fields.hasField(this.asIndexer(Reference._reference))) m.setReference(d.getReference()); + if (fields.hasField(this.asIndexer(Reference._abbreviation))) m.setAbbreviation(d.getAbbreviation()); + if (fields.hasField(this.asIndexer(Reference._description))) m.setDescription(d.getDescription()); + if (fields.hasField(this.asIndexer(Reference._source))) m.setSource(d.getSource()); + if (fields.hasField(this.asIndexer(Reference._sourceType))) m.setSourceType(d.getSourceType()); + if (fields.hasField(this.asIndexer(Reference._type))) m.setType(d.getType()); +// if (!userInfoFields.isEmpty() && d.getCreatedBy() != null){ +// //ToDo +// } + if (!dmpReferenceMap.isEmpty() && dmpReferenceMap != null && dmpReferenceMap.containsKey(d.getId())) m.setDmpExternalReferences(dmpReferenceMap.get(d.getId())); + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } + + private Map> collectDmpReferences(FieldSet fields, List datas) throws MyApplicationException { + if (fields.isEmpty() || datas.isEmpty()) return null; + this.logger.debug("checking related - {}", DmpReference.class.getSimpleName()); + + Map> itemMap = null; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpReference._externalReference, Reference._id)); + DmpReferenceQuery query = this.queryFactory.query(DmpReferenceQuery.class).authorize(this.authorize).referenceIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DmpReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getExternalReference().getId()); + + if (!fields.hasField(this.asIndexer(DmpReference._externalReference, Reference._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getExternalReference() != null).map(x -> { + x.getExternalReference().setId(null); + return x; + }).collect(Collectors.toList()); + } + return itemMap; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java index c5b1360fd..538c8cd78 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpBlueprintCensor.java @@ -41,8 +41,6 @@ public class DmpBlueprintCensor extends BaseCensor { this.authService.authorizeForce(Permission.BrowseDmpBlueprint); FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(DmpBlueprint._definition)); this.censorFactory.censor(DefinitionCensor.class).censor(definitionFields, userId); - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(DmpBlueprint._dmpExternalReferences)); - this.censorFactory.censor(DmpExternalReferenceCensor.class).censor(dmpExternalReferencesFields, 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 216572666..e99138cb1 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 @@ -42,6 +42,8 @@ public class DmpCensor extends BaseCensor { FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpDescriptions)); this.censorFactory.censor(DescriptionCensor.class).censor(dmpDescriptionsFields, userId); + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpExternalReferences)); + this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpExternalReferencesFields, userId); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java similarity index 66% rename from dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java rename to dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java index bd372a41e..97364c931 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpExternalReferenceCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DmpReferenceCensor.java @@ -2,7 +2,7 @@ package eu.eudat.model.censorship; import eu.eudat.authorization.Permission; import eu.eudat.convention.ConventionService; -import eu.eudat.model.DmpExternalReference; +import eu.eudat.model.DmpReference; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.fieldset.FieldSet; @@ -17,16 +17,16 @@ import java.util.UUID; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class DmpExternalReferenceCensor extends BaseCensor { +public class DmpReferenceCensor extends BaseCensor { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceCensor.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpReferenceCensor.class)); protected final AuthorizationService authService; protected final CensorFactory censorFactory; - public DmpExternalReferenceCensor(ConventionService conventionService, - AuthorizationService authService, - CensorFactory censorFactory) { + public DmpReferenceCensor(ConventionService conventionService, + AuthorizationService authService, + CensorFactory censorFactory) { super(conventionService); this.authService = authService; this.censorFactory = censorFactory; @@ -38,10 +38,10 @@ public class DmpExternalReferenceCensor extends BaseCensor { return; this.authService.authorizeForce(Permission.BrowseDmpExternalReference); - FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpExternalReference._dmp)); - this.censorFactory.censor(DmpBlueprintCensor.class).censor(dmpFields, userId); - FieldSet externalReferenceFields = fields.extractPrefixed(this.asIndexerPrefix(DmpExternalReference._externalReference)); - this.censorFactory.censor(ExternalReferenceCensor.class).censor(externalReferenceFields, userId); + FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._dmp)); + this.censorFactory.censor(DmpCensor.class).censor(dmpFields, userId); + FieldSet externalReferenceFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._externalReference)); + this.censorFactory.censor(ReferenceCensor.class).censor(externalReferenceFields, userId); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java similarity index 73% rename from dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java rename to dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java index 07f09d5e5..5b9ce98be 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ExternalReferenceCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java @@ -2,7 +2,7 @@ package eu.eudat.model.censorship; import eu.eudat.authorization.Permission; import eu.eudat.convention.ConventionService; -import eu.eudat.model.ExternalReference; +import eu.eudat.model.Reference; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.censor.CensorFactory; import gr.cite.tools.fieldset.FieldSet; @@ -17,16 +17,16 @@ import java.util.UUID; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ExternalReferenceCensor extends BaseCensor { +public class ReferenceCensor extends BaseCensor { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceCensor.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ReferenceCensor.class)); protected final AuthorizationService authService; protected final CensorFactory censorFactory; - public ExternalReferenceCensor(ConventionService conventionService, - AuthorizationService authService, - CensorFactory censorFactory) { + public ReferenceCensor(ConventionService conventionService, + AuthorizationService authService, + CensorFactory censorFactory) { super(conventionService); this.authService = authService; this.censorFactory = censorFactory; @@ -38,8 +38,8 @@ public class ExternalReferenceCensor extends BaseCensor { return; this.authService.authorizeForce(Permission.BrowseExternalReference); - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._dmpExternalReferences)); - this.censorFactory.censor(DmpExternalReferenceCensor.class).censor(dmpExternalReferencesFields, userId); + FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Reference._dmpExternalReferences)); + this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpExternalReferencesFields, userId); //ToDo //FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._createdBy)); //this.censorFactory.censor(UserInfo.class).censor(definitionFields, userId); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpReferenceDeleter.java similarity index 77% rename from dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java rename to dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpReferenceDeleter.java index 41f063322..5953ed6e3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpExternalReferenceDeleter.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DmpReferenceDeleter.java @@ -1,7 +1,7 @@ package eu.eudat.model.deleter; -import eu.eudat.data.DmpExternalReferenceEntity; -import eu.eudat.query.DmpExternalReferenceQuery; +import eu.eudat.data.DmpReferenceEntity; +import eu.eudat.query.DmpReferenceQuery; import gr.cite.tools.data.deleter.Deleter; import gr.cite.tools.data.deleter.DeleterFactory; import gr.cite.tools.data.query.QueryFactory; @@ -21,9 +21,9 @@ import java.util.UUID; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class DmpExternalReferenceDeleter implements Deleter { +public class DmpReferenceDeleter implements Deleter { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpExternalReferenceDeleter.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DmpReferenceDeleter.class)); private final EntityManager entityManager; protected final QueryFactory queryFactory; @@ -31,7 +31,7 @@ public class DmpExternalReferenceDeleter implements Deleter { protected final DeleterFactory deleterFactory; @Autowired - public DmpExternalReferenceDeleter( + public DmpReferenceDeleter( EntityManager entityManager, QueryFactory queryFactory, DeleterFactory deleterFactory @@ -43,12 +43,12 @@ public class DmpExternalReferenceDeleter implements Deleter { public void deleteAndSaveByIds(List ids) throws InvalidApplicationException { logger.debug(new MapLogEntry("collecting to delete").And("count", Optional.ofNullable(ids).map(List::size).orElse(0)).And("ids", ids)); - List data = this.queryFactory.query(DmpExternalReferenceQuery.class).ids(ids).collect(); + List data = this.queryFactory.query(DmpReferenceQuery.class).ids(ids).collect(); logger.trace("retrieved {} items", Optional.ofNullable(data).map(List::size).orElse(0)); this.deleteAndSave(data); } - public void deleteAndSave(List data) throws InvalidApplicationException { + public void deleteAndSave(List data) throws InvalidApplicationException { logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); this.delete(data); logger.trace("saving changes"); @@ -56,12 +56,12 @@ public class DmpExternalReferenceDeleter implements Deleter { logger.trace("changes saved"); } - public void delete(List data) throws InvalidApplicationException { + public void delete(List data) throws InvalidApplicationException { logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); if (data == null || data.isEmpty()) return; - for (DmpExternalReferenceEntity item : data) { + for (DmpReferenceEntity item : data) { logger.trace("deleting item {}", item.getId()); logger.trace("updating item"); this.entityManager.merge(item); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ReferenceDeleter.java similarity index 79% rename from dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java rename to dmp-backend/core/src/main/java/eu/eudat/model/deleter/ReferenceDeleter.java index 4711da890..f2bb69945 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ExternalReferenceDeleter.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/ReferenceDeleter.java @@ -1,8 +1,8 @@ package eu.eudat.model.deleter; import eu.eudat.commons.enums.IsActive; -import eu.eudat.data.ExternalReferenceEntity; -import eu.eudat.query.ExternalReferenceQuery; +import eu.eudat.data.ReferenceEntity; +import eu.eudat.query.ReferenceQuery; import gr.cite.tools.data.deleter.Deleter; import gr.cite.tools.data.deleter.DeleterFactory; import gr.cite.tools.data.query.QueryFactory; @@ -23,9 +23,9 @@ import java.util.UUID; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ExternalReferenceDeleter implements Deleter { +public class ReferenceDeleter implements Deleter { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceDeleter.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ReferenceDeleter.class)); private final EntityManager entityManager; protected final QueryFactory queryFactory; @@ -33,7 +33,7 @@ public class ExternalReferenceDeleter implements Deleter { protected final DeleterFactory deleterFactory; @Autowired - public ExternalReferenceDeleter( + public ReferenceDeleter( EntityManager entityManager, QueryFactory queryFactory, DeleterFactory deleterFactory @@ -45,12 +45,12 @@ public class ExternalReferenceDeleter implements Deleter { public void deleteAndSaveByIds(List ids) throws InvalidApplicationException { logger.debug(new MapLogEntry("collecting to delete").And("count", Optional.ofNullable(ids).map(List::size).orElse(0)).And("ids", ids)); - List data = this.queryFactory.query(ExternalReferenceQuery.class).ids(ids).collect(); + List data = this.queryFactory.query(ReferenceQuery.class).ids(ids).collect(); logger.trace("retrieved {} items", Optional.ofNullable(data).map(List::size).orElse(0)); this.deleteAndSave(data); } - public void deleteAndSave(List data) throws InvalidApplicationException { + public void deleteAndSave(List data) throws InvalidApplicationException { logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); this.delete(data); logger.trace("saving changes"); @@ -58,14 +58,14 @@ public class ExternalReferenceDeleter implements Deleter { logger.trace("changes saved"); } - public void delete(List data) throws InvalidApplicationException { + public void delete(List data) throws InvalidApplicationException { logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); if (data == null || data.isEmpty()) return; Instant now = Instant.now(); - for (ExternalReferenceEntity item : data) { + for (ReferenceEntity item : data) { logger.trace("deleting item {}", item.getId()); item.setIsActive(IsActive.Inactive); item.setUpdatedAt(now); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/DmpReferenceQuery.java similarity index 61% rename from dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java rename to dmp-backend/core/src/main/java/eu/eudat/query/DmpReferenceQuery.java index a2a8ba61c..8177067e4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/DmpExternalReferenceQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/DmpReferenceQuery.java @@ -2,7 +2,7 @@ package eu.eudat.query; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.DmpExternalReferenceEntity; +import eu.eudat.data.DmpReferenceEntity; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.QueryBase; @@ -18,7 +18,7 @@ import java.util.*; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class DmpExternalReferenceQuery extends QueryBase { +public class DmpReferenceQuery extends QueryBase { private Collection ids; @@ -29,52 +29,52 @@ public class DmpExternalReferenceQuery extends QueryBase authorize = EnumSet.of(AuthorizationFlags.None); - public DmpExternalReferenceQuery ids(UUID value) { + public DmpReferenceQuery ids(UUID value) { this.ids = List.of(value); return this; } - public DmpExternalReferenceQuery ids(UUID... value) { + public DmpReferenceQuery ids(UUID... value) { this.ids = Arrays.asList(value); return this; } - public DmpExternalReferenceQuery ids(Collection values) { + public DmpReferenceQuery ids(Collection values) { this.ids = values; return this; } - public DmpExternalReferenceQuery dmpIds(UUID value) { + public DmpReferenceQuery dmpIds(UUID value) { this.dmpIds = List.of(value); return this; } - public DmpExternalReferenceQuery dmpIds(UUID... value) { + public DmpReferenceQuery dmpIds(UUID... value) { this.dmpIds = Arrays.asList(value); return this; } - public DmpExternalReferenceQuery dmpIds(Collection values) { + public DmpReferenceQuery dmpIds(Collection values) { this.dmpIds = values; return this; } - public DmpExternalReferenceQuery referenceIds(UUID value) { + public DmpReferenceQuery referenceIds(UUID value) { this.referenceIds = List.of(value); return this; } - public DmpExternalReferenceQuery referenceIds(UUID... value) { + public DmpReferenceQuery referenceIds(UUID... value) { this.referenceIds = Arrays.asList(value); return this; } - public DmpExternalReferenceQuery referenceIds(Collection values) { + public DmpReferenceQuery referenceIds(Collection values) { this.referenceIds = values; return this; } - public DmpExternalReferenceQuery authorize(EnumSet values) { + public DmpReferenceQuery authorize(EnumSet values) { this.authorize = values; return this; } @@ -83,7 +83,7 @@ public class DmpExternalReferenceQuery extends QueryBase entityClass() { - return DmpExternalReferenceEntity.class; + protected Class entityClass() { + return DmpReferenceEntity.class; } @Override @@ -105,19 +105,19 @@ public class DmpExternalReferenceQuery extends QueryBase Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); if (this.ids != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._id)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpReferenceEntity._id)); for (UUID item : this.ids) inClause.value(item); predicates.add(inClause); } if (this.dmpIds != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._dmpId)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpReferenceEntity._dmpId)); for (UUID item : this.ids) inClause.value(item); predicates.add(inClause); } if (this.referenceIds != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpExternalReferenceEntity._referenceId)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpReferenceEntity._referenceId)); for (UUID item : this.ids) inClause.value(item); predicates.add(inClause); @@ -131,21 +131,21 @@ public class DmpExternalReferenceQuery extends QueryBase columns) { - DmpExternalReferenceEntity item = new DmpExternalReferenceEntity(); - item.setId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._id, UUID.class)); - item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._dmpId, UUID.class)); - item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._referenceId, UUID.class)); - item.setData(QueryBase.convertSafe(tuple, columns, DmpExternalReferenceEntity._data, String.class)); + protected DmpReferenceEntity convert(Tuple tuple, Set columns) { + DmpReferenceEntity item = new DmpReferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._id, UUID.class)); + item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._dmpId, UUID.class)); + item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._referenceId, UUID.class)); + item.setData(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._data, String.class)); return item; } @Override protected String fieldNameOf(FieldResolver item) { - if (item.match(DmpExternalReferenceEntity._id)) return DmpExternalReferenceEntity._id; - else if (item.prefix(DmpExternalReferenceEntity._dmpId)) return DmpExternalReferenceEntity._dmpId; - else if (item.prefix(DmpExternalReferenceEntity._referenceId)) return DmpExternalReferenceEntity._referenceId; - else if (item.match(DmpExternalReferenceEntity._data)) return DmpExternalReferenceEntity._data; + if (item.match(DmpReferenceEntity._id)) return DmpReferenceEntity._id; + else if (item.prefix(DmpReferenceEntity._dmpId)) return DmpReferenceEntity._dmpId; + else if (item.prefix(DmpReferenceEntity._referenceId)) return DmpReferenceEntity._referenceId; + else if (item.match(DmpReferenceEntity._data)) return DmpReferenceEntity._data; else return null; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java similarity index 55% rename from dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java rename to dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java index 747221a31..6ffddfec3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/ExternalReferenceQuery.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/ReferenceQuery.java @@ -5,8 +5,7 @@ import eu.eudat.commons.enums.ExternalReferencesType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; import eu.eudat.commons.scope.user.UserScope; -import eu.eudat.data.DmpBlueprintEntity; -import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.data.ReferenceEntity; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.query.FieldResolver; import gr.cite.tools.data.query.QueryBase; @@ -23,7 +22,7 @@ import java.util.*; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ExternalReferenceQuery extends QueryBase { +public class ReferenceQuery extends QueryBase { private String like; @@ -39,87 +38,87 @@ public class ExternalReferenceQuery extends QueryBase { private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); - public ExternalReferenceQuery like(String value) { + public ReferenceQuery like(String value) { this.like = value; return this; } - public ExternalReferenceQuery ids(UUID value) { + public ReferenceQuery ids(UUID value) { this.ids = List.of(value); return this; } - public ExternalReferenceQuery ids(UUID... value) { + public ReferenceQuery ids(UUID... value) { this.ids = Arrays.asList(value); return this; } - public ExternalReferenceQuery ids(Collection values) { + public ReferenceQuery ids(Collection values) { this.ids = values; return this; } - public ExternalReferenceQuery isActive(IsActive value) { + public ReferenceQuery isActive(IsActive value) { this.isActives = List.of(value); return this; } - public ExternalReferenceQuery isActive(IsActive... value) { + public ReferenceQuery isActive(IsActive... value) { this.isActives = Arrays.asList(value); return this; } - public ExternalReferenceQuery isActive(Collection values) { + public ReferenceQuery isActive(Collection values) { this.isActives = values; return this; } - public ExternalReferenceQuery externalReferenceTypes(ExternalReferencesType value) { + public ReferenceQuery externalReferenceTypes(ExternalReferencesType value) { this.externalReferenceTypes = List.of(value); return this; } - public ExternalReferenceQuery externalReferenceTypes(ExternalReferencesType... value) { + public ReferenceQuery externalReferenceTypes(ExternalReferencesType... value) { this.externalReferenceTypes = Arrays.asList(value); return this; } - public ExternalReferenceQuery externalReferenceTypes(Collection values) { + public ReferenceQuery externalReferenceTypes(Collection values) { this.externalReferenceTypes = values; return this; } - public ExternalReferenceQuery excludedIds(Collection values) { + public ReferenceQuery excludedIds(Collection values) { this.excludedIds = values; return this; } - public ExternalReferenceQuery excludedIds(UUID value) { + public ReferenceQuery excludedIds(UUID value) { this.excludedIds = List.of(value); return this; } - public ExternalReferenceQuery excludedIds(UUID... value) { + public ReferenceQuery excludedIds(UUID... value) { this.excludedIds = Arrays.asList(value); return this; } - public ExternalReferenceQuery sourceTypes(SourceType value) { + public ReferenceQuery sourceTypes(SourceType value) { this.sourceTypes = List.of(value); return this; } - public ExternalReferenceQuery sourceTypes(SourceType... value) { + public ReferenceQuery sourceTypes(SourceType... value) { this.sourceTypes = Arrays.asList(value); return this; } - public ExternalReferenceQuery sourceTypes(Collection values) { + public ReferenceQuery sourceTypes(Collection values) { this.sourceTypes = values; return this; } - public ExternalReferenceQuery authorize(EnumSet values) { + public ReferenceQuery authorize(EnumSet values) { this.authorize = values; return this; } @@ -128,7 +127,7 @@ public class ExternalReferenceQuery extends QueryBase { private final AuthorizationService authService; - public ExternalReferenceQuery( + public ReferenceQuery( UserScope userScope, AuthorizationService authService ) { @@ -137,8 +136,8 @@ public class ExternalReferenceQuery extends QueryBase { } @Override - protected Class entityClass() { - return ExternalReferenceEntity.class; + protected Class entityClass() { + return ReferenceEntity.class; } @Override @@ -150,36 +149,36 @@ public class ExternalReferenceQuery extends QueryBase { protected Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); if (this.ids != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._id)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._id)); for (UUID item : this.ids) inClause.value(item); predicates.add(inClause); } if (this.like != null && !this.like.isEmpty()) { - predicates.add(queryContext.CriteriaBuilder.or(queryContext.CriteriaBuilder.like(queryContext.Root.get(ExternalReferenceEntity._label), this.like), - queryContext.CriteriaBuilder.like(queryContext.Root.get(ExternalReferenceEntity._description), this.like) + predicates.add(queryContext.CriteriaBuilder.or(queryContext.CriteriaBuilder.like(queryContext.Root.get(ReferenceEntity._label), this.like), + queryContext.CriteriaBuilder.like(queryContext.Root.get(ReferenceEntity._description), this.like) )); } if (this.isActives != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._isActive)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._isActive)); for (IsActive item : this.isActives) inClause.value(item); predicates.add(inClause); } if (this.sourceTypes != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._sourceType)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._sourceType)); for (SourceType item : this.sourceTypes) inClause.value(item); predicates.add(inClause); } if (this.externalReferenceTypes != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._type)); + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._type)); for (ExternalReferencesType item : this.externalReferenceTypes) inClause.value(item); predicates.add(inClause); } if (this.excludedIds != null) { - CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ExternalReferenceEntity._id)); + CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._id)); for (UUID item : this.excludedIds) notInClause.value(item); predicates.add(notInClause.not()); @@ -193,38 +192,38 @@ public class ExternalReferenceQuery extends QueryBase { } @Override - protected ExternalReferenceEntity convert(Tuple tuple, Set columns) { - ExternalReferenceEntity item = new ExternalReferenceEntity(); - item.setId(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._id, UUID.class)); - item.setLabel(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._label, String.class)); - item.setDescription(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._description, String.class)); - item.setCreatedAt(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdAt, Instant.class)); - item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._updatedAt, Instant.class)); - item.setIsActive(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._isActive, IsActive.class)); - item.setDefinition(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._definition, String.class)); - item.setAbbreviation(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._abbreviation, String.class)); - item.setReference(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._reference, String.class)); - item.setSource(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._source, String.class)); - item.setSourceType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._sourceType, SourceType.class)); - item.setType(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._type, ExternalReferencesType.class)); - item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ExternalReferenceEntity._createdBy, UUID.class)); + protected ReferenceEntity convert(Tuple tuple, Set columns) { + ReferenceEntity item = new ReferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, ReferenceEntity._id, UUID.class)); + item.setLabel(QueryBase.convertSafe(tuple, columns, ReferenceEntity._label, String.class)); + item.setDescription(QueryBase.convertSafe(tuple, columns, ReferenceEntity._description, String.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, ReferenceEntity._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, ReferenceEntity._updatedAt, Instant.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, ReferenceEntity._isActive, IsActive.class)); + item.setDefinition(QueryBase.convertSafe(tuple, columns, ReferenceEntity._definition, String.class)); + item.setAbbreviation(QueryBase.convertSafe(tuple, columns, ReferenceEntity._abbreviation, String.class)); + item.setReference(QueryBase.convertSafe(tuple, columns, ReferenceEntity._reference, String.class)); + item.setSource(QueryBase.convertSafe(tuple, columns, ReferenceEntity._source, String.class)); + item.setSourceType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._sourceType, SourceType.class)); + item.setType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._type, ExternalReferencesType.class)); + item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ReferenceEntity._createdBy, UUID.class)); return item; } @Override protected String fieldNameOf(FieldResolver item) { - if (item.match(ExternalReferenceEntity._id)) return ExternalReferenceEntity._id; - else if (item.match(ExternalReferenceEntity._label)) return ExternalReferenceEntity._label; - else if (item.match(ExternalReferenceEntity._description)) return ExternalReferenceEntity._description; - else if (item.match(ExternalReferenceEntity._createdAt)) return ExternalReferenceEntity._createdAt; - else if (item.match(ExternalReferenceEntity._updatedAt)) return ExternalReferenceEntity._updatedAt; - else if (item.match(ExternalReferenceEntity._isActive)) return ExternalReferenceEntity._isActive; - else if (item.match(ExternalReferenceEntity._definition)) return ExternalReferenceEntity._definition; - else if (item.match(ExternalReferenceEntity._abbreviation)) return ExternalReferenceEntity._abbreviation; - else if (item.match(ExternalReferenceEntity._reference)) return ExternalReferenceEntity._reference; - else if (item.match(ExternalReferenceEntity._source)) return ExternalReferenceEntity._source; - else if (item.match(ExternalReferenceEntity._sourceType)) return ExternalReferenceEntity._sourceType; - else if (item.match(ExternalReferenceEntity._type)) return ExternalReferenceEntity._type; + if (item.match(ReferenceEntity._id)) return ReferenceEntity._id; + else if (item.match(ReferenceEntity._label)) return ReferenceEntity._label; + else if (item.match(ReferenceEntity._description)) return ReferenceEntity._description; + else if (item.match(ReferenceEntity._createdAt)) return ReferenceEntity._createdAt; + else if (item.match(ReferenceEntity._updatedAt)) return ReferenceEntity._updatedAt; + else if (item.match(ReferenceEntity._isActive)) return ReferenceEntity._isActive; + else if (item.match(ReferenceEntity._definition)) return ReferenceEntity._definition; + else if (item.match(ReferenceEntity._abbreviation)) return ReferenceEntity._abbreviation; + else if (item.match(ReferenceEntity._reference)) return ReferenceEntity._reference; + else if (item.match(ReferenceEntity._source)) return ReferenceEntity._source; + else if (item.match(ReferenceEntity._sourceType)) return ReferenceEntity._sourceType; + else if (item.match(ReferenceEntity._type)) return ReferenceEntity._type; //else if (item.prefix(ExternalReferenceEntity._createdBy)) return ExternalReferenceEntity._createdBy; else return null; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java similarity index 66% rename from dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java rename to dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java index affe22396..706cd5ac8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpExternalReferenceLookup.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java @@ -1,13 +1,13 @@ package eu.eudat.query.lookup; -import eu.eudat.query.DmpExternalReferenceQuery; +import eu.eudat.query.DmpReferenceQuery; import gr.cite.tools.data.query.Lookup; import gr.cite.tools.data.query.QueryFactory; import java.util.Collection; import java.util.UUID; -public class DmpExternalReferenceLookup extends Lookup { +public class DmpReferenceLookup extends Lookup { private Collection ids; @@ -16,8 +16,8 @@ public class DmpExternalReferenceLookup extends Lookup { private Collection referenceIds; - public DmpExternalReferenceQuery enrich(QueryFactory queryFactory) { - DmpExternalReferenceQuery query = queryFactory.query(DmpExternalReferenceQuery.class); + public DmpReferenceQuery enrich(QueryFactory queryFactory) { + DmpReferenceQuery query = queryFactory.query(DmpReferenceQuery.class); if (this.ids != null) query.ids(this.ids); if (this.dmpIds != null) query.dmpIds(this.dmpIds); if (this.referenceIds != null) query.referenceIds(this.referenceIds); diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java similarity index 89% rename from dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java rename to dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java index 3e991f483..d307d67b6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ExternalReferenceLookup.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java @@ -3,7 +3,7 @@ package eu.eudat.query.lookup; import eu.eudat.commons.enums.ExternalReferencesType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; -import eu.eudat.query.ExternalReferenceQuery; +import eu.eudat.query.ReferenceQuery; import gr.cite.tools.data.query.Lookup; import gr.cite.tools.data.query.QueryFactory; @@ -11,7 +11,7 @@ import java.util.Collection; import java.util.List; import java.util.UUID; -public class ExternalReferenceLookup extends Lookup { +public class ReferenceLookup extends Lookup { private String like; @@ -73,8 +73,8 @@ public class ExternalReferenceLookup extends Lookup { this.externalReferenceTypes = externalReferenceTypes; } - public ExternalReferenceQuery enrich(QueryFactory queryFactory) { - ExternalReferenceQuery query = queryFactory.query(ExternalReferenceQuery.class); + public ReferenceQuery enrich(QueryFactory queryFactory) { + ReferenceQuery query = queryFactory.query(ReferenceQuery.class); if (this.like != null) query.like(this.like); if (this.isActive != null) query.isActive(this.isActive); if (this.externalReferenceTypes != null) query.externalReferenceTypes(this.externalReferenceTypes); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java similarity index 73% rename from dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java rename to dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java index 38bc97775..49cfcd7ed 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ExternalReferenceController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java @@ -5,19 +5,19 @@ import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; import eu.eudat.commons.enums.ExternalReferencesType; import eu.eudat.controllers.BaseController; -import eu.eudat.data.ExternalReferenceEntity; +import eu.eudat.data.ReferenceEntity; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.externalreferences.ExternalReferenceService; -import eu.eudat.model.ExternalReference; -import eu.eudat.model.builder.ExternalReferenceBuilder; -import eu.eudat.model.censorship.ExternalReferenceCensor; +import eu.eudat.logic.services.references.ReferenceService; +import eu.eudat.model.Reference; +import eu.eudat.model.builder.ReferenceBuilder; +import eu.eudat.model.censorship.ReferenceCensor; import eu.eudat.model.result.QueryResult; import eu.eudat.models.data.FetcherExternalReference; import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.query.ExternalReferenceQuery; -import eu.eudat.query.lookup.ExternalReferenceLookup; +import eu.eudat.query.ReferenceQuery; +import eu.eudat.query.lookup.ReferenceLookup; import eu.eudat.types.ApiMessageCode; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.auditing.AuditService; @@ -47,29 +47,29 @@ import java.util.UUID; @RestController @RequestMapping(path = {"api/external-references"}) -public class ExternalReferenceController extends BaseController { +public class ReferenceController extends BaseController { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceController.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ReferenceController.class)); private final BuilderFactory builderFactory; private final AuditService auditService; - private final ExternalReferenceService externalReferenceService; + private final ReferenceService referenceService; private final CensorFactory censorFactory; private final QueryFactory queryFactory; private final MessageSource messageSource; private final AuthorizationService authorizationService; @Autowired - public ExternalReferenceController( + public ReferenceController( ApiContext apiContext, BuilderFactory builderFactory, - ExternalReferenceService externalReferenceService, + ReferenceService referenceService, AuditService auditService, CensorFactory censorFactory, QueryFactory queryFactory, MessageSource messageSource, AuthorizationService authorizationService) { super(apiContext); this.builderFactory = builderFactory; - this.externalReferenceService = externalReferenceService; + this.referenceService = referenceService; this.auditService = auditService; this.censorFactory = censorFactory; this.queryFactory = queryFactory; @@ -78,14 +78,14 @@ public class ExternalReferenceController extends BaseController { } @PostMapping("query") - public QueryResult query(@RequestBody ExternalReferenceLookup lookup) throws MyApplicationException, MyForbiddenException { - logger.debug("querying {}", ExternalReference.class.getSimpleName()); + public QueryResult query(@RequestBody ReferenceLookup lookup) throws MyApplicationException, MyForbiddenException { + logger.debug("querying {}", Reference.class.getSimpleName()); - this.censorFactory.censor(ExternalReferenceCensor.class).censor(lookup.getProject(), null); + this.censorFactory.censor(ReferenceCensor.class).censor(lookup.getProject(), null); - ExternalReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrPermission); - List datas = query.collectAs(lookup.getProject()); - List models = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(lookup.getProject(), datas); + ReferenceQuery query = lookup.enrich(this.queryFactory).authorize(AuthorizationFlags.OwnerOrPermission); + List datas = query.collectAs(lookup.getProject()); + List models = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(lookup.getProject(), datas); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); this.auditService.track(AuditableAction.External_Reference_Query, "lookup", lookup); @@ -94,15 +94,15 @@ public class ExternalReferenceController extends BaseController { } @GetMapping("{id}") - public ExternalReference get(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { - logger.debug(new MapLogEntry("retrieving" + eu.eudat.model.ExternalReference.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + public Reference get(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { + logger.debug(new MapLogEntry("retrieving" + Reference.class.getSimpleName()).And("id", id).And("fields", fieldSet)); - this.censorFactory.censor(ExternalReferenceCensor.class).censor(fieldSet, null); + this.censorFactory.censor(ReferenceCensor.class).censor(fieldSet, null); - ExternalReferenceQuery query = this.queryFactory.query(ExternalReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrPermission).ids(id); - ExternalReference model = this.builderFactory.builder(ExternalReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(fieldSet, query.firstAs(fieldSet)); + ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrPermission).ids(id); + Reference model = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, eu.eudat.model.ExternalReference.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.External_Reference_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), @@ -120,16 +120,16 @@ public class ExternalReferenceController extends BaseController { this.authorizationService.authorizeForce(Permission.AuthenticatedRole); ExternalReferencesType externalReferencesType = ExternalReferencesType.of((short) externalType); - List fetcherExternalReferences = this.externalReferenceService.searchExternalReference(externalReferencesType, query, type); + List fetcherExternalReferences = this.referenceService.searchExternalReference(externalReferencesType, query, type); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(fetcherExternalReferences)); } @DeleteMapping("{id}") @Transactional public void delete(@PathVariable("id") UUID id) throws MyForbiddenException, InvalidApplicationException { - logger.debug(new MapLogEntry("retrieving" + ExternalReference.class.getSimpleName()).And("id", id)); + logger.debug(new MapLogEntry("retrieving" + Reference.class.getSimpleName()).And("id", id)); - this.externalReferenceService.deleteAndSave(id); + this.referenceService.deleteAndSave(id); this.auditService.track(AuditableAction.External_Reference_Delete, "id", id); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheOptions.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java similarity index 86% rename from dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheOptions.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java index 08fa2b99a..a7a800a11 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheOptions.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java @@ -1,4 +1,4 @@ -package eu.eudat.logic.services.externalreferences; +package eu.eudat.logic.services.references; import gr.cite.tools.cache.CacheOptions; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java similarity index 97% rename from dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheService.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java index d27effce5..f569f6631 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferencesCacheService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java @@ -1,4 +1,4 @@ -package eu.eudat.logic.services.externalreferences; +package eu.eudat.logic.services.references; import eu.eudat.logic.proxy.config.ExternalUrlCriteria; import gr.cite.tools.cache.CacheService; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java similarity index 87% rename from dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java index 21032c347..9f61dd346 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/externalreferences/ExternalReferenceService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java @@ -1,4 +1,4 @@ -package eu.eudat.logic.services.externalreferences; +package eu.eudat.logic.services.references; import eu.eudat.authorization.Permission; import eu.eudat.commons.enums.ExternalReferencesType; @@ -18,7 +18,7 @@ import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.ApiContext; -import eu.eudat.model.deleter.ExternalReferenceDeleter; +import eu.eudat.model.deleter.ReferenceDeleter; import eu.eudat.models.data.FetcherExternalReference; import eu.eudat.queryable.QueryableList; import gr.cite.commons.web.authz.service.AuthorizationService; @@ -36,9 +36,9 @@ import java.util.*; import java.util.stream.Collectors; @org.springframework.stereotype.Service -public class ExternalReferenceService { +public class ReferenceService { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalReferenceService.class)); + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ReferenceService.class)); private final ApiContext apiContext; private final UserScope userScope; private final RemoteFetcher remoteFetcher; @@ -50,16 +50,16 @@ public class ExternalReferenceService { private final MessageSource messageSource; private final QueryFactory queryFactory; - public ExternalReferenceService(ApiContext apiContext, - UserScope userScope, - RemoteFetcher remoteFetcher, - EntityManager entityManager, - AuthorizationService authorizationService, - DeleterFactory deleterFactory, - BuilderFactory builderFactory, - ConventionService conventionService, - MessageSource messageSource, - QueryFactory queryFactory) { + public ReferenceService(ApiContext apiContext, + UserScope userScope, + RemoteFetcher remoteFetcher, + EntityManager entityManager, + AuthorizationService authorizationService, + DeleterFactory deleterFactory, + BuilderFactory builderFactory, + ConventionService conventionService, + MessageSource messageSource, + QueryFactory queryFactory) { this.apiContext = apiContext; this.userScope = userScope; this.remoteFetcher = remoteFetcher; @@ -77,7 +77,7 @@ public class ExternalReferenceService { this.authorizationService.authorizeForce(Permission.DeleteExternalReference); - this.deleterFactory.deleter(ExternalReferenceDeleter.class).deleteAndSaveByIds(List.of(id)); + this.deleterFactory.deleter(ReferenceDeleter.class).deleteAndSaveByIds(List.of(id)); } // external references: From 5a55e5d739f4a0af2a88d181c1862a522086210f Mon Sep 17 00:00:00 2001 From: amentis Date: Thu, 26 Oct 2023 12:08:45 +0300 Subject: [PATCH 14/25] rename External Reference to Reference --- .../src/app/core/common/enum/source-type.ts | 4 +++ .../external-reference/external-reference.ts | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 dmp-frontend/src/app/core/common/enum/source-type.ts diff --git a/dmp-frontend/src/app/core/common/enum/source-type.ts b/dmp-frontend/src/app/core/common/enum/source-type.ts new file mode 100644 index 000000000..01a5d866a --- /dev/null +++ b/dmp-frontend/src/app/core/common/enum/source-type.ts @@ -0,0 +1,4 @@ +export enum SourceType { + Internal = 0, + External = 1 +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts b/dmp-frontend/src/app/core/model/external-reference/external-reference.ts index 82d264c65..83007906e 100644 --- a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts +++ b/dmp-frontend/src/app/core/model/external-reference/external-reference.ts @@ -1,3 +1,32 @@ +import { ExternalReferencesType } from "@app/core/common/enum/external-references-type"; +import { IsActive } from "@app/core/common/enum/is-active.enum"; +import { SourceType } from "@app/core/common/enum/source-type"; +import { UUID } from "crypto"; +import { DmpBlueprint } from "../dmp-blueprint/dmp-blueprint"; + +export interface Reference { + id: UUID; + label: string; + type: ExternalReferencesType; + description: string; + definition: string; + reference: string; + abbreviation: string; + source: string; + sourceType: SourceType; + isActive: IsActive; + createdAt: Date; + updatedAt: Date; + dmpExternalReferences: DmpReference[]; +} + +export interface DmpReference { + id: UUID; + dmpBlueprint: DmpBlueprint; + externalReference: Reference; + data: string; +} + export interface FetcherExternalReference { id: string; name: string; From aecac1995ddc2906473c8f4008d627a448f452e6 Mon Sep 17 00:00:00 2001 From: amentis Date: Thu, 26 Oct 2023 14:38:18 +0300 Subject: [PATCH 15/25] rename External Reference to Reference --- .../eu/eudat/authorization/Permission.java | 16 +++--- ...ReferencesType.java => ReferenceType.java} | 8 +-- .../java/eu/eudat/data/ReferenceEntity.java | 12 ++--- .../ExternalReferencesTypeConverter.java | 11 ---- .../enums/ReferenceTypeConverter.java | 11 ++++ .../src/main/java/eu/eudat/model/Dmp.java | 6 +-- .../java/eu/eudat/model/DmpReference.java | 6 +-- .../main/java/eu/eudat/model/Reference.java | 14 +++--- .../eu/eudat/model/builder/DmpBuilder.java | 4 +- .../model/builder/DmpReferenceBuilder.java | 4 +- .../eudat/model/builder/ReferenceBuilder.java | 16 +++--- .../eu/eudat/model/censorship/DmpCensor.java | 4 +- .../model/censorship/DmpReferenceCensor.java | 6 +-- .../model/censorship/ReferenceCensor.java | 8 +-- .../java/eu/eudat/query/ReferenceQuery.java | 28 +++++------ .../eudat/query/lookup/ReferenceLookup.java | 14 +++--- .../controllers/v2/ReferenceController.java | 18 +++---- .../logic/proxy/fetching/RemoteFetcher.java | 6 +-- ...ptions.java => ReferenceCacheOptions.java} | 4 +- ...ervice.java => ReferenceCacheService.java} | 28 +++++------ .../services/references/ReferenceService.java | 28 +++++------ ...alReference.java => FetcherReference.java} | 50 +++++++++---------- .../web/src/main/resources/config/cache.yml | 8 +-- .../src/main/resources/config/permissions.yml | 16 +++--- ...l-references-type.ts => reference-type.ts} | 2 +- .../reference.ts} | 14 +++--- .../external-sources.service.ts | 10 ++-- .../form-field/form-field.component.ts | 48 +++++++++--------- 28 files changed, 200 insertions(+), 200 deletions(-) rename dmp-backend/core/src/main/java/eu/eudat/commons/enums/{ExternalReferencesType.java => ReferenceType.java} (69%) delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceTypeConverter.java rename dmp-backend/web/src/main/java/eu/eudat/logic/services/references/{ExternalReferencesCacheOptions.java => ReferenceCacheOptions.java} (65%) rename dmp-backend/web/src/main/java/eu/eudat/logic/services/references/{ExternalReferencesCacheService.java => ReferenceCacheService.java} (57%) rename dmp-backend/web/src/main/java/eu/eudat/models/data/{FetcherExternalReference.java => FetcherReference.java} (73%) rename dmp-frontend/src/app/core/common/enum/{external-references-type.ts => reference-type.ts} (86%) rename dmp-frontend/src/app/core/model/{external-reference/external-reference.ts => reference/reference.ts} (69%) 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 4a06422bd..e6ba36ad8 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 @@ -62,15 +62,15 @@ public final class Permission { public static String ViewDescriptionTemplateTypePage = "ViewDescriptionTemplateTypePage"; public static String ViewDmpBlueprintPage = "ViewDmpBlueprintPage"; - //ExternalReference - public static String BrowseExternalReference = "BrowseExternalReference"; - public static String EditExternalReference = "EditExternalReference"; - public static String DeleteExternalReference = "DeleteExternalReference"; + //Reference + public static String BrowseReference = "BrowseReference"; + public static String EditReference = "EditReference"; + public static String DeleteReference = "DeleteReference"; - //DmpExternalReference - public static String BrowseDmpExternalReference = "BrowseDmpExternalReference"; - public static String EditDmpExternalReference = "EditDmpExternalReference"; - public static String DeleteDmpExternalReference = "DeleteDmpExternalReference"; + //DmpReference + public static String BrowseDmpReference = "BrowseDmpReference"; + public static String EditDmpReference = "EditDmpReference"; + public static String DeleteDmpReference = "DeleteDmpReference"; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ExternalReferencesType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceType.java similarity index 69% rename from dmp-backend/core/src/main/java/eu/eudat/commons/enums/ExternalReferencesType.java rename to dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceType.java index 8fbaafbab..89b79c5d7 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ExternalReferencesType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceType.java @@ -5,7 +5,7 @@ import eu.eudat.data.converters.enums.DatabaseEnum; import java.util.Map; -public enum ExternalReferencesType implements DatabaseEnum { +public enum ReferenceType implements DatabaseEnum { Taxonomies((short) 0), Licenses((short) 1), Publications((short) 2), @@ -22,7 +22,7 @@ public enum ExternalReferencesType implements DatabaseEnum { Researcher((short) 13); private final Short value; - ExternalReferencesType(Short value) { + ReferenceType(Short value) { this.value = value; } @@ -31,9 +31,9 @@ public enum ExternalReferencesType implements DatabaseEnum { return value; } - private static final Map map = EnumUtils.getEnumValueMap(ExternalReferencesType.class); + private static final Map map = EnumUtils.getEnumValueMap(ReferenceType.class); - public static ExternalReferencesType of(Short i) { + public static ReferenceType of(Short i) { return map.get(i); } } 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 bb3b1db63..cf45ebfda 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 @@ -1,9 +1,9 @@ package eu.eudat.data; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; -import eu.eudat.data.converters.enums.ExternalReferencesTypeConverter; +import eu.eudat.data.converters.enums.ReferenceTypeConverter; import eu.eudat.data.converters.enums.IsActiveConverter; import jakarta.persistence.*; import org.hibernate.annotations.Type; @@ -25,8 +25,8 @@ public class ReferenceEntity { public static final String _label = "label"; @Column(name = "type", nullable = false) - @Convert(converter = ExternalReferencesTypeConverter.class) - private ExternalReferencesType type; + @Convert(converter = ReferenceTypeConverter.class) + private ReferenceType type; public static final String _type = "type"; @Column(name = "description") @@ -87,11 +87,11 @@ public class ReferenceEntity { this.label = label; } - public ExternalReferencesType getType() { + public ReferenceType getType() { return type; } - public void setType(ExternalReferencesType type) { + public void setType(ReferenceType type) { this.type = type; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java deleted file mode 100644 index a15b2a130..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ExternalReferencesTypeConverter.java +++ /dev/null @@ -1,11 +0,0 @@ -package eu.eudat.data.converters.enums; - -import eu.eudat.commons.enums.ExternalReferencesType; -import jakarta.persistence.Converter; - -@Converter -public class ExternalReferencesTypeConverter extends DatabaseEnumConverter { - public ExternalReferencesType of(Short i) { - return ExternalReferencesType.of(i); - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceTypeConverter.java new file mode 100644 index 000000000..a8adb12c7 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceTypeConverter.java @@ -0,0 +1,11 @@ +package eu.eudat.data.converters.enums; + +import eu.eudat.commons.enums.ReferenceType; +import jakarta.persistence.Converter; + +@Converter +public class ReferenceTypeConverter extends DatabaseEnumConverter { + public ReferenceType of(Short i) { + return ReferenceType.of(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java index c02eb147e..c95d19e32 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java @@ -93,7 +93,7 @@ public class Dmp { public static final String _dmpDescriptions = "dmpDescriptions"; - public static final String _dmpExternalReferences = "dmpExternalReferences"; + public static final String _dmpReferences = "dmpReferences"; private List dmpReferences; public UUID getId() { @@ -264,11 +264,11 @@ public class Dmp { this.dmpDescriptions = dmpDescriptions; } - public List getDmpExternalReferences() { + public List getDmpReferences() { return dmpReferences; } - public void setDmpExternalReferences(List dmpReferences) { + public void setDmpReferences(List dmpReferences) { this.dmpReferences = dmpReferences; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java index 77b3ff6b4..30b4eaeb3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java @@ -11,7 +11,7 @@ public class DmpReference { public static final String _dmp = "dmp"; private Reference reference; - public static final String _externalReference = "externalReference"; + public static final String _reference = "reference"; private String data; public static final String _data = "data"; @@ -32,11 +32,11 @@ public class DmpReference { this.dmp = dmp; } - public Reference getExternalReference() { + public Reference getReference() { return reference; } - public void setExternalReference(Reference reference) { + public void setReference(Reference reference) { this.reference = reference; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java index 9343e8158..0b2a3beed 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java @@ -1,6 +1,6 @@ package eu.eudat.model; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; @@ -16,7 +16,7 @@ public class Reference { private String label; public static final String _label = "label"; - private ExternalReferencesType type; + private ReferenceType type; public static final String _type = "type"; private String description; @@ -50,7 +50,7 @@ public class Reference { //public static final String _createdBy = "createdBy"; private List dmpReferences; - public static final String _dmpExternalReferences = "dmpExternalReferences"; + public static final String _dmpReferences = "dmpReferences"; public UUID getId() { return id; @@ -68,11 +68,11 @@ public class Reference { this.label = label; } - public ExternalReferencesType getType() { + public ReferenceType getType() { return type; } - public void setType(ExternalReferencesType type) { + public void setType(ReferenceType type) { this.type = type; } @@ -148,11 +148,11 @@ public class Reference { this.updatedAt = updatedAt; } - public List getDmpExternalReferences() { + public List getDmpReferences() { return dmpReferences; } - public void setDmpExternalReferences(List dmpReferences) { + public void setDmpReferences(List dmpReferences) { this.dmpReferences = dmpReferences; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java index 3eff0fdd2..e1e6b4725 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java @@ -57,7 +57,7 @@ public class DmpBuilder extends BaseBuilder { FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asPrefix(Dmp._dmpDescriptions)); Map> dmpDescriptionsMap = this.collectDmpDescriptions(dmpDescriptionsFields, data); - FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpExternalReferences)); + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpReferences)); Map> dmpReferenceMap = this.collectDmpReferences(dmpReferencesFields, data); for (DmpEntity d : data) { @@ -98,7 +98,7 @@ public class DmpBuilder extends BaseBuilder { if (!dmpDescriptionsFields.isEmpty() && dmpDescriptionsMap != null && dmpDescriptionsMap.containsKey(d.getId())) m.setDmpDescriptions(dmpDescriptionsMap.get(d.getId())); - if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) m.setDmpExternalReferences(dmpReferenceMap.get(d.getId())); + if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) m.setDmpReferences(dmpReferenceMap.get(d.getId())); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java index cbd3a58fd..16460d303 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java @@ -52,7 +52,7 @@ public class DmpReferenceBuilder extends BaseBuilder(); - FieldSet referenceFields = fields.extractPrefixed(this.asPrefix(DmpReference._externalReference)); + FieldSet referenceFields = fields.extractPrefixed(this.asPrefix(DmpReference._reference)); Map referenceItemsMap = this.collectReferences(referenceFields, data); FieldSet dmpFields = fields.extractPrefixed(this.asPrefix(DmpReference._dmp)); @@ -64,7 +64,7 @@ public class DmpReferenceBuilder extends BaseBuilder{ if (fields == null || data == null || fields.isEmpty()) return new ArrayList<>(); - //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(ExternalReference._createdBy)); + //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(Reference._createdBy)); - FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpExternalReferences)); + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpReferences)); Map> dmpReferenceMap = this.collectDmpReferences(dmpReferencesFields, data); List models = new ArrayList<>(); @@ -74,7 +74,7 @@ public class ReferenceBuilder extends BaseBuilder{ // if (!userInfoFields.isEmpty() && d.getCreatedBy() != null){ // //ToDo // } - if (!dmpReferenceMap.isEmpty() && dmpReferenceMap != null && dmpReferenceMap.containsKey(d.getId())) m.setDmpExternalReferences(dmpReferenceMap.get(d.getId())); + if (!dmpReferenceMap.isEmpty() && dmpReferenceMap != null && dmpReferenceMap.containsKey(d.getId())) m.setDmpReferences(dmpReferenceMap.get(d.getId())); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); @@ -86,13 +86,13 @@ public class ReferenceBuilder extends BaseBuilder{ this.logger.debug("checking related - {}", DmpReference.class.getSimpleName()); Map> itemMap = null; - FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpReference._externalReference, Reference._id)); + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpReference._reference, Reference._id)); DmpReferenceQuery query = this.queryFactory.query(DmpReferenceQuery.class).authorize(this.authorize).referenceIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); - itemMap = this.builderFactory.builder(DmpReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getExternalReference().getId()); + itemMap = this.builderFactory.builder(DmpReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getReference().getId()); - if (!fields.hasField(this.asIndexer(DmpReference._externalReference, Reference._id))) { - itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getExternalReference() != null).map(x -> { - x.getExternalReference().setId(null); + if (!fields.hasField(this.asIndexer(DmpReference._reference, Reference._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getReference() != null).map(x -> { + x.getReference().setId(null); return x; }).collect(Collectors.toList()); } 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 e99138cb1..ecdd35220 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 @@ -42,8 +42,8 @@ public class DmpCensor extends BaseCensor { FieldSet dmpDescriptionsFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpDescriptions)); this.censorFactory.censor(DescriptionCensor.class).censor(dmpDescriptionsFields, userId); - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpExternalReferences)); - this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpExternalReferencesFields, userId); + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Dmp._dmpReferences)); + this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpReferencesFields, userId); } } 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 97364c931..1ea827b13 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 @@ -37,11 +37,11 @@ public class DmpReferenceCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseDmpExternalReference); + this.authService.authorizeForce(Permission.BrowseDmpReference); FieldSet dmpFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._dmp)); this.censorFactory.censor(DmpCensor.class).censor(dmpFields, userId); - FieldSet externalReferenceFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._externalReference)); - this.censorFactory.censor(ReferenceCensor.class).censor(externalReferenceFields, userId); + FieldSet referenceFields = fields.extractPrefixed(this.asIndexerPrefix(DmpReference._reference)); + this.censorFactory.censor(ReferenceCensor.class).censor(referenceFields, userId); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java index 5b9ce98be..f8b54a291 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/ReferenceCensor.java @@ -37,11 +37,11 @@ public class ReferenceCensor extends BaseCensor { if (fields == null || fields.isEmpty()) return; - this.authService.authorizeForce(Permission.BrowseExternalReference); - FieldSet dmpExternalReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Reference._dmpExternalReferences)); - this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpExternalReferencesFields, userId); + this.authService.authorizeForce(Permission.BrowseReference); + FieldSet dmpReferencesFields = fields.extractPrefixed(this.asIndexerPrefix(Reference._dmpReferences)); + this.censorFactory.censor(DmpReferenceCensor.class).censor(dmpReferencesFields, userId); //ToDo - //FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalReference._createdBy)); + //FieldSet definitionFields = fields.extractPrefixed(this.asIndexerPrefix(Reference._createdBy)); //this.censorFactory.censor(UserInfo.class).censor(definitionFields, userId); } 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 6ffddfec3..1fc160a6c 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,7 +1,7 @@ package eu.eudat.query; import eu.eudat.authorization.AuthorizationFlags; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; import eu.eudat.commons.scope.user.UserScope; @@ -32,7 +32,7 @@ public class ReferenceQuery extends QueryBase { private Collection sourceTypes; - private Collection externalReferenceTypes; + private Collection referenceTypes; private Collection excludedIds; @@ -73,18 +73,18 @@ public class ReferenceQuery extends QueryBase { return this; } - public ReferenceQuery externalReferenceTypes(ExternalReferencesType value) { - this.externalReferenceTypes = List.of(value); + public ReferenceQuery referenceTypes(ReferenceType value) { + this.referenceTypes = List.of(value); return this; } - public ReferenceQuery externalReferenceTypes(ExternalReferencesType... value) { - this.externalReferenceTypes = Arrays.asList(value); + public ReferenceQuery referenceTypes(ReferenceType... value) { + this.referenceTypes = Arrays.asList(value); return this; } - public ReferenceQuery externalReferenceTypes(Collection values) { - this.externalReferenceTypes = values; + public ReferenceQuery referenceTypes(Collection values) { + this.referenceTypes = values; return this; } @@ -142,7 +142,7 @@ public class ReferenceQuery extends QueryBase { @Override protected Boolean isFalseQuery() { - return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.externalReferenceTypes) || this.isEmpty(this.sourceTypes); + return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.referenceTypes) || this.isEmpty(this.sourceTypes); } @Override @@ -171,9 +171,9 @@ public class ReferenceQuery extends QueryBase { inClause.value(item); predicates.add(inClause); } - if (this.externalReferenceTypes != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._type)); - for (ExternalReferencesType item : this.externalReferenceTypes) + if (this.referenceTypes != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._type)); + for (ReferenceType item : this.referenceTypes) inClause.value(item); predicates.add(inClause); } @@ -205,7 +205,7 @@ public class ReferenceQuery extends QueryBase { item.setReference(QueryBase.convertSafe(tuple, columns, ReferenceEntity._reference, String.class)); item.setSource(QueryBase.convertSafe(tuple, columns, ReferenceEntity._source, String.class)); item.setSourceType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._sourceType, SourceType.class)); - item.setType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._type, ExternalReferencesType.class)); + item.setType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._type, ReferenceType.class)); item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ReferenceEntity._createdBy, UUID.class)); return item; } @@ -224,7 +224,7 @@ public class ReferenceQuery extends QueryBase { else if (item.match(ReferenceEntity._source)) return ReferenceEntity._source; else if (item.match(ReferenceEntity._sourceType)) return ReferenceEntity._sourceType; else if (item.match(ReferenceEntity._type)) return ReferenceEntity._type; - //else if (item.prefix(ExternalReferenceEntity._createdBy)) return ExternalReferenceEntity._createdBy; + //else if (item.prefix(ReferenceEntity._createdBy)) return ReferenceEntity._createdBy; else return null; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java index d307d67b6..10b414b34 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java @@ -1,6 +1,6 @@ package eu.eudat.query.lookup; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; import eu.eudat.query.ReferenceQuery; @@ -19,7 +19,7 @@ public class ReferenceLookup extends Lookup { private Collection sourceTypes; - private Collection externalReferenceTypes; + private Collection referenceTypes; private List ids; @@ -65,19 +65,19 @@ public class ReferenceLookup extends Lookup { this.sourceTypes = sourceTypes; } - public Collection getExternalReferenceTypes() { - return externalReferenceTypes; + public Collection getReferenceTypes() { + return referenceTypes; } - public void setExternalReferenceTypes(Collection externalReferenceTypes) { - this.externalReferenceTypes = externalReferenceTypes; + public void setReferenceTypes(Collection referenceTypes) { + this.referenceTypes = referenceTypes; } public ReferenceQuery enrich(QueryFactory queryFactory) { ReferenceQuery query = queryFactory.query(ReferenceQuery.class); if (this.like != null) query.like(this.like); if (this.isActive != null) query.isActive(this.isActive); - if (this.externalReferenceTypes != null) query.externalReferenceTypes(this.externalReferenceTypes); + if (this.referenceTypes != null) query.referenceTypes(this.referenceTypes); if (this.sourceTypes != null) query.sourceTypes(this.sourceTypes); if (this.ids != null) query.ids(this.ids); if (this.excludedIds != null) query.excludedIds(this.excludedIds); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java index 49cfcd7ed..7c51ed60c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java @@ -3,7 +3,7 @@ package eu.eudat.controllers.v2; import eu.eudat.audit.AuditableAction; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.controllers.BaseController; import eu.eudat.data.ReferenceEntity; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; @@ -14,7 +14,7 @@ import eu.eudat.model.Reference; import eu.eudat.model.builder.ReferenceBuilder; import eu.eudat.model.censorship.ReferenceCensor; import eu.eudat.model.result.QueryResult; -import eu.eudat.models.data.FetcherExternalReference; +import eu.eudat.models.data.FetcherReference; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.query.ReferenceQuery; import eu.eudat.query.lookup.ReferenceLookup; @@ -46,7 +46,7 @@ import java.util.Map; import java.util.UUID; @RestController -@RequestMapping(path = {"api/external-references"}) +@RequestMapping(path = {"api/reference"}) public class ReferenceController extends BaseController { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ReferenceController.class)); @@ -113,15 +113,15 @@ public class ReferenceController extends BaseController { } @GetMapping(path = {"search/{externalType}"}, produces = "application/json") - public @ResponseBody ResponseEntity>> searchExternalReference(@PathVariable(value = "externalType") int externalType, - @RequestParam(value = "query", required = false) String query, - @RequestParam(value = "type", required = false) String type + public @ResponseBody ResponseEntity>> searchReference(@PathVariable(value = "externalType") int externalType, + @RequestParam(value = "query", required = false) String query, + @RequestParam(value = "type", required = false) String type ) throws HugeResultSet, NoURLFound, InvalidApplicationException { this.authorizationService.authorizeForce(Permission.AuthenticatedRole); - ExternalReferencesType externalReferencesType = ExternalReferencesType.of((short) externalType); + ReferenceType referenceType = ReferenceType.of((short) externalType); - List fetcherExternalReferences = this.referenceService.searchExternalReference(externalReferencesType, query, type); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(fetcherExternalReferences)); + List fetcherReferences = this.referenceService.searchReference(referenceType, query, type); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(fetcherReferences)); } @DeleteMapping("{id}") diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index dbff82dd0..a629ec4e1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.logic.proxy.config.*; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.logic.proxy.config.entities.GenericUrls; @@ -51,7 +51,7 @@ public class RemoteFetcher { ).clientConnector(new ReactorClientHttpConnector(HttpClient.create().followRedirect(true))).build(); } - public List> get(ExternalReferencesType externalType, ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> get(ReferenceType externalType, ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { FetchStrategy fetchStrategy = null; GenericUrls exGenericUrls = this.getExternalUrls(externalType); List urlConfigs = key != null && !key.isEmpty() ? exGenericUrls.getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -60,7 +60,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - public GenericUrls getExternalUrls(ExternalReferencesType externalType) { + public GenericUrls getExternalUrls(ReferenceType externalType) { switch (externalType){ case Taxonomies: return configLoader.getExternalUrls().getTaxonomies(); case Licenses: return configLoader.getExternalUrls().getLicenses(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheOptions.java similarity index 65% rename from dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheOptions.java index a7a800a11..5bf2bda62 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheOptions.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheOptions.java @@ -5,6 +5,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -@ConfigurationProperties(prefix = "cache.external-reference") -public class ExternalReferencesCacheOptions extends CacheOptions { +@ConfigurationProperties(prefix = "cache.reference") +public class ReferenceCacheOptions extends CacheOptions { } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheService.java similarity index 57% rename from dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheService.java index f569f6631..df182cc74 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ExternalReferencesCacheService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceCacheService.java @@ -9,27 +9,27 @@ import java.util.HashMap; import java.util.Locale; @Service -public class ExternalReferencesCacheService extends CacheService { +public class ReferenceCacheService extends CacheService { - public static class ExternalReferencesCacheValue { + public static class ReferenceCacheValue { - public ExternalReferencesCacheValue() {} + public ReferenceCacheValue() {} - public ExternalReferencesCacheValue(String externalType, ExternalUrlCriteria externalUrlCriteria) { - this.externalType = externalType; + public ReferenceCacheValue(String type, ExternalUrlCriteria externalUrlCriteria) { + this.type = type; this.externalUrlCriteria = externalUrlCriteria; } - private String externalType; + private String type; private ExternalUrlCriteria externalUrlCriteria; - public String getExternalType() { - return externalType; + public String getType() { + return type; } - public void setExternalType(String externalType) { - this.externalType = externalType; + public void setType(String type) { + this.type = type; } public ExternalUrlCriteria getExternalUrlCriteria() { @@ -42,15 +42,15 @@ public class ExternalReferencesCacheService extends CacheService valueClass() {return ExternalReferencesCacheValue.class;} + protected Class valueClass() {return ReferenceCacheValue.class;} - public String keyOf(ExternalReferencesCacheValue value) { - return this.buildKey(value.getExternalType(), value.getExternalUrlCriteria()); + public String keyOf(ReferenceCacheValue value) { + return this.buildKey(value.getType(), value.getExternalUrlCriteria()); } public String buildKey(String externalType, ExternalUrlCriteria externalUrlCriteria) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java index 9f61dd346..e531b4a60 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java @@ -1,7 +1,7 @@ package eu.eudat.logic.services.references; import eu.eudat.authorization.Permission; -import eu.eudat.commons.enums.ExternalReferencesType; +import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.scope.user.UserScope; import eu.eudat.convention.ConventionService; import eu.eudat.data.dao.criteria.DataRepositoryCriteria; @@ -19,7 +19,7 @@ import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.ApiContext; import eu.eudat.model.deleter.ReferenceDeleter; -import eu.eudat.models.data.FetcherExternalReference; +import eu.eudat.models.data.FetcherReference; import eu.eudat.queryable.QueryableList; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.builder.BuilderFactory; @@ -75,7 +75,7 @@ public class ReferenceService { public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { logger.debug("deleting : {}", id); - this.authorizationService.authorizeForce(Permission.DeleteExternalReference); + this.authorizationService.authorizeForce(Permission.DeleteReference); this.deleterFactory.deleter(ReferenceDeleter.class).deleteAndSaveByIds(List.of(id)); } @@ -89,26 +89,26 @@ public class ReferenceService { // dataRepositories // registries, // services - public List searchExternalReference(ExternalReferencesType externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { + public List searchReference(ReferenceType externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); List> remoteRepos = null; - if (externalType.equals(ExternalReferencesType.Datasets)){ + if (externalType.equals(ReferenceType.Datasets)){ remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); }else { remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); } - List list = this.fetchFromDb(externalType, query, type, remoteRepos); + List list = this.fetchFromDb(externalType, query, type, remoteRepos); - list.addAll(remoteRepos.stream().map(FetcherExternalReference::fromRemoteModel).toList()); + list.addAll(remoteRepos.stream().map(FetcherReference::fromRemoteModel).toList()); list = list.stream().filter(x -> x.getName().toLowerCase().contains(query.toLowerCase())).collect(Collectors.toList()); - list.sort(Comparator.comparing(FetcherExternalReference::getName)); + list.sort(Comparator.comparing(FetcherReference::getName)); return list; } - private List fetchFromDb(ExternalReferencesType externalType, String query, String type, List> remoteRepos) throws InvalidApplicationException { - List list = new LinkedList<>(); + private List fetchFromDb(ReferenceType externalType, String query, String type, List> remoteRepos) throws InvalidApplicationException { + List list = new LinkedList<>(); switch (externalType) { case DataRepositories: case PubRepositories: @@ -118,7 +118,7 @@ public class ReferenceService { criteria.setCreationUserId(this.userScope.getUserId()); if (type.equals("")) { List dataRepositoryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().getWithCriteria(criteria)).toList(); - list = dataRepositoryList.stream().map(item -> new FetcherExternalReference().fromDataRepository(item)).collect(Collectors.toList()); + list = dataRepositoryList.stream().map(item -> new FetcherReference().fromDataRepository(item)).collect(Collectors.toList()); } } case Registries: { @@ -127,7 +127,7 @@ public class ReferenceService { criteria.setCreationUserId(this.userScope.getUserId()); if (type.equals("")) { List registryList = (this.apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().getWithCriteria(criteria)).toList(); - list = registryList.stream().map(item -> new FetcherExternalReference().fromRegistry(item)).collect(Collectors.toList()); + list = registryList.stream().map(item -> new FetcherReference().fromRegistry(item)).collect(Collectors.toList()); } } case Services: @@ -139,7 +139,7 @@ public class ReferenceService { if (type.equals("")) { List serviceList = (this.apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().getWithCriteria(criteria)).toList(); - list = serviceList.stream().map(item -> new FetcherExternalReference().fromService(item)).collect(Collectors.toList()); + list = serviceList.stream().map(item -> new FetcherReference().fromService(item)).collect(Collectors.toList()); } } case Datasets:{ @@ -149,7 +149,7 @@ public class ReferenceService { criteria.setCreationUserId(this.userScope.getUserId()); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); - list = items.select(item -> new FetcherExternalReference().fromDataset(item)); + list = items.select(item -> new FetcherReference().fromDataset(item)); } case Taxonomies: case Publications: diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherReference.java similarity index 73% rename from dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java rename to dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherReference.java index 4e3c785fe..747f3b496 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherExternalReference.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/FetcherReference.java @@ -4,7 +4,7 @@ import eu.eudat.data.old.*; import java.util.Map; -public class FetcherExternalReference { +public class FetcherReference { private String id; private String name; @@ -133,28 +133,28 @@ public class FetcherExternalReference { this.tag = tag; } - public static FetcherExternalReference fromRemoteModel(Map data) { - FetcherExternalReference fetcherExternalReference = new FetcherExternalReference(); - if (data == null) return fetcherExternalReference; + public static FetcherReference fromRemoteModel(Map data) { + FetcherReference fetcherReference = new FetcherReference(); + if (data == null) return fetcherReference; - fetcherExternalReference.setId(data.getOrDefault("id", null)); - fetcherExternalReference.setName(data.getOrDefault("name", null)); - fetcherExternalReference.setPid(data.getOrDefault("pid", null)); - fetcherExternalReference.setPidTypeField(data.getOrDefault("pidTypeField", null)); - fetcherExternalReference.setUri(data.getOrDefault("uri", null)); - fetcherExternalReference.setDescription(data.getOrDefault("description", null)); - fetcherExternalReference.setSource(data.getOrDefault("source", null)); - fetcherExternalReference.setCount(data.getOrDefault("count", null)); - fetcherExternalReference.setPath(data.getOrDefault("path", null)); - fetcherExternalReference.setHost(data.getOrDefault("host", null)); - fetcherExternalReference.setTypes(data.getOrDefault("types", null)); - fetcherExternalReference.setFirstName(data.getOrDefault("firstName", null)); - fetcherExternalReference.setLastName(data.getOrDefault("lastName", null)); - fetcherExternalReference.setTag(data.getOrDefault("tag", null)); - return fetcherExternalReference; + fetcherReference.setId(data.getOrDefault("id", null)); + fetcherReference.setName(data.getOrDefault("name", null)); + fetcherReference.setPid(data.getOrDefault("pid", null)); + fetcherReference.setPidTypeField(data.getOrDefault("pidTypeField", null)); + fetcherReference.setUri(data.getOrDefault("uri", null)); + fetcherReference.setDescription(data.getOrDefault("description", null)); + fetcherReference.setSource(data.getOrDefault("source", null)); + fetcherReference.setCount(data.getOrDefault("count", null)); + fetcherReference.setPath(data.getOrDefault("path", null)); + fetcherReference.setHost(data.getOrDefault("host", null)); + fetcherReference.setTypes(data.getOrDefault("types", null)); + fetcherReference.setFirstName(data.getOrDefault("firstName", null)); + fetcherReference.setLastName(data.getOrDefault("lastName", null)); + fetcherReference.setTag(data.getOrDefault("tag", null)); + return fetcherReference; } - public FetcherExternalReference fromDataRepository(DataRepository entity) { + public FetcherReference fromDataRepository(DataRepository entity) { // this.setAbbreviation(entity.getAbbreviation()); this.setName(entity.getLabel()); this.setUri(entity.getUri()); @@ -169,7 +169,7 @@ public class FetcherExternalReference { return this; } - public FetcherExternalReference fromRegistry(Registry entity){ + public FetcherReference fromRegistry(Registry entity){ this.id = entity.getId().toString(); // this.abbreviation = entity.getAbbreviation(); // this.created = entity.getCreated(); @@ -186,7 +186,7 @@ public class FetcherExternalReference { // this.reference = entity.getReference(); return this; } - public FetcherExternalReference fromService(Service entity) { + public FetcherReference fromService(Service entity) { // this.abbreviation = entity.getAbbreviation(); // this.created = entity.getCreated(); this.id = entity.getId().toString(); @@ -203,7 +203,7 @@ public class FetcherExternalReference { return this; } - public FetcherExternalReference fromResearcher(Researcher entity){ + public FetcherReference fromResearcher(Researcher entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String refParts[] = entity.getReference().split(":"); @@ -216,7 +216,7 @@ public class FetcherExternalReference { return this; } - public FetcherExternalReference fromOrganisation(Organisation entity){ + public FetcherReference fromOrganisation(Organisation entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String refParts[] = entity.getReference().split(":"); @@ -229,7 +229,7 @@ public class FetcherExternalReference { return this; } - public FetcherExternalReference fromDataset(ExternalDataset entity){ + public FetcherReference fromDataset(ExternalDataset entity){ this.id = entity.getId().toString(); this.name = entity.getLabel(); String source1 = entity.getReference().substring(0, entity.getReference().indexOf(":")); diff --git a/dmp-backend/web/src/main/resources/config/cache.yml b/dmp-backend/web/src/main/resources/config/cache.yml index d5b1ed0aa..637bb3033 100644 --- a/dmp-backend/web/src/main/resources/config/cache.yml +++ b/dmp-backend/web/src/main/resources/config/cache.yml @@ -26,7 +26,7 @@ cache: expireAfterWriteMinutes: 10 expireAfterAccessMinutes: 10 refreshAfterWriteMinutes: 10 - - names: [ "externalReference" ] + - names: [ "Reference" ] allowNullValues: true initialCapacity: 100 maximumSize: 500 @@ -44,6 +44,6 @@ cache: supportiveMaterial: name: supportiveMaterial keyPattern: supportive_material_$material$:v0 - externalReference: - name: externalReference - keyPattern: external_reference_$type$_$criteria$:v0 \ No newline at end of file + Reference: + name: Reference + keyPattern: reference_$type$_$criteria$:v0 \ No newline at end of file diff --git a/dmp-backend/web/src/main/resources/config/permissions.yml b/dmp-backend/web/src/main/resources/config/permissions.yml index de2ec5149..52fa74adc 100644 --- a/dmp-backend/web/src/main/resources/config/permissions.yml +++ b/dmp-backend/web/src/main/resources/config/permissions.yml @@ -196,20 +196,20 @@ permissions: allowAnonymous: false allowAuthenticated: false - # ExternalReference Permissions - BrowseExternalReference: + # Reference Permissions + BrowseReference: roles: - Admin clients: [ ] allowAnonymous: false allowAuthenticated: false - EditExternalReference: + EditReference: roles: - Admin clients: [ ] allowAnonymous: false allowAuthenticated: false - DeleteExternalReference: + DeleteReference: roles: - Admin claims: [ ] @@ -217,20 +217,20 @@ permissions: allowAnonymous: false allowAuthenticated: false - # DmpExternalReference Permissions - BrowseDmpExternalReference: + # DmpReference Permissions + BrowseDmpReference: roles: - Admin clients: [ ] allowAnonymous: false allowAuthenticated: false - EditDmpExternalReference: + EditDmpReference: roles: - Admin clients: [ ] allowAnonymous: false allowAuthenticated: false - DeleteDmpExternalReference: + DeleteDmpReference: roles: - Admin claims: [ ] diff --git a/dmp-frontend/src/app/core/common/enum/external-references-type.ts b/dmp-frontend/src/app/core/common/enum/reference-type.ts similarity index 86% rename from dmp-frontend/src/app/core/common/enum/external-references-type.ts rename to dmp-frontend/src/app/core/common/enum/reference-type.ts index 2fb2dae89..0c5c48d9b 100644 --- a/dmp-frontend/src/app/core/common/enum/external-references-type.ts +++ b/dmp-frontend/src/app/core/common/enum/reference-type.ts @@ -1,4 +1,4 @@ -export enum ExternalReferencesType { +export enum ReferenceType { Taxonomies = 0, Licenses = 1, Publications = 2, diff --git a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts b/dmp-frontend/src/app/core/model/reference/reference.ts similarity index 69% rename from dmp-frontend/src/app/core/model/external-reference/external-reference.ts rename to dmp-frontend/src/app/core/model/reference/reference.ts index 83007906e..a03191bea 100644 --- a/dmp-frontend/src/app/core/model/external-reference/external-reference.ts +++ b/dmp-frontend/src/app/core/model/reference/reference.ts @@ -1,13 +1,13 @@ -import { ExternalReferencesType } from "@app/core/common/enum/external-references-type"; +import { ReferenceType } from "@app/core/common/enum/reference-type"; import { IsActive } from "@app/core/common/enum/is-active.enum"; import { SourceType } from "@app/core/common/enum/source-type"; import { UUID } from "crypto"; -import { DmpBlueprint } from "../dmp-blueprint/dmp-blueprint"; +import { DmpModel } from "../dmp/dmp"; export interface Reference { id: UUID; label: string; - type: ExternalReferencesType; + type: ReferenceType; description: string; definition: string; reference: string; @@ -17,17 +17,17 @@ export interface Reference { isActive: IsActive; createdAt: Date; updatedAt: Date; - dmpExternalReferences: DmpReference[]; + dmpReferences: DmpReference[]; } export interface DmpReference { id: UUID; - dmpBlueprint: DmpBlueprint; - externalReference: Reference; + dmp: DmpModel; + reference: Reference; data: string; } -export interface FetcherExternalReference { +export interface FetcherReference { id: string; name: string; pid: string; diff --git a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts index e3b42585b..937aa57fa 100644 --- a/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts +++ b/dmp-frontend/src/app/core/services/external-sources/external-sources.service.ts @@ -14,8 +14,8 @@ import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; import { LicenseCriteria } from '@app/core/query/license/license-criteria'; import {PublicationCriteria} from "@app/core/query/publication/publication-criteria"; -import { FetcherExternalReference } from '@app/core/model/external-reference/external-reference'; -import { ExternalReferencesType } from '@app/core/common/enum/external-references-type'; +import { FetcherReference } from '@app/core/model/reference/reference'; +import { ReferenceType } from '@app/core/common/enum/reference-type'; @Injectable() export class ExternalSourcesService { @@ -59,11 +59,11 @@ export class ExternalSourcesService { return this.http.get(this.actionUrl + 'licenses' + '?query=' + requestItem.criteria.like + '&type=' + requestItem.criteria.type, { headers: this.headers }); } - public listExternal(externalType: ExternalReferencesType, query: string, type: string): Observable { - const url = this.configurationService.server + `external-references/search/${externalType}`; + public listExternal(externalType: ReferenceType, query: string, type: string): Observable { + const url = this.configurationService.server + `reference/search/${externalType}`; const options = { params: { query: query, type: type } }; - return this.http.get(url, options); + return this.http.get(url, options); } public searchDatasetTags(requestItem: RequestItem): Observable { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts index c11d835c6..3b4c22ab1 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.ts @@ -48,8 +48,8 @@ import {MatDialog} from "@angular/material/dialog"; import {HttpError} from "@common/modules/errors/error-handling/http-error-handling.service"; import {HttpErrorResponse} from "@angular/common/http"; import * as FileSaver from "file-saver"; -import { FetcherExternalReference } from '@app/core/model/external-reference/external-reference'; -import { ExternalReferencesType } from '@app/core/common/enum/external-references-type'; +import { FetcherReference } from '@app/core/model/reference/reference'; +import { ReferenceType } from '@app/core/common/enum/reference-type'; import { FileUtils } from '@app/core/services/utilities/file-utils.service'; @Component({ @@ -466,72 +466,72 @@ export class FormFieldComponent extends BaseComponent implements OnInit { } } - searchDatasetExternalDatasets(query: string): Observable { + searchDatasetExternalDatasets(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new ExternalDatasetCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; //return this.externalSourcesService.searchDatasetSExternalDatasetservice(requestItem); - return this.externalSourcesService.listExternal(ExternalReferencesType.Datasets, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Datasets, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalDataRepositories(query: string): Observable { + searchDatasetExternalDataRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.DataRepositories, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.DataRepositories, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalPubRepositories(query: string): Observable { + searchDatasetExternalPubRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.PubRepositories, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.PubRepositories, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalJournalRepositories(query: string): Observable { + searchDatasetExternalJournalRepositories(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new DataRepositoryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Journals, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Journals, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalTaxonomies(query: string): Observable { + searchDatasetExternalTaxonomies(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new TaxonomyCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Taxonomies, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Taxonomies, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalLicences(query: string): Observable { + searchDatasetExternalLicences(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new LicenseCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Licenses, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Licenses, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalPublications(query: string): Observable { + searchDatasetExternalPublications(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new PublicationCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Publications, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Publications, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalRegistries(query: string): Observable { + searchDatasetExternalRegistries(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new RegistryCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Registries, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Registries, requestItem.criteria.like, requestItem.criteria.type); } - searchDatasetExternalServices(query: string): Observable { + searchDatasetExternalServices(query: string): Observable { const requestItem: RequestItem = new RequestItem(); requestItem.criteria = new ServiceCriteria(); requestItem.criteria.like = query; requestItem.criteria.type = ''; - return this.externalSourcesService.listExternal(ExternalReferencesType.Services, requestItem.criteria.like, requestItem.criteria.type); + return this.externalSourcesService.listExternal(ReferenceType.Services, requestItem.criteria.like, requestItem.criteria.type); } searchDatasetTags(query: string): Observable { @@ -593,14 +593,14 @@ export class FormFieldComponent extends BaseComponent implements OnInit { } } - filterOrganisations(value: string): Observable { + filterOrganisations(value: string): Observable { //return this.externalSourcesService.searchDMPOrganizations(value); - return this.externalSourcesService.listExternal(ExternalReferencesType.Organizations, value, ''); + return this.externalSourcesService.listExternal(ReferenceType.Organizations, value, ''); } - filterResearchers(value: string): Observable { + filterResearchers(value: string): Observable { //return this.externalSourcesService.searchDMPResearchers({ criteria: { name: value, like: null } }); - return this.externalSourcesService.listExternal(ExternalReferencesType.Researcher, value, ''); + return this.externalSourcesService.listExternal(ReferenceType.Researcher, value, ''); } getDatasetIdControl(name: string): UntypedFormControl { From d983e1e38e041626f90334c94cd6562b04432edf Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 26 Oct 2023 18:04:55 +0300 Subject: [PATCH 16/25] Add Deposit Security --- .../configurations/DepositConfiguration.java | 24 +++++++++- .../configurations/DepositProperties.java | 48 ++++++++++++++++--- .../web/src/main/resources/config/deposit.yml | 8 +++- 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java index cf208d12b..0f1ccdfd2 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java @@ -7,6 +7,14 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager; +import org.springframework.security.oauth2.client.InMemoryReactiveOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.InMemoryReactiveClientRegistrationRepository; +import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.web.reactive.function.client.WebClient; import java.util.ArrayList; @@ -27,8 +35,20 @@ public class DepositConfiguration { @Qualifier("depositClients") public List depositClients() { List clients = new ArrayList<>(); - for (String url: properties.getUrls()) { - clients.add(new DepositRepository(WebClient.builder().baseUrl(url + "/api/deposit").build())); + for (DepositProperties.DepositSource source: properties.getSources()) { + ClientRegistration clientRegistration = ClientRegistration + .withRegistrationId(source.getClientId()) + .clientId(source.getClientId()) + .clientSecret(source.getClientSecret()) + .scope(source.getScope()) + .issuerUri(source.getIssuerUrl()) + .authorizationGrantType(AuthorizationGrantType.JWT_BEARER) + .build(); + ReactiveClientRegistrationRepository clientRegistrationRepository = new InMemoryReactiveClientRegistrationRepository(clientRegistration); + ReactiveOAuth2AuthorizedClientService clientService = new InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrationRepository); + AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, clientService); + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); + clients.add(new DepositRepository(WebClient.builder().baseUrl(source.getUrl() + "/api/deposit").filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(oauth)).build())); } return clients; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java index aa7a37f40..162d1fd52 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositProperties.java @@ -8,18 +8,52 @@ import java.util.List; @ConfigurationProperties(prefix = "deposit") public class DepositProperties { - private List urls; + private final List sources; @ConstructorBinding - public DepositProperties(List urls) { - this.urls = urls; + public DepositProperties(List sources) { + this.sources = sources; } - public List getUrls() { - return urls; + public List getSources() { + return sources; } - public void setUrls(List urls) { - this.urls = urls; + public static class DepositSource { + + private final String url; + private final String issuerUrl; + private final String clientId; + private final String clientSecret; + private final String scope; + + @ConstructorBinding + public DepositSource(String url, String issuerUrl, String clientId, String clientSecret, String scope) { + this.url = url; + this.issuerUrl = issuerUrl; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.scope = scope; + } + + public String getUrl() { + return url; + } + + public String getIssuerUrl() { + return issuerUrl; + } + + public String getClientId() { + return clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public String getScope() { + return scope; + } } } diff --git a/dmp-backend/web/src/main/resources/config/deposit.yml b/dmp-backend/web/src/main/resources/config/deposit.yml index bf19ffbd5..4c2393257 100644 --- a/dmp-backend/web/src/main/resources/config/deposit.yml +++ b/dmp-backend/web/src/main/resources/config/deposit.yml @@ -1,3 +1,7 @@ deposit: - urls: - - http://localhost:8080 \ No newline at end of file + sources: + - url: http://localhost:8082 + issuer-url: ${ZENODO_ISSUER_URI:IDP_APIKEY_ISSUER_URI} + client-id: ${ZENODO_DEPOSIT_CLIENT_ID:} + client-secret: ${ZENODO_DEPOSIT_CLIENT_SECRET:} + scope: ${ZENODO_DEPOSIT_SCOPE:} \ No newline at end of file From e4203a3bb4b15ebc82c02ebea173608febef1630 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Fri, 27 Oct 2023 09:54:49 +0300 Subject: [PATCH 17/25] backend fixes --- .../types/dmpblueprint/SectionEntity.java | 10 ++++--- .../configurations/DepositConfiguration.java | 26 +++++++++---------- .../dmpblueprintdefinition/FieldPersist.java | 3 ++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/types/dmpblueprint/SectionEntity.java b/dmp-backend/core/src/main/java/eu/eudat/commons/types/dmpblueprint/SectionEntity.java index e91ecaacf..1ca7c9a19 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/types/dmpblueprint/SectionEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/types/dmpblueprint/SectionEntity.java @@ -87,11 +87,13 @@ public class SectionEntity implements XmlSerializable { systemFields.appendChild(systemField.toXml(doc)); } rootElement.appendChild(systemFields); - Element descriptionTemplates = doc.createElement("descriptionTemplates"); - for (DescriptionTemplateEntity descriptionTemplate : this.descriptionTemplates) { - descriptionTemplates.appendChild(descriptionTemplate.toXml(doc)); + if (this.descriptionTemplates != null) { + Element descriptionTemplates = doc.createElement("descriptionTemplates"); + for (DescriptionTemplateEntity descriptionTemplate : this.descriptionTemplates) { + descriptionTemplates.appendChild(descriptionTemplate.toXml(doc)); + } + rootElement.appendChild(descriptionTemplates); } - rootElement.appendChild(descriptionTemplates); temp = this.fields.stream().filter(f -> f.getCategory().equals(DmpBlueprintFieldCategory.Extra)).collect(Collectors.toList()); List extraFieldList = temp.stream().map(x-> (ExtraFieldEntity)x).collect(Collectors.toList()); Element extraFields = doc.createElement("extraFields"); diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java index 0f1ccdfd2..50159cdde 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/DepositConfiguration.java @@ -36,19 +36,19 @@ public class DepositConfiguration { public List depositClients() { List clients = new ArrayList<>(); for (DepositProperties.DepositSource source: properties.getSources()) { - ClientRegistration clientRegistration = ClientRegistration - .withRegistrationId(source.getClientId()) - .clientId(source.getClientId()) - .clientSecret(source.getClientSecret()) - .scope(source.getScope()) - .issuerUri(source.getIssuerUrl()) - .authorizationGrantType(AuthorizationGrantType.JWT_BEARER) - .build(); - ReactiveClientRegistrationRepository clientRegistrationRepository = new InMemoryReactiveClientRegistrationRepository(clientRegistration); - ReactiveOAuth2AuthorizedClientService clientService = new InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrationRepository); - AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, clientService); - ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); - clients.add(new DepositRepository(WebClient.builder().baseUrl(source.getUrl() + "/api/deposit").filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(oauth)).build())); +// ClientRegistration clientRegistration = ClientRegistration +// .withRegistrationId(source.getClientId()) +// .clientId(source.getClientId()) +// .clientSecret(source.getClientSecret()) +// .scope(source.getScope()) +// .issuerUri(source.getIssuerUrl()) +// .authorizationGrantType(AuthorizationGrantType.JWT_BEARER) +// .build(); +// ReactiveClientRegistrationRepository clientRegistrationRepository = new InMemoryReactiveClientRegistrationRepository(clientRegistration); +// ReactiveOAuth2AuthorizedClientService clientService = new InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrationRepository); +// AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, clientService); +// ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); +// clients.add(new DepositRepository(WebClient.builder().baseUrl(source.getUrl() + "/api/deposit").filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(oauth)).build())); } return clients; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/FieldPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/FieldPersist.java index 69a36e177..c43857531 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/FieldPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/FieldPersist.java @@ -14,7 +14,8 @@ import java.util.UUID; @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, - property = "category") + property = "category", + visible = true) @JsonSubTypes({ @JsonSubTypes.Type(value = SystemFieldPersist.class, name = "0"), @JsonSubTypes.Type(value = ExtraFieldPersist.class, name = "1") From 7508cf8698ce8dfa26c7ea9407da1bda052d5296 Mon Sep 17 00:00:00 2001 From: amentis Date: Fri, 27 Oct 2023 11:41:44 +0300 Subject: [PATCH 18/25] add created, updated in DmpReference --- .../eu/eudat/data/DmpReferenceEntity.java | 26 +++++++++++++++++++ .../java/eu/eudat/model/DmpReference.java | 16 ++++++++++++ .../model/builder/DmpReferenceBuilder.java | 2 ++ .../eu/eudat/query/DmpReferenceQuery.java | 14 +++++++--- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java index aa0f98e06..ded6a3c48 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpReferenceEntity.java @@ -5,6 +5,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.time.Instant; import java.util.UUID; @Entity @@ -26,6 +27,15 @@ public class DmpReferenceEntity { @Column(name = "data") private String data; + + @Column(name = "created_at", nullable = false) + private Instant createdAt; + public static final String _createdAt = "createdAt"; + + @Column(name = "updated_at", nullable = false) + private Instant updatedAt; + public static final String _updatedAt = "updatedAt"; + public static final String _data = "data"; public UUID getId() { @@ -59,4 +69,20 @@ public class DmpReferenceEntity { public void setData(String data) { this.data = data; } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java index 30b4eaeb3..e194011a4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java @@ -1,5 +1,6 @@ package eu.eudat.model; +import java.time.Instant; import java.util.UUID; public class DmpReference { @@ -16,6 +17,13 @@ public class DmpReference { private String data; public static final String _data = "data"; + private Instant createdAt; + + public static final String _createdAt = "createdAt"; + private Instant updatedAt; + + public static final String _updatedAt = "updatedAt"; + public UUID getId() { return id; } @@ -47,4 +55,12 @@ public class DmpReference { public void setData(String data) { this.data = data; } + + public Instant getCreatedAt() { return createdAt;} + + public void setCreatedAt(Instant createdAt) {this.createdAt = createdAt;} + + public Instant getUpdatedAt() {return updatedAt;} + + public void setUpdatedAt(Instant updatedAt) {this.updatedAt = updatedAt;} } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java index 16460d303..35995dabc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java @@ -63,6 +63,8 @@ public class DmpReferenceBuilder extends BaseBuilder { item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._dmpId, UUID.class)); item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._referenceId, UUID.class)); item.setData(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._data, String.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._updatedAt, Instant.class)); return item; } @Override protected String fieldNameOf(FieldResolver item) { - if (item.match(DmpReferenceEntity._id)) return DmpReferenceEntity._id; - else if (item.prefix(DmpReferenceEntity._dmpId)) return DmpReferenceEntity._dmpId; - else if (item.prefix(DmpReferenceEntity._referenceId)) return DmpReferenceEntity._referenceId; - else if (item.match(DmpReferenceEntity._data)) return DmpReferenceEntity._data; + if (item.match(DmpReference._id)) return DmpReferenceEntity._id; + else if (item.prefix(DmpReference._dmp)) return DmpReferenceEntity._dmpId; + else if (item.prefix(DmpReference._reference)) return DmpReferenceEntity._referenceId; + else if (item.match(DmpReference._data)) return DmpReferenceEntity._data; + else if (item.match(DmpReference._createdAt)) return DmpReferenceEntity._createdAt; + else if (item.match(DmpReference._updatedAt)) return DmpReferenceEntity._updatedAt; else return null; } From 60ca51fe006b2429663e4a6b8d53868ceee6b20d Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 27 Oct 2023 11:59:37 +0300 Subject: [PATCH 19/25] Adding DescriptionReference entity stack (former Dataset*** entities) --- .../eu/eudat/authorization/Permission.java | 4 + .../data/DescriptionReferenceEntity.java | 110 +++++++++ .../main/java/eu/eudat/data/DmpEntity.java | 4 - .../eu/eudat/model/DescriptionReference.java | 94 ++++++++ .../model/builder/DescriptionBuilder.java | 2 + .../builder/DescriptionReferenceBuilder.java | 155 ++++++++++++ .../DescriptionReferenceCensor.java | 50 ++++ .../deleter/DescriptionReferenceDeleter.java | 79 +++++++ .../query/DescriptionReferenceQuery.java | 220 ++++++++++++++++++ .../src/main/resources/config/permissions.yml | 21 ++ 10 files changed, 735 insertions(+), 4 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/DescriptionReference.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionReferenceBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionReferenceCensor.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/deleter/DescriptionReferenceDeleter.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/DescriptionReferenceQuery.java 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 e6ba36ad8..94b38623f 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 @@ -72,5 +72,9 @@ public final class Permission { public static String EditDmpReference = "EditDmpReference"; public static String DeleteDmpReference = "DeleteDmpReference"; + public static String BrowseDescriptionReference = "BrowseDescriptionReference"; + public static String EditDescriptionReference = "EditDescriptionReference"; + public static String DeleteDescriptionReference = "DeleteDescriptionReference"; + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java new file mode 100644 index 000000000..b471fdcbe --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java @@ -0,0 +1,110 @@ +package eu.eudat.data; + +import eu.eudat.commons.enums.IsActive; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.converters.enums.IsActiveConverter; +import jakarta.persistence.*; + +import java.time.Instant; +import java.util.UUID; + +//@Entity +//@Table(name = "\"DescriptionReference\"") +public class DescriptionReferenceEntity { + + @Id + @Column(name = "id", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + public static final String _id = "id"; + + @Column(name = "data") + private String data; + + public static final String _data = "data"; + + @Column(name = "description_id", columnDefinition = "uuid", nullable = false) + private UUID descriptionId; + + public static final String _descriptionId = "descriptionId"; + + @Column(name = "reference_id", columnDefinition = "uuid", nullable = false) + private UUID referenceId; + + public static final String _referenceId = "referenceId"; + + @Column(name = "created_at") + @Convert(converter = DateToUTCConverter.class) + private Instant createdAt; + + public static final String _createdAt = "createdAt"; + + @Column(name = "updated_at") + @Convert(converter = DateToUTCConverter.class) + private Instant updatedAt; + + public static final String _updatedAt = "updatedAt"; + + @Column(name = "is_active", nullable = false) + @Convert(converter = IsActiveConverter.class) + private IsActive isActive; + + public static final String _isActive = "isActive"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public UUID getDescriptionId() { + return descriptionId; + } + + public void setDescriptionId(UUID descriptionId) { + this.descriptionId = descriptionId; + } + + public UUID getReferenceId() { + return referenceId; + } + + public void setReferenceId(UUID referenceId) { + this.referenceId = referenceId; + } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } + + public IsActive getIsActive() { + return isActive; + } + + public void setIsActive(IsActive isActive) { + this.isActive = isActive; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java index ffd97ecc4..b67455f62 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java @@ -97,10 +97,6 @@ public class DmpEntity { public static final String _publishedAt = "publishedAt"; - //TODO: (thgiannos) Handle using the DMPEntity builder -// @OneToMany(mappedBy = "dmp", fetch = FetchType.LAZY) -// private Set dataset; - // @ManyToOne(fetch = FetchType.LAZY) // @JoinColumn(name = "\"Grant\"") //TODO: (thgiannos) Previously 'Grant' diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DescriptionReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DescriptionReference.java new file mode 100644 index 000000000..d06304b1b --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DescriptionReference.java @@ -0,0 +1,94 @@ +package eu.eudat.model; + +import eu.eudat.commons.enums.IsActive; + +import java.time.Instant; +import java.util.UUID; + +public class DescriptionReference { + + private UUID id; + + public static final String _id = "id"; + + private String data; + + public static final String _data = "data"; + + private Description description; + + public static final String _description = "description"; + + private Reference reference; + + public static final String _reference = "reference"; + + private Instant createdAt; + + public static final String _createdAt = "createdAt"; + + private Instant updatedAt; + + public static final String _updatedAt = "updatedAt"; + + private IsActive isActive; + + public static final String _isActive = "isActive"; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public Reference getReference() { + return reference; + } + + public void setReference(Reference reference) { + this.reference = reference; + } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } + + 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/DescriptionBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java index 9ef64a834..ec6ef5508 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java @@ -96,7 +96,9 @@ public class DescriptionBuilder extends BaseBuilder { + + private final BuilderFactory builderFactory; + + private final QueryFactory queryFactory; + + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public DescriptionReferenceBuilder( + ConventionService conventionService, + BuilderFactory builderFactory, QueryFactory queryFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(DmpReferenceBuilder.class))); + this.builderFactory = builderFactory; + this.queryFactory = queryFactory; + } + + public DescriptionReferenceBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + + FieldSet referenceFields = fields.extractPrefixed(this.asPrefix(DescriptionReference._reference)); + Map referenceItemsMap = this.collectReferences(referenceFields, data); + + FieldSet descriptionFields = fields.extractPrefixed(this.asPrefix(DescriptionReference._description)); + Map descriptionItemsMap = this.collectDescriptions(descriptionFields, data); + + List models = new ArrayList<>(); + + for (DescriptionReferenceEntity d : data) { + DescriptionReference m = new DescriptionReference(); + if (fields.hasField(this.asIndexer(DescriptionReference._id))) + m.setId(d.getId()); + if (fields.hasField(this.asIndexer(DescriptionReference._data))) + m.setData(d.getData()); + if (fields.hasField(this.asIndexer(DescriptionReference._createdAt))) + m.setCreatedAt(d.getCreatedAt()); + if (fields.hasField(this.asIndexer(DescriptionReference._updatedAt))) + m.setUpdatedAt(d.getUpdatedAt()); + if (fields.hasField(this.asIndexer(DescriptionReference._isActive))) + m.setIsActive(d.getIsActive()); + + if (!referenceFields.isEmpty() && referenceItemsMap != null && referenceItemsMap.containsKey(d.getReferenceId())) { + m.setReference(referenceItemsMap.get(d.getReferenceId())); + } + + if (!descriptionFields.isEmpty() && descriptionItemsMap != null && descriptionItemsMap.containsKey(d.getDescriptionId())) { + m.setDescription(descriptionItemsMap.get(d.getDescriptionId())); + } + + models.add(m); + } + + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + + return models; + } + + private Map collectDescriptions(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) + return null; + this.logger.debug("checking related - {}", Description.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(Reference._id))) { + itemMap = this.asEmpty( + data.stream().map(DescriptionReferenceEntity::getDescriptionId).distinct().collect(Collectors.toList()), + x -> { + Description item = new Description(); + item.setId(x); + return item; + }, + Description::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(Reference._id); + DescriptionQuery q = this.queryFactory.query(DescriptionQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionReferenceEntity::getDescriptionId).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DescriptionBuilder.class).authorize(this.authorize).asForeignKey(q, clone, Description::getId); + } + if (!fields.hasField(Description._id)) { + itemMap.forEach((id, item) -> { + if (item != null) + item.setId(null); + }); + } + + return itemMap; + } + + private Map collectReferences(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) + return null; + this.logger.debug("checking related - {}", Reference.class.getSimpleName()); + + Map itemMap; + if (!fields.hasOtherField(this.asIndexer(Reference._id))) { + itemMap = this.asEmpty( + data.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().collect(Collectors.toList()), + x -> { + Reference item = new Reference(); + item.setId(x); + return item; + }, + Reference::getId); + } else { + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(Reference._id); + ReferenceQuery q = this.queryFactory.query(ReferenceQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(ReferenceBuilder.class).authorize(this.authorize).asForeignKey(q, clone, Reference::getId); + } + if (!fields.hasField(Reference._id)) { + itemMap.forEach((id, item) -> { + if (item != null) + item.setId(null); + }); + } + + return itemMap; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionReferenceCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionReferenceCensor.java new file mode 100644 index 000000000..eabf97fe6 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/DescriptionReferenceCensor.java @@ -0,0 +1,50 @@ +package eu.eudat.model.censorship; + +import eu.eudat.authorization.Permission; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.DescriptionReference; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.censor.CensorFactory; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DescriptionReferenceCensor extends BaseCensor { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionReferenceCensor.class)); + + protected final AuthorizationService authService; + + protected final CensorFactory censorFactory; + + @Autowired + public DescriptionReferenceCensor(ConventionService conventionService, + AuthorizationService authService, + CensorFactory censorFactory) { + super(conventionService); + this.authService = authService; + this.censorFactory = censorFactory; + } + + public void censor(FieldSet fields, UUID userId) { + logger.debug(new DataLogEntry("censoring fields", fields)); + if (fields == null || fields.isEmpty()) + return; + + this.authService.authorizeForce(Permission.BrowseDescriptionReference); + FieldSet descriptionFields = fields.extractPrefixed(this.asIndexerPrefix(DescriptionReference._description)); + this.censorFactory.censor(DescriptionCensor.class).censor(descriptionFields, userId); + FieldSet referenceFields = fields.extractPrefixed(this.asIndexerPrefix(DescriptionReference._reference)); + this.censorFactory.censor(ReferenceCensor.class).censor(referenceFields, userId); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DescriptionReferenceDeleter.java b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DescriptionReferenceDeleter.java new file mode 100644 index 000000000..50752b336 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/deleter/DescriptionReferenceDeleter.java @@ -0,0 +1,79 @@ +package eu.eudat.model.deleter; + +import eu.eudat.commons.enums.IsActive; +import eu.eudat.data.DescriptionReferenceEntity; +import eu.eudat.query.DescriptionReferenceQuery; +import gr.cite.tools.data.deleter.Deleter; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +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.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.management.InvalidApplicationException; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DescriptionReferenceDeleter implements Deleter { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionReferenceDeleter.class)); + + private final EntityManager entityManager; + + protected final QueryFactory queryFactory; + + protected final DeleterFactory deleterFactory; + + @Autowired + public DescriptionReferenceDeleter( + EntityManager entityManager, + QueryFactory queryFactory, + DeleterFactory deleterFactory + ) { + this.entityManager = entityManager; + this.queryFactory = queryFactory; + this.deleterFactory = deleterFactory; + } + + public void deleteAndSaveByIds(List ids) throws InvalidApplicationException { + logger.debug(new MapLogEntry("collecting to delete").And("count", Optional.ofNullable(ids).map(List::size).orElse(0)).And("ids", ids)); + List data = this.queryFactory.query(DescriptionReferenceQuery.class).ids(ids).collect(); + logger.trace("retrieved {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.deleteAndSave(data); + } + + public void deleteAndSave(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + this.delete(data); + logger.trace("saving changes"); + this.entityManager.flush(); + logger.trace("changes saved"); + } + + public void delete(List data) throws InvalidApplicationException { + logger.debug("will delete {} items", Optional.ofNullable(data).map(List::size).orElse(0)); + if (data == null || data.isEmpty()) + return; + + Instant now = Instant.now(); + + for (DescriptionReferenceEntity item : data) { + logger.trace("deleting item {}", item.getId()); + item.setIsActive(IsActive.Inactive); + item.setUpdatedAt(now); + logger.trace("updating item"); + this.entityManager.merge(item); + logger.trace("updated item"); + } + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/DescriptionReferenceQuery.java b/dmp-backend/core/src/main/java/eu/eudat/query/DescriptionReferenceQuery.java new file mode 100644 index 000000000..83d64142f --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/DescriptionReferenceQuery.java @@ -0,0 +1,220 @@ +package eu.eudat.query; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.data.DescriptionReferenceEntity; +import eu.eudat.model.DescriptionReference; +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; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DescriptionReferenceQuery extends QueryBase { + + private Collection ids; + + private Collection excludedIds; + + private Collection isActives; + + private Collection descriptionIds; + + private Collection referenceIds; + + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + private final UserScope userScope; + + private final AuthorizationService authService; + + public DescriptionReferenceQuery(UserScope userScope, AuthorizationService authService) { + this.userScope = userScope; + this.authService = authService; + } + + public DescriptionReferenceQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } + + public DescriptionReferenceQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } + + public DescriptionReferenceQuery ids(Collection values) { + this.ids = values; + return this; + } + + public DescriptionReferenceQuery excludedIds(Collection values) { + this.excludedIds = values; + return this; + } + + public DescriptionReferenceQuery excludedIds(UUID value) { + this.excludedIds = List.of(value); + return this; + } + + public DescriptionReferenceQuery excludedIds(UUID... value) { + this.excludedIds = Arrays.asList(value); + return this; + } + + public DescriptionReferenceQuery isActive(IsActive value) { + this.isActives = List.of(value); + return this; + } + + public DescriptionReferenceQuery isActive(IsActive... value) { + this.isActives = Arrays.asList(value); + return this; + } + + public DescriptionReferenceQuery isActive(Collection values) { + this.isActives = values; + return this; + } + + public DescriptionReferenceQuery descriptionIds(UUID value) { + this.descriptionIds = List.of(value); + return this; + } + + public DescriptionReferenceQuery descriptionIds(UUID... value) { + this.descriptionIds = Arrays.asList(value); + return this; + } + + public DescriptionReferenceQuery descriptionIds(Collection values) { + this.descriptionIds = values; + return this; + } + + public DescriptionReferenceQuery referenceIds(UUID value) { + this.referenceIds = List.of(value); + return this; + } + + public DescriptionReferenceQuery referenceIds(UUID... value) { + this.referenceIds = Arrays.asList(value); + return this; + } + + public DescriptionReferenceQuery referenceIds(Collection values) { + this.referenceIds = values; + return this; + } + + public DescriptionReferenceQuery authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + protected Boolean isFalseQuery() { + return + this.isEmpty(this.ids) || + this.isEmpty(this.isActives) || + this.isEmpty(this.excludedIds) || + this.isEmpty(this.descriptionIds) || + this.isEmpty(this.referenceIds); + } + + @Override + protected Class entityClass() { + return DescriptionReferenceEntity.class; + } + + @Override + protected Predicate applyFilters(QueryContext queryContext) { + List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DescriptionReferenceEntity._id)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.excludedIds != null) { + CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DescriptionReferenceEntity._id)); + for (UUID item : this.excludedIds) + notInClause.value(item); + predicates.add(notInClause.not()); + } + if (this.isActives != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DescriptionReferenceEntity._isActive)); + for (IsActive item : this.isActives) + inClause.value(item); + predicates.add(inClause); + } + if (this.descriptionIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DescriptionReferenceEntity._descriptionId)); + for (UUID item : this.descriptionIds) + inClause.value(item); + predicates.add(inClause); + } + if (this.referenceIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(DescriptionReferenceEntity._referenceId)); + for (UUID item : this.referenceIds) + 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) { + if (item.match(DescriptionReference._id)) + return DescriptionReferenceEntity._id; + if (item.match(DescriptionReference._data)) + return DescriptionReferenceEntity._data; + if (item.match(DescriptionReference._description)) + return DescriptionReferenceEntity._descriptionId; + else if (item.prefix(DescriptionReference._description)) + return DescriptionReferenceEntity._descriptionId; + else if (item.match(DescriptionReference._reference)) + return DescriptionReferenceEntity._referenceId; + else if (item.prefix(DescriptionReference._reference)) + return DescriptionReferenceEntity._referenceId; + else if (item.match(DescriptionReference._createdAt)) + return DescriptionReferenceEntity._createdAt; + else if (item.match(DescriptionReference._updatedAt)) + return DescriptionReferenceEntity._updatedAt; + else if (item.match(DescriptionReference._isActive)) + return DescriptionReferenceEntity._isActive; + else + return null; + } + + @Override + protected DescriptionReferenceEntity convert(Tuple tuple, Set columns) { + DescriptionReferenceEntity item = new DescriptionReferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._id, UUID.class)); + item.setData(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._data, String.class)); + item.setDescriptionId(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._descriptionId, UUID.class)); + item.setReferenceId(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._referenceId, UUID.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._updatedAt, Instant.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, DescriptionReferenceEntity._isActive, IsActive.class)); + return item; + } + +} diff --git a/dmp-backend/web/src/main/resources/config/permissions.yml b/dmp-backend/web/src/main/resources/config/permissions.yml index 52fa74adc..a1ed7f18b 100644 --- a/dmp-backend/web/src/main/resources/config/permissions.yml +++ b/dmp-backend/web/src/main/resources/config/permissions.yml @@ -237,3 +237,24 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + + # DescriptionReference Permissions + BrowseDescriptionReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + EditDescriptionReference: + roles: + - Admin + clients: [ ] + allowAnonymous: false + allowAuthenticated: false + DeleteDescriptionReference: + roles: + - Admin + claims: [ ] + clients: [ ] + allowAnonymous: false + allowAuthenticated: false From 8d1c9881357d80b7fe706542783bb01ddab68846 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 27 Oct 2023 13:48:17 +0300 Subject: [PATCH 20/25] Adding DescriptionReference lookup and linking on description entity builder --- .../main/java/eu/eudat/model/Description.java | 14 ++++ .../model/builder/DescriptionBuilder.java | 29 +++++++ .../eu/eudat/model/builder/DmpBuilder.java | 13 ++-- .../lookup/DescriptionReferenceLookup.java | 76 +++++++++++++++++++ 4 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/query/lookup/DescriptionReferenceLookup.java diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Description.java b/dmp-backend/core/src/main/java/eu/eudat/model/Description.java index bf4e68d76..68a3970b4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Description.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Description.java @@ -4,6 +4,7 @@ import eu.eudat.commons.enums.DescriptionStatus; import eu.eudat.commons.enums.IsActive; import java.time.Instant; +import java.util.List; import java.util.UUID; public class Description { @@ -72,6 +73,10 @@ public class Description { public static final String _hash = "hash"; + private List descriptionReferences; + + public static final String _descriptionReferences = "descriptionReferences"; + public UUID getId() { return id; } @@ -199,4 +204,13 @@ public class Description { public void setHash(String hash) { this.hash = hash; } + + public List getDescriptionReferences() { + return descriptionReferences; + } + + public void setDescriptionReferences(List descriptionReferences) { + this.descriptionReferences = descriptionReferences; + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java index ec6ef5508..add5e0c10 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DescriptionBuilder.java @@ -3,9 +3,14 @@ package eu.eudat.model.builder; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.convention.ConventionService; import eu.eudat.data.DescriptionEntity; +import eu.eudat.data.DmpEntity; import eu.eudat.model.Description; +import eu.eudat.model.DescriptionReference; import eu.eudat.model.Dmp; +import eu.eudat.model.DmpReference; +import eu.eudat.query.DescriptionReferenceQuery; import eu.eudat.query.DmpQuery; +import eu.eudat.query.DmpReferenceQuery; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyApplicationException; @@ -57,6 +62,9 @@ public class DescriptionBuilder extends BaseBuilder dmpItemsMap = this.collectDmps(dmpFields, data); + FieldSet descriptionReferencesFields = fields.extractPrefixed(this.asPrefix(Description._descriptionReferences)); + Map> descriptionReferencesMap = this.collectDescriptionReferences(descriptionReferencesFields, data); + List models = new ArrayList<>(); for (DescriptionEntity d : data) { Description m = new Description(); @@ -94,6 +102,9 @@ public class DescriptionBuilder extends BaseBuilder> collectDescriptionReferences(FieldSet fields, List data) throws MyApplicationException { + if (fields.isEmpty() || data.isEmpty()) return null; + this.logger.debug("checking related - {}", DescriptionReference.class.getSimpleName()); + + Map> itemMap; + FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DescriptionReference._description, Description._id)); + DescriptionReferenceQuery query = this.queryFactory.query(DescriptionReferenceQuery.class).authorize(this.authorize).descriptionIds(data.stream().map(DescriptionEntity::getId).distinct().collect(Collectors.toList())); + itemMap = this.builderFactory.builder(DescriptionReferenceBuilder.class).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDescription().getId()); + + if (!fields.hasField(this.asIndexer(DmpReference._dmp, Dmp._id))) { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDescription() != null).peek(x -> { + x.getDescription().setId(null); + }); + } + + return itemMap; + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java index e1e6b4725..191d9aa89 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpBuilder.java @@ -98,10 +98,13 @@ public class DmpBuilder extends BaseBuilder { if (!dmpDescriptionsFields.isEmpty() && dmpDescriptionsMap != null && dmpDescriptionsMap.containsKey(d.getId())) m.setDmpDescriptions(dmpDescriptionsMap.get(d.getId())); - if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) m.setDmpReferences(dmpReferenceMap.get(d.getId())); + if (dmpReferenceMap != null && !dmpReferenceMap.isEmpty() && dmpReferenceMap.containsKey(d.getId())) + m.setDmpReferences(dmpReferenceMap.get(d.getId())); + models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; } @@ -132,15 +135,15 @@ public class DmpBuilder extends BaseBuilder { Map> itemMap = null; FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(this.asIndexer(DmpReference._dmp, Dmp._id)); - DmpReferenceQuery query = this.queryFactory.query(DmpReferenceQuery.class).authorize(this.authorize).dmpIds(datas.stream().map(x -> x.getId()).distinct().collect(Collectors.toList())); + DmpReferenceQuery query = this.queryFactory.query(DmpReferenceQuery.class).authorize(this.authorize).dmpIds(datas.stream().map(DmpEntity::getId).distinct().collect(Collectors.toList())); itemMap = this.builderFactory.builder(DmpReferenceBuilder.class).authorize(this.authorize).authorize(this.authorize).asMasterKey(query, clone, x -> x.getDmp().getId()); if (!fields.hasField(this.asIndexer(DmpReference._dmp, Dmp._id))) { - itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDmp() != null).map(x -> { + itemMap.values().stream().flatMap(List::stream).filter(x -> x != null && x.getDmp() != null).peek(x -> { x.getDmp().setId(null); - return x; - }).collect(Collectors.toList()); + }); } + return itemMap; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DescriptionReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DescriptionReferenceLookup.java new file mode 100644 index 000000000..d79778498 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DescriptionReferenceLookup.java @@ -0,0 +1,76 @@ +package eu.eudat.query.lookup; + +import eu.eudat.commons.enums.IsActive; +import eu.eudat.query.DescriptionReferenceQuery; +import gr.cite.tools.data.query.Lookup; +import gr.cite.tools.data.query.QueryFactory; + +import java.util.Collection; +import java.util.UUID; + +public class DescriptionReferenceLookup extends Lookup { + + private Collection ids; + + private Collection excludedIds; + + private Collection isActives; + + private Collection descriptionIds; + + private Collection referenceIds; + + public Collection getIds() { + return ids; + } + + public void setIds(Collection ids) { + this.ids = ids; + } + + public Collection getExcludedIds() { + return excludedIds; + } + + public void setExcludedIds(Collection excludedIds) { + this.excludedIds = excludedIds; + } + + public Collection getIsActives() { + return isActives; + } + + public void setIsActives(Collection isActives) { + this.isActives = isActives; + } + + public Collection getDescriptionIds() { + return descriptionIds; + } + + public void setDescriptionIds(Collection descriptionIds) { + this.descriptionIds = descriptionIds; + } + + public Collection getReferenceIds() { + return referenceIds; + } + + public void setReferenceIds(Collection referenceIds) { + this.referenceIds = referenceIds; + } + + public DescriptionReferenceQuery enrich(QueryFactory queryFactory) { + DescriptionReferenceQuery query = queryFactory.query(DescriptionReferenceQuery.class); + if (this.ids != null) query.ids(this.ids); + if (this.excludedIds != null) query.excludedIds(this.excludedIds); + if (this.isActives != null) query.isActive(this.isActives); + if (this.descriptionIds != null) query.descriptionIds(this.descriptionIds); + if (this.referenceIds != null) query.referenceIds(this.referenceIds); + + this.enrichCommon(query); + + return query; + } + +} From e31970c7eaaaa6053ff9582daa810a620ceef650 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 27 Oct 2023 17:05:48 +0300 Subject: [PATCH 21/25] Adding migration scripts for Dmp, DmpReference, Description and DescriptionReference entities, other fixes / clear up dmp entity --- .../java/eu/eudat/data/DescriptionEntity.java | 8 +- .../data/DescriptionReferenceEntity.java | 4 +- .../main/java/eu/eudat/data/DmpEntity.java | 85 ++----------------- .../src/main/java/eu/eudat/model/Dmp.java | 36 -------- ...> 00.01.004_Align_Dmp_blueprint_table.sql} | 12 ++- .../updates/00.01.005_Add_Dmp_table.sql | 29 +++++++ .../00.01.006_Add_Dmp_reference_table.sql | 23 +++++ ...7_Add_Description_table_former_Dataset.sql | 30 +++++++ ....01.008_Add_DescriptionReference_table.sql | 23 +++++ 9 files changed, 126 insertions(+), 124 deletions(-) rename dmp-db-scema/updates/{00.01.003_Align_Dmp_blueprint_table.sql => 00.01.004_Align_Dmp_blueprint_table.sql} (75%) create mode 100644 dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql create mode 100644 dmp-db-scema/updates/00.01.006_Add_Dmp_reference_table.sql create mode 100644 dmp-db-scema/updates/00.01.007_Add_Description_table_former_Dataset.sql create mode 100644 dmp-db-scema/updates/00.01.008_Add_DescriptionReference_table.sql diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionEntity.java index 8147de2de..02ed4fc09 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionEntity.java @@ -5,15 +5,13 @@ import eu.eudat.commons.enums.IsActive; import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.data.converters.enums.DescriptionStatusConverter; import eu.eudat.data.converters.enums.IsActiveConverter; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Id; +import jakarta.persistence.*; import java.time.Instant; import java.util.UUID; -//@Entity -//@Table(name = "\"Description\"") +@Entity +@Table(name = "\"Description\"") public class DescriptionEntity { @Id diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java index b471fdcbe..0d8fafa31 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DescriptionReferenceEntity.java @@ -8,8 +8,8 @@ import jakarta.persistence.*; import java.time.Instant; import java.util.UUID; -//@Entity -//@Table(name = "\"DescriptionReference\"") +@Entity +@Table(name = "\"DescriptionReference\"") public class DescriptionReferenceEntity { @Id diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java b/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java index b67455f62..eff9dd0ae 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/data/DmpEntity.java @@ -10,9 +10,8 @@ import org.hibernate.annotations.GenericGenerator; import java.time.Instant; import java.util.UUID; -//TODO: (thgiannos) Wire up when all other dependent entities are refactored -//@Entity -//@Table(name = "\"DMP\"") +@Entity +@Table(name = "\"Dmp\"") public class DmpEntity { @Id @@ -85,73 +84,23 @@ public class DmpEntity { public static final String _isActive = "isActive"; - @Column(name = "\"finalized_at\"") + @Column(name = "finalized_at") @Convert(converter = DateToUTCConverter.class) private Instant finalizedAt; public static final String _finalizedAt = "finalizedAt"; - @Column(name = "\"published_at\"") + @Column(name = "published_at") @Convert(converter = DateToUTCConverter.class) private Instant publishedAt; public static final String _publishedAt = "publishedAt"; - // @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "\"Grant\"") - //TODO: (thgiannos) Previously 'Grant' - private UUID grant; - - public static final String _grant = "grant"; - - //TODO: (thgiannos) Handle using the DMPEntity builder -// @OneToMany(fetch = FetchType.LAZY, mappedBy = "dmp") -// private Set associatedDmps; - - // @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "\"Profile\"") - //TODO: (thgiannos) Previously 'DMPProfile' - private UUID profile; - - public static final String _profile = "profile"; - - // @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "\"Creator\"") - //TODO: (thgiannos) Previously 'UserInfo' + @Column(name = "creator") private UUID creator; public static final String _creator = "creator"; - //TODO: (thgiannos) Handle using the DMPEntity builder -// @OneToMany(mappedBy = "entityId", fetch = FetchType.LAZY) -// private Set dois; - - // @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "\"Project\"") - //TODO: (thgiannos) Previously 'Project' - private UUID project; - - public static final String _project = "project"; - - // TODO: (thgiannos) Implement join entity -// @OneToMany(fetch = FetchType.LAZY) -// @JoinTable(name = "\"DMPOrganisation\"", -// joinColumns = {@JoinColumn(name = "\"DMP\"", referencedColumnName = "\"ID\"")}, -// inverseJoinColumns = {@JoinColumn(name = "\"Organisation\"", referencedColumnName = "\"ID\"")} -// ) -// private Set organisations; - - // TODO: (thgiannos) Implement join entity -// @OneToMany(fetch = FetchType.LAZY) -// @JoinTable(name = "\"DMPResearcher\"", -// joinColumns = {@JoinColumn(name = "\"DMP\"", referencedColumnName = "\"ID\"")}, -// inverseJoinColumns = {@JoinColumn(name = "\"Researcher\"", referencedColumnName = "\"ID\"")} -// ) -// private Set researchers; - - //TODO: (thgiannos) Handle using the DMPEntity builder -// private Set users; - public UUID getId() { return id; } @@ -272,22 +221,6 @@ public class DmpEntity { this.publishedAt = publishedAt; } - public UUID getGrant() { - return grant; - } - - public void setGrant(UUID grant) { - this.grant = grant; - } - - public UUID getProfile() { - return profile; - } - - public void setProfile(UUID profile) { - this.profile = profile; - } - public UUID getCreator() { return creator; } @@ -296,12 +229,4 @@ public class DmpEntity { this.creator = creator; } - public UUID getProject() { - return project; - } - - public void setProject(UUID project) { - this.project = project; - } - } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java index c95d19e32..7ad6d86d6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Dmp.java @@ -69,22 +69,10 @@ public class Dmp { public static final String _publishedAt = "publishedAt"; - private UUID grant; - - public static final String _grant = "grant"; - - private UUID profile; - - public static final String _profile = "profile"; - private UUID creator; public static final String _creator = "creator"; - private UUID project; - - public static final String _project = "project"; - private String hash; public static final String _hash = "hash"; @@ -216,22 +204,6 @@ public class Dmp { this.publishedAt = publishedAt; } - public UUID getGrant() { - return grant; - } - - public void setGrant(UUID grant) { - this.grant = grant; - } - - public UUID getProfile() { - return profile; - } - - public void setProfile(UUID profile) { - this.profile = profile; - } - public UUID getCreator() { return creator; } @@ -240,14 +212,6 @@ public class Dmp { this.creator = creator; } - public UUID getProject() { - return project; - } - - public void setProject(UUID project) { - this.project = project; - } - public String getHash() { return hash; } diff --git a/dmp-db-scema/updates/00.01.003_Align_Dmp_blueprint_table.sql b/dmp-db-scema/updates/00.01.004_Align_Dmp_blueprint_table.sql similarity index 75% rename from dmp-db-scema/updates/00.01.003_Align_Dmp_blueprint_table.sql rename to dmp-db-scema/updates/00.01.004_Align_Dmp_blueprint_table.sql index bf66b6146..c8167bf12 100644 --- a/dmp-db-scema/updates/00.01.003_Align_Dmp_blueprint_table.sql +++ b/dmp-db-scema/updates/00.01.004_Align_Dmp_blueprint_table.sql @@ -1,3 +1,9 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.004'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + ALTER TABLE public."DMPProfile" RENAME TO "DmpBlueprint"; ALTER TABLE public."DmpBlueprint" RENAME "ID" TO id; @@ -23,4 +29,8 @@ UPDATE public."DmpBlueprint" SET is_active = 1; UPDATE public."DmpBlueprint" SET is_active = 0 where status = 99; UPDATE public."DmpBlueprint" SET status = 0 where is_active = 0; -ALTER TABLE public."DmpBlueprint" ALTER COLUMN is_active SET NOT NULL; \ No newline at end of file +ALTER TABLE public."DmpBlueprint" ALTER COLUMN is_active SET NOT NULL; + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.004', '2023-10-27 12:00:00.000000+02', now(), 'Align dmp blueprint table.'); + +END$$; \ No newline at end of file diff --git a/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql b/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql new file mode 100644 index 000000000..02de486e5 --- /dev/null +++ b/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql @@ -0,0 +1,29 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.005'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +CREATE TABLE IF NOT EXISTS public."Dmp" +( + "id" uuid NOT NULL, + "label" character varying(250) COLLATE pg_catalog."default" NOT NULL, + "version" integer NOT NULL, + "status" smallint NOT NULL DEFAULT 0, + "properties" text COLLATE pg_catalog."default", + "dmp_properties" text COLLATE pg_catalog."default", + "group_id" uuid, + "description" text COLLATE pg_catalog."default", + "is_public" boolean NOT NULL DEFAULT false, + "extra_properties" text COLLATE pg_catalog."default", + "created_at" timestamp without time zone NOT NULL DEFAULT now(), + "updated_at" timestamp without time zone NOT NULL DEFAULT now(), + "is_active" smallint NOT NULL DEFAULT 1, + "finalized_at" timestamp without time zone, + "published_at" timestamp without time zone, + CONSTRAINT "Dmp_pkey" PRIMARY KEY (id) +) + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.005', '2023-10-27 12:00:00.000000+02', now(), 'Add Dmp table.'); + +END$$; \ No newline at end of file diff --git a/dmp-db-scema/updates/00.01.006_Add_Dmp_reference_table.sql b/dmp-db-scema/updates/00.01.006_Add_Dmp_reference_table.sql new file mode 100644 index 000000000..81b9dd635 --- /dev/null +++ b/dmp-db-scema/updates/00.01.006_Add_Dmp_reference_table.sql @@ -0,0 +1,23 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.006'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +CREATE TABLE IF NOT EXISTS public."DmpReference" +( + "id" uuid NOT NULL, + "dmp_id" uuid NOT NULL, + "reference_id" uuid NOT NULL, + "data" text COLLATE pg_catalog."default", + "created_at" timestamp without time zone NOT NULL DEFAULT now(), + "updated_at" timestamp without time zone NOT NULL DEFAULT now(), + "is_active" smallint NOT NULL DEFAULT 1, + CONSTRAINT "DmpReference_pkey" PRIMARY KEY (id), + CONSTRAINT "DmpReference_dmp_id_fkey" FOREIGN KEY ("dmp_id") REFERENCES public."Dmp"("id"), + CONSTRAINT "DmpReference_reference_id_fkey" FOREIGN KEY ("reference_id") REFERENCES public."Reference"("id") +) + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.006', '2023-10-27 12:00:00.000000+02', now(), 'Add DescriptionReference table.'); + +END$$; \ No newline at end of file diff --git a/dmp-db-scema/updates/00.01.007_Add_Description_table_former_Dataset.sql b/dmp-db-scema/updates/00.01.007_Add_Description_table_former_Dataset.sql new file mode 100644 index 000000000..efd2ef90d --- /dev/null +++ b/dmp-db-scema/updates/00.01.007_Add_Description_table_former_Dataset.sql @@ -0,0 +1,30 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.007'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +CREATE TABLE IF NOT EXISTS public."Description" +( + "id" uuid NOT NULL, + "label" character varying(250) COLLATE pg_catalog."default" NOT NULL, + "dmp" uuid, + "uri" character varying(250) COLLATE pg_catalog."default", + "properties" text COLLATE pg_catalog."default", + "profile" uuid, + "reference" text COLLATE pg_catalog."default", + "status" smallint NOT NULL DEFAULT 0, + "description" text COLLATE pg_catalog."default", + "dmp_section_index" integer NOT NULL, + "created_at" timestamp without time zone NOT NULL DEFAULT now(), + "updated_at" timestamp without time zone NOT NULL DEFAULT now(), + "is_active" smallint NOT NULL DEFAULT 1, + "finalized_at" timestamp without time zone, + CONSTRAINT "Description_pkey" PRIMARY KEY (id), + CONSTRAINT "Description_dmp_fkey" FOREIGN KEY ("dmp") REFERENCES public."Dmp"("id"), + CONSTRAINT "Description_profile_fkey" FOREIGN KEY ("profile") REFERENCES public."DescriptionTemplate"("ID") +) + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.007', '2023-10-27 12:00:00.000000+02', now(), 'Add Description table (former Dataset).'); + +END$$; \ No newline at end of file diff --git a/dmp-db-scema/updates/00.01.008_Add_DescriptionReference_table.sql b/dmp-db-scema/updates/00.01.008_Add_DescriptionReference_table.sql new file mode 100644 index 000000000..e9c9aaa5d --- /dev/null +++ b/dmp-db-scema/updates/00.01.008_Add_DescriptionReference_table.sql @@ -0,0 +1,23 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.008'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +CREATE TABLE IF NOT EXISTS public."DescriptionReference" +( + "id" uuid NOT NULL, + "data" text COLLATE pg_catalog."default" NOT NULL, + "description_id" uuid NOT NULL, + "reference_id" uuid NOT NULL, + "created_at" timestamp without time zone NOT NULL DEFAULT now(), + "updated_at" timestamp without time zone NOT NULL DEFAULT now(), + "is_active" smallint NOT NULL DEFAULT 1, + CONSTRAINT "DescriptionReference_pkey" PRIMARY KEY (id), + CONSTRAINT "DescriptionReference_description_fkey" FOREIGN KEY ("description_id") REFERENCES public."Description"("id"), + CONSTRAINT "DescriptionReference_reference_fkey" FOREIGN KEY ("reference_id") REFERENCES public."Reference"("id") +) + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.008', '2023-10-27 12:00:00.000000+02', now(), 'Add DescriptionReference table.'); + +END$$; \ No newline at end of file From 5d882c7e886d2f8617bc0cc9f4b13624820bdb47 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 27 Oct 2023 17:29:22 +0300 Subject: [PATCH 22/25] Drop old unused dataset related tables, small fix to migration script --- dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql | 3 ++- .../00.01.009_Drop_old_dataset_related_tables.sql | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 dmp-db-scema/updates/00.01.009_Drop_old_dataset_related_tables.sql diff --git a/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql b/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql index 02de486e5..d8c16638c 100644 --- a/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql +++ b/dmp-db-scema/updates/00.01.005_Add_Dmp_table.sql @@ -21,7 +21,8 @@ CREATE TABLE IF NOT EXISTS public."Dmp" "is_active" smallint NOT NULL DEFAULT 1, "finalized_at" timestamp without time zone, "published_at" timestamp without time zone, - CONSTRAINT "Dmp_pkey" PRIMARY KEY (id) + CONSTRAINT "Dmp_pkey" PRIMARY KEY (id), + CONSTRAINT "Dmp_creator_fkey" FOREIGN KEY (creator) REFERENCES public."UserInfo" (id) ) INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.005', '2023-10-27 12:00:00.000000+02', now(), 'Add Dmp table.'); diff --git a/dmp-db-scema/updates/00.01.009_Drop_old_dataset_related_tables.sql b/dmp-db-scema/updates/00.01.009_Drop_old_dataset_related_tables.sql new file mode 100644 index 000000000..7c210623c --- /dev/null +++ b/dmp-db-scema/updates/00.01.009_Drop_old_dataset_related_tables.sql @@ -0,0 +1,13 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.01.009'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +DROP TABLE public."DatasetProfileViewstyle"; + +DROP TABLE public."DatasetProfileRuleset"; + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.01.009', '2023-10-27 12:00:00.000000+02', now(), 'Drop old dataset related tables.'); + +END$$; \ No newline at end of file From 65e8635c2f3d1de9d7f7d496ba7f17c574d32423 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 27 Oct 2023 17:32:07 +0300 Subject: [PATCH 23/25] Removing unused dataset entity classes --- .../eudat/data/old/DatasetProfileRuleset.java | 57 ------------------- .../data/old/DatasetProfileViewstyle.java | 57 ------------------- 2 files changed, 114 deletions(-) delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileRuleset.java delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileViewstyle.java diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileRuleset.java b/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileRuleset.java deleted file mode 100644 index e8ca1303d..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileRuleset.java +++ /dev/null @@ -1,57 +0,0 @@ -package eu.eudat.data.old; - - -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; - -import jakarta.persistence.*; -import java.io.Serializable; -import java.util.UUID; - - -@Entity -@Table(name = "\"DatasetProfileRuleset\"") -public class DatasetProfileRuleset { - - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; - - - @Column(name = "\"Label\"") - private String label; - - @Type(eu.eudat.configurations.typedefinition.XMLType.class) - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = false) - private String definition; - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDefinition() { -// return XML.toJSONObject(definition).toString(); //return definition as json - return definition; - } - - public void setDefinition(String definition) { -// this.definition = XML.toString(definition); //if definition is in json - this.definition = definition; - } - - -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileViewstyle.java b/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileViewstyle.java deleted file mode 100644 index 09df97405..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/data/old/DatasetProfileViewstyle.java +++ /dev/null @@ -1,57 +0,0 @@ -package eu.eudat.data.old; - - -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; - -import jakarta.persistence.*; -import java.util.UUID; - - -@Entity -@Table(name = "\"DatasetProfileViewstyle\"") -public class DatasetProfileViewstyle { - - - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; - - - @Column(name = "\"Label\"") - private String label; - - @Type(eu.eudat.configurations.typedefinition.XMLType.class) - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = false) - private String definition; - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getDefinition() { -// return XML.toJSONObject(definition).toString(); //return definition as json - return definition; - } - - public void setDefinition(String definition) { -// this.definition = XML.toString(definition); //if definition is in json - this.definition = definition; - } - - -} From 92c165e90441b1625944d1edc1b43415a05efbde Mon Sep 17 00:00:00 2001 From: amentis Date: Fri, 27 Oct 2023 17:35:35 +0300 Subject: [PATCH 24/25] add references definition xml,builder, persist --- .../java/eu/eudat/audit/AuditableAction.java | 8 +- .../commons/enums/ReferenceFieldDataType.java | 27 +++ .../types/reference/DefinitionEntity.java | 22 +++ .../commons/types/reference/FieldEntity.java | 47 +++++ .../ReferenceTypeConfiguration.java | 17 ++ .../referencetype/ReferenceTypeField.java | 24 +++ .../ReferenceTypeProperties.java | 163 ++++++++++++++++++ .../main/java/eu/eudat/model/Reference.java | 7 +- .../eudat/model/builder/ReferenceBuilder.java | 15 +- .../DefinitionBuilder.java | 59 +++++++ .../referencedefinition/FieldBuilder.java | 59 +++++++ .../eudat/model/persist/ReferencePersist.java | 123 +++++++++++++ .../DefinitionPersist.java | 21 +++ .../referencedefinition/FieldPersist.java | 47 +++++ .../model/referencedefinition/Definition.java | 17 ++ .../model/referencedefinition/Field.java | 39 +++++ .../data/dao/criteria/ReferenceCriteria.java | 17 ++ .../controllers/v2/ReferenceController.java | 51 +++--- .../services/references/ReferenceService.java | 120 ++++++++++--- .../src/main/resources/config/application.yml | 3 +- .../main/resources/config/reference-type.yml | 65 +++++++ .../common/enum/reference-field-data-type.ts | 4 + .../src/app/core/model/reference/reference.ts | 41 ++++- 23 files changed, 935 insertions(+), 61 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceFieldDataType.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/DefinitionEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/FieldEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeConfiguration.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeField.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/DefinitionBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/FieldBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/DefinitionPersist.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Definition.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Field.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ReferenceCriteria.java create mode 100644 dmp-backend/web/src/main/resources/config/reference-type.yml create mode 100644 dmp-frontend/src/app/core/common/enum/reference-field-data-type.ts 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 1c30efefa..fccfe1ef2 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 @@ -36,9 +36,9 @@ public class AuditableAction { public static final EventId Description_Persist = new EventId(6002, "Description_Persist"); public static final EventId Description_Delete = new EventId(6003, "Description_Delete"); - public static final EventId External_Reference_Query = new EventId(7000, "External_Reference_Query"); - public static final EventId External_Reference_Lookup = new EventId(7001, "External_Reference_Lookup"); - public static final EventId External_Reference_Persist = new EventId(7002, "External_Reference_Persist"); - public static final EventId External_Reference_Delete = new EventId(7003, "External_Reference_Delete"); + public static final EventId Reference_Query = new EventId(7000, "Reference_Query"); + public static final EventId Reference_Lookup = new EventId(7001, "Reference_Lookup"); + public static final EventId Reference_Persist = new EventId(7002, "Reference_Persist"); + public static final EventId Reference_Delete = new EventId(7003, "Reference_Delete"); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceFieldDataType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceFieldDataType.java new file mode 100644 index 000000000..462c3851a --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceFieldDataType.java @@ -0,0 +1,27 @@ +package eu.eudat.commons.enums; + +import com.fasterxml.jackson.annotation.JsonValue; +import eu.eudat.data.converters.enums.DatabaseEnum; + +import java.util.Map; + +public enum ReferenceFieldDataType implements DatabaseEnum { + Text((short) 0), + Date((short) 1); + private final Short value; + + ReferenceFieldDataType(Short value) { + this.value = value; + } + + @JsonValue + public Short getValue() { + return value; + } + + private static final Map map = EnumUtils.getEnumValueMap(ReferenceFieldDataType.class); + + public static ReferenceFieldDataType of(Short i) { + return map.get(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/DefinitionEntity.java b/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/DefinitionEntity.java new file mode 100644 index 000000000..bd727133c --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/DefinitionEntity.java @@ -0,0 +1,22 @@ +package eu.eudat.commons.types.reference; + +import jakarta.xml.bind.annotation.*; + +import java.util.List; + +@XmlRootElement(name = "definition") +@XmlAccessorType(XmlAccessType.FIELD) +public class DefinitionEntity { + @XmlElementWrapper(name = "fields") + @XmlElement(name = "field") + private List fields; + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/FieldEntity.java b/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/FieldEntity.java new file mode 100644 index 000000000..7cde86c32 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/types/reference/FieldEntity.java @@ -0,0 +1,47 @@ +package eu.eudat.commons.types.reference; + +import eu.eudat.commons.enums.ReferenceFieldDataType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "field") +@XmlAccessorType(XmlAccessType.FIELD) +public class FieldEntity { + + @XmlAttribute(name = "code") + private String code; + @XmlAttribute(name = "dataType") + private ReferenceFieldDataType dataType; + @XmlAttribute(name = "value") + private String value; + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + + public ReferenceFieldDataType getDataType() { + return dataType; + } + + public void setDataType(ReferenceFieldDataType dataType) { + this.dataType = dataType; + } + + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeConfiguration.java new file mode 100644 index 000000000..5276394ee --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeConfiguration.java @@ -0,0 +1,17 @@ +package eu.eudat.configurations.referencetype; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties({ReferenceTypeProperties.class}) +public class ReferenceTypeConfiguration { + + private final ReferenceTypeProperties referenceTypeProperties; + + @Autowired + public ReferenceTypeConfiguration(ReferenceTypeProperties referenceTypeProperties) { + this.referenceTypeProperties = referenceTypeProperties; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeField.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeField.java new file mode 100644 index 000000000..729880ac4 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeField.java @@ -0,0 +1,24 @@ +package eu.eudat.configurations.referencetype; + +public class ReferenceTypeField { + + String code; + + String dataType; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java new file mode 100644 index 000000000..3229f73da --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java @@ -0,0 +1,163 @@ +package eu.eudat.configurations.referencetype; + +import eu.eudat.model.persist.referencedefinition.DefinitionPersist; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.bind.ConstructorBinding; + +import java.util.List; +import java.util.Map; + +@ConfigurationProperties(prefix = "reference-type") +public class ReferenceTypeProperties { + + private Map> grant; + private Map> funder; + private Map> researcher; + private Map> service; + private Map> registry; + private Map> project; + private Map> organisation; + private Map> dataset; + private Map> dataRepository; + private Map> pubRepository; + private Map> journal; + private Map> publication; + private Map> licence; + private Map> taxonomy; + + @ConstructorBinding + public ReferenceTypeProperties(Map> grant, Map> funder, + Map> researcher, Map> service, + Map> registry, Map> project, + Map> organisation, Map> dataset, + Map> dataRepository, Map> pubRepository, + Map> journal, Map> publication, + Map> licence, Map> taxonomy) { + this.grant = grant; + this.funder = funder; + this.researcher = researcher; + this.service = service; + this.registry = registry; + this.project = project; + this.organisation = organisation; + this.dataset = dataset; + this.dataRepository = dataRepository; + this.pubRepository = pubRepository; + this.journal = journal; + this.publication = publication; + this.licence = licence; + this.taxonomy = taxonomy; + } + + public Map> getGrant() { + return grant; + } + + public void setGrant(Map> grant) { + this.grant = grant; + } + + public Map> getFunder() { + return funder; + } + + public void setFunder(Map> funder) { + this.funder = funder; + } + + public Map> getResearcher() { + return researcher; + } + + public void setResearcher(Map> researcher) { + this.researcher = researcher; + } + + public Map> getService() { + return service; + } + + public void setService(Map> service) { + this.service = service; + } + + public Map> getRegistry() { + return registry; + } + + public void setRegistry(Map> registry) { + this.registry = registry; + } + + public Map> getProject() { + return project; + } + + public void setProject(Map> project) { + this.project = project; + } + + public Map> getOrganisation() { + return organisation; + } + + public void setOrganisation(Map> organisation) { + this.organisation = organisation; + } + + public Map> getDataset() { + return dataset; + } + + public void setDataset(Map> dataset) { + this.dataset = dataset; + } + + public Map> getDataRepository() { + return dataRepository; + } + + public void setDataRepository(Map> dataRepository) { + this.dataRepository = dataRepository; + } + + public Map> getPubRepository() { + return pubRepository; + } + + public void setPubRepository(Map> pubRepository) { + this.pubRepository = pubRepository; + } + + public Map> getJournal() { + return journal; + } + + public void setJournal(Map> journal) { + this.journal = journal; + } + + public Map> getPublication() { + return publication; + } + + public void setPublication(Map> publication) { + this.publication = publication; + } + + public Map> getLicence() { + return licence; + } + + public void setLicence(Map> licence) { + this.licence = licence; + } + + public Map> getTaxonomy() { + return taxonomy; + } + + public void setTaxonomy(Map> taxonomy) { + this.taxonomy = taxonomy; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java index 0b2a3beed..e5a7a06c8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java @@ -3,6 +3,7 @@ package eu.eudat.model; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.SourceType; +import eu.eudat.model.referencedefinition.Definition; import java.time.Instant; import java.util.List; @@ -22,7 +23,7 @@ public class Reference { private String description; public static final String _description = "description"; - private String definition; + private Definition definition; public static final String _definition = "definition"; private String reference; @@ -84,11 +85,11 @@ public class Reference { this.description = description; } - public String getDefinition() { + public Definition getDefinition() { return definition; } - public void setDefinition(String definition) { + public void setDefinition(Definition definition) { this.definition = definition; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java index 985f0b94c..c120175c6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java @@ -1,10 +1,13 @@ package eu.eudat.model.builder; import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.XmlHandlingService; +import eu.eudat.commons.types.reference.DefinitionEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.ReferenceEntity; import eu.eudat.model.DmpReference; import eu.eudat.model.Reference; +import eu.eudat.model.builder.referencedefinition.DefinitionBuilder; import eu.eudat.query.DmpReferenceQuery; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; @@ -28,15 +31,17 @@ public class ReferenceBuilder extends BaseBuilder{ private final BuilderFactory builderFactory; private final QueryFactory queryFactory; + private final XmlHandlingService xmlHandlingService; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public ReferenceBuilder( ConventionService conventionService, - BuilderFactory builderFactory, QueryFactory queryFactory) { + BuilderFactory builderFactory, QueryFactory queryFactory, XmlHandlingService xmlHandlingService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(ReferenceBuilder.class))); this.builderFactory = builderFactory; this.queryFactory = queryFactory; + this.xmlHandlingService = xmlHandlingService; } public ReferenceBuilder authorize(EnumSet values) { @@ -51,7 +56,8 @@ public class ReferenceBuilder extends BaseBuilder{ if (fields == null || data == null || fields.isEmpty()) return new ArrayList<>(); - //FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(Reference._createdBy)); + //ToDo FieldSet userInfoFields = fields.extractPrefixed(this.asPrefix(Reference._createdBy)); + FieldSet definitionFields = fields.extractPrefixed(this.asPrefix(Reference._definition)); FieldSet dmpReferencesFields = fields.extractPrefixed(this.asPrefix(Reference._dmpReferences)); Map> dmpReferenceMap = this.collectDmpReferences(dmpReferencesFields, data); @@ -64,7 +70,10 @@ public class ReferenceBuilder extends BaseBuilder{ if (fields.hasField(this.asIndexer(Reference._createdAt))) m.setCreatedAt(d.getCreatedAt()); if (fields.hasField(this.asIndexer(Reference._updatedAt))) m.setUpdatedAt(d.getUpdatedAt()); if (fields.hasField(this.asIndexer(Reference._isActive))) m.setIsActive(d.getIsActive()); - if (fields.hasField(this.asIndexer(Reference._definition))) m.setReference(d.getDefinition()); + if (!definitionFields.isEmpty() && d.getDefinition() != null){ + DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, d.getDefinition()); + m.setDefinition(this.builderFactory.builder(DefinitionBuilder.class).authorize(this.authorize).build(definitionFields, definition)); + } if (fields.hasField(this.asIndexer(Reference._reference))) m.setReference(d.getReference()); if (fields.hasField(this.asIndexer(Reference._abbreviation))) m.setAbbreviation(d.getAbbreviation()); if (fields.hasField(this.asIndexer(Reference._description))) m.setDescription(d.getDescription()); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/DefinitionBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/DefinitionBuilder.java new file mode 100644 index 000000000..6fadedd2d --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/DefinitionBuilder.java @@ -0,0 +1,59 @@ +package eu.eudat.model.builder.referencedefinition; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.types.reference.DefinitionEntity; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.builder.BaseBuilder; +import eu.eudat.model.referencedefinition.Definition; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DefinitionBuilder extends BaseBuilder { + + private final BuilderFactory builderFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public DefinitionBuilder( + ConventionService conventionService, BuilderFactory builderFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(DefinitionBuilder.class))); + this.builderFactory = builderFactory; + } + + public DefinitionBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + + //Not Bulk Build because is XML no interaction with db + FieldSet definitionFields = fields.extractPrefixed(this.asPrefix(Definition._fields)); + + List models = new ArrayList<>(); + for (DefinitionEntity d : data) { + Definition m = new Definition(); + if (!definitionFields.isEmpty() && d.getFields() != null) m.setFields(this.builderFactory.builder(FieldBuilder.class).authorize(this.authorize).build(definitionFields, d.getFields())); + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/FieldBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/FieldBuilder.java new file mode 100644 index 000000000..da39787d2 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/referencedefinition/FieldBuilder.java @@ -0,0 +1,59 @@ +package eu.eudat.model.builder.referencedefinition; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.types.reference.FieldEntity; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.builder.BaseBuilder; +import eu.eudat.model.referencedefinition.Field; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +import gr.cite.tools.logging.LoggerService; +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.util.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class FieldBuilder extends BaseBuilder { + + private final BuilderFactory builderFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public FieldBuilder( + ConventionService conventionService, BuilderFactory builderFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(FieldBuilder.class))); + this.builderFactory = builderFactory; + } + + public FieldBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + + List models = new ArrayList<>(); + for (FieldEntity d : data) { + Field m = new Field(); + if (fields.hasField(this.asIndexer(Field._code))) m.setCode(d.getCode()); + if (fields.hasField(this.asIndexer(Field._dataType))) m.setDataType(d.getDataType()); + if (fields.hasField(this.asIndexer(Field._value))) m.setValue(d.getValue()); + + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java new file mode 100644 index 000000000..12eb99430 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java @@ -0,0 +1,123 @@ +package eu.eudat.model.persist; + +import eu.eudat.commons.enums.ReferenceType; +import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.validation.FieldNotNullIfOtherSet; +import eu.eudat.commons.validation.ValidEnum; +import eu.eudat.commons.validation.ValidId; +import eu.eudat.model.persist.referencedefinition.DefinitionPersist; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +import java.util.UUID; + +@FieldNotNullIfOtherSet(message = "{validation.hashempty}") +public class ReferencePersist { + + @ValidId(message = "{validation.invalidid}") + private UUID id; + + @NotNull(message = "{validation.empty}") + @NotEmpty(message = "{validation.empty}") + @Size(max = 250, message = "{validation.largerthanmax}") + private String label; + + @ValidEnum(message = "{validation.empty}") + private ReferenceType type; + + private String description; + + @Valid + private DefinitionPersist definition; + + @NotNull(message = "{validation.empty}") + @NotEmpty(message = "{validation.empty}") + @Size(max = 1024, message = "{validation.largerthanmax}") + private String reference; + + @Size(max = 50, message = "{validation.largerthanmax}") + private String abbreviation; + + @Size(max = 1024, message = "{validation.largerthanmax}") + private String source; + + @ValidEnum(message = "{validation.empty}") + private SourceType sourceType; + + //private UserInfoPersist createdBy; ToDo + + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public ReferenceType getType() { + return type; + } + + public void setType(ReferenceType type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public DefinitionPersist getDefinition() { + return definition; + } + + public void setDefinition(DefinitionPersist definition) { + this.definition = definition; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public SourceType getSourceType() { + return sourceType; + } + + public void setSourceType(SourceType sourceType) { + this.sourceType = sourceType; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/DefinitionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/DefinitionPersist.java new file mode 100644 index 000000000..60c8c6881 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/DefinitionPersist.java @@ -0,0 +1,21 @@ +package eu.eudat.model.persist.referencedefinition; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +import java.util.List; + +public class DefinitionPersist { + + @NotNull(message = "{validation.empty}") + @Valid + private List fields = null; + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java new file mode 100644 index 000000000..0a53aaadc --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java @@ -0,0 +1,47 @@ +package eu.eudat.model.persist.referencedefinition; + +import eu.eudat.commons.enums.ReferenceFieldDataType; +import eu.eudat.commons.validation.ValidEnum; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +public class FieldPersist { + + @NotNull(message = "{validation.empty}") + @NotEmpty(message = "{validation.empty}") + private String code = null; + + @ValidEnum(message = "{validation.empty}") + private ReferenceFieldDataType dataType; + + @NotNull(message = "{validation.empty}") + @NotEmpty(message = "{validation.empty}") + private String value = null; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ReferenceFieldDataType getDataType() { + return dataType; + } + + public void setDataType(ReferenceFieldDataType dataType) { + this.dataType = dataType; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} + + diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Definition.java b/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Definition.java new file mode 100644 index 000000000..3c8bb7b70 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Definition.java @@ -0,0 +1,17 @@ +package eu.eudat.model.referencedefinition; + +import java.util.List; + +public class Definition { + + public final static String _fields = "fields"; + private List fields; + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Field.java b/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Field.java new file mode 100644 index 000000000..5bd9cfec5 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/referencedefinition/Field.java @@ -0,0 +1,39 @@ +package eu.eudat.model.referencedefinition; + +import eu.eudat.commons.enums.ReferenceFieldDataType; + +public class Field { + + public final static String _code = "code"; + private String code; + + public final static String _dataType = "dataType"; + private ReferenceFieldDataType dataType; + + public final static String _value = "value"; + private String value; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ReferenceFieldDataType getDataType() { + return dataType; + } + + public void setDataType(ReferenceFieldDataType dataType) { + this.dataType = dataType; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ReferenceCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ReferenceCriteria.java new file mode 100644 index 000000000..f6bdc83a5 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ReferenceCriteria.java @@ -0,0 +1,17 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.ReferenceEntity; + +import java.util.UUID; + +public class ReferenceCriteria extends Criteria{ + + private UUID creationUserId; + + public UUID getCreationUserId() { + return creationUserId; + } + public void setCreationUserId(UUID creationUserId) { + this.creationUserId = creationUserId; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java index 7c51ed60c..f5a5cd41f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/ReferenceController.java @@ -1,5 +1,6 @@ package eu.eudat.controllers.v2; +import com.fasterxml.jackson.core.JsonProcessingException; import eu.eudat.audit.AuditableAction; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; @@ -13,6 +14,7 @@ import eu.eudat.logic.services.references.ReferenceService; import eu.eudat.model.Reference; import eu.eudat.model.builder.ReferenceBuilder; import eu.eudat.model.censorship.ReferenceCensor; +import eu.eudat.model.persist.ReferencePersist; import eu.eudat.model.result.QueryResult; import eu.eudat.models.data.FetcherReference; import eu.eudat.models.data.helpers.responses.ResponseItem; @@ -30,7 +32,9 @@ 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 gr.cite.tools.validation.MyValidate; import jakarta.transaction.Transactional; +import jakarta.xml.bind.JAXBException; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -40,6 +44,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.management.InvalidApplicationException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; import java.util.AbstractMap; import java.util.List; import java.util.Map; @@ -88,7 +94,7 @@ public class ReferenceController extends BaseController { List models = this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(lookup.getProject(), datas); long count = (lookup.getMetadata() != null && lookup.getMetadata().getCountAll()) ? query.count() : models.size(); - this.auditService.track(AuditableAction.External_Reference_Query, "lookup", lookup); + this.auditService.track(AuditableAction.Reference_Query, "lookup", lookup); return new QueryResult(models, count); } @@ -104,7 +110,7 @@ public class ReferenceController extends BaseController { if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); - this.auditService.track(AuditableAction.External_Reference_Lookup, Map.ofEntries( + this.auditService.track(AuditableAction.Reference_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), new AbstractMap.SimpleEntry("fields", fieldSet) )); @@ -112,6 +118,22 @@ public class ReferenceController extends BaseController { return model; } + @PostMapping("persist") + @Transactional + public Reference persist(@MyValidate @RequestBody ReferencePersist model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException { + logger.debug(new MapLogEntry("persisting" + Reference.class.getSimpleName()).And("model", model).And("fieldSet", fieldSet)); + this.censorFactory.censor(ReferenceCensor.class).censor(fieldSet, null); + + Reference persisted = this.referenceService.persist(model, fieldSet); + + this.auditService.track(AuditableAction.Reference_Persist, Map.ofEntries( + new AbstractMap.SimpleEntry("model", model), + new AbstractMap.SimpleEntry("fields", fieldSet) + )); + //this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action); + return persisted; + } + @GetMapping(path = {"search/{externalType}"}, produces = "application/json") public @ResponseBody ResponseEntity>> searchReference(@PathVariable(value = "externalType") int externalType, @RequestParam(value = "query", required = false) String query, @@ -131,7 +153,7 @@ public class ReferenceController extends BaseController { this.referenceService.deleteAndSave(id); - this.auditService.track(AuditableAction.External_Reference_Delete, "id", id); + this.auditService.track(AuditableAction.Reference_Delete, "id", id); } @@ -145,27 +167,4 @@ public class ReferenceController extends BaseController { // return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); // } - - - -// @GetMapping(path = {"{externalType}"}, produces = "application/json") -// public @ResponseBody ResponseEntity>> listExternalReferecnes2(@RequestParam(value = "externalType") String externalType, @RequestParam(value = "query", required = false) String query, -// @RequestParam(value = "type", required = false) String type -// ) throws HugeResultSet, NoURLFound, InvalidApplicationException { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// List externalReferences = this.externalReferencesService.getExternalReference2(externalType, query, type); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(externalReferences)); -// } -// -// @Transactional -// @PostMapping(value = {"{externalType}/persist"}, consumes = "application/json", produces = "application/json") -// public @ResponseBody -// ResponseEntity> create(@RequestBody ExternalReference2 externalReference) throws Exception { -// this.authorizationService.authorizeForce(Permission.AuthenticatedRole); -// -// ExternalReference2 newExternalReference = this.externalReferencesService.create(externalReference); -// return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(newExternalReference).status(ApiMessageCode.SUCCESS_MESSAGE)); -// } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java index e531b4a60..c8ba55201 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java @@ -1,13 +1,18 @@ package eu.eudat.logic.services.references; +import com.fasterxml.jackson.core.JsonProcessingException; +import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; +import eu.eudat.commons.XmlHandlingService; +import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.scope.user.UserScope; +import eu.eudat.commons.types.reference.DefinitionEntity; +import eu.eudat.commons.types.reference.FieldEntity; +import eu.eudat.configurations.referencetype.ReferenceTypeProperties; import eu.eudat.convention.ConventionService; -import eu.eudat.data.dao.criteria.DataRepositoryCriteria; -import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; -import eu.eudat.data.dao.criteria.RegistryCriteria; -import eu.eudat.data.dao.criteria.ServiceCriteria; +import eu.eudat.data.ReferenceEntity; +import eu.eudat.data.dao.criteria.*; import eu.eudat.data.old.DataRepository; import eu.eudat.data.old.ExternalDataset; import eu.eudat.data.old.Registry; @@ -18,20 +23,37 @@ import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.ApiContext; +import eu.eudat.model.Reference; +import eu.eudat.model.builder.ReferenceBuilder; import eu.eudat.model.deleter.ReferenceDeleter; +import eu.eudat.model.persist.ReferencePersist; +import eu.eudat.model.persist.referencedefinition.DefinitionPersist; +import eu.eudat.model.persist.referencedefinition.FieldPersist; import eu.eudat.models.data.FetcherReference; import eu.eudat.queryable.QueryableList; 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.exception.MyApplicationException; import gr.cite.tools.exception.MyForbiddenException; +import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.exception.MyValidationException; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.logging.MapLogEntry; import jakarta.persistence.EntityManager; +import jakarta.xml.bind.JAXBException; +import org.jetbrains.annotations.NotNull; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import javax.management.InvalidApplicationException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -49,6 +71,8 @@ public class ReferenceService { private final ConventionService conventionService; private final MessageSource messageSource; private final QueryFactory queryFactory; + private final XmlHandlingService xmlHandlingService; + private final ReferenceTypeProperties referenceTypeProperties; public ReferenceService(ApiContext apiContext, UserScope userScope, @@ -59,7 +83,9 @@ public class ReferenceService { BuilderFactory builderFactory, ConventionService conventionService, MessageSource messageSource, - QueryFactory queryFactory) { + QueryFactory queryFactory, + XmlHandlingService xmlHandlingService, + ReferenceTypeProperties referenceTypeProperties) { this.apiContext = apiContext; this.userScope = userScope; this.remoteFetcher = remoteFetcher; @@ -70,6 +96,68 @@ public class ReferenceService { this.conventionService = conventionService; this.messageSource = messageSource; this.queryFactory = queryFactory; + this.xmlHandlingService = xmlHandlingService; + this.referenceTypeProperties = referenceTypeProperties; + } + + public Reference persist(ReferencePersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, JsonProcessingException, TransformerException, ParserConfigurationException { + logger.debug(new MapLogEntry("persisting data").And("model", model).And("fields", fields)); + + this.authorizationService.authorizeForce(Permission.EditDmpBlueprint); + + Boolean isUpdate = this.conventionService.isValidGuid(model.getId()); + + ReferenceEntity data; + if (isUpdate) { + data = this.entityManager.find(ReferenceEntity.class, model.getId()); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); + } else { + data = new ReferenceEntity(); + data.setId(UUID.randomUUID()); + data.setIsActive(IsActive.Active); + data.setCreatedAt(Instant.now()); + } + + data.setLabel(model.getLabel()); + data.setType(model.getType()); + data.setDescription(model.getDescription()); + data.setDefinition(this.xmlHandlingService.toXmlSafe(this.buildDefinitionEntity(model.getDefinition()))); + data.setUpdatedAt(Instant.now()); + data.setReference(model.getReference()); + data.setAbbreviation(model.getAbbreviation()); + data.setSource(model.getSource()); + + if (isUpdate) this.entityManager.merge(data); + else this.entityManager.persist(data); + + this.entityManager.flush(); + + return this.builderFactory.builder(ReferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(BaseFieldSet.build(fields, Reference._id), data); + } + + private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist){ + DefinitionEntity data = new DefinitionEntity(); + if (persist == null) return data; + if (!this.conventionService.isListNullOrEmpty(persist.getFields())){ + data.setFields(new ArrayList<>()); + for (FieldPersist fieldPersist: persist.getFields()) { + data.getFields().add(this.buildFieldEntity(fieldPersist)); + } + } + + return data; + } + + private @NotNull FieldEntity buildFieldEntity(FieldPersist persist){ + FieldEntity data = new FieldEntity(); + if (persist == null) return data; + + data.setCode(persist.getCode()); + data.setDataType(persist.getDataType()); + data.setCode(persist.getCode()); + + return data; } public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { @@ -80,27 +168,13 @@ public class ReferenceService { this.deleterFactory.deleter(ReferenceDeleter.class).deleteAndSaveByIds(List.of(id)); } - // external references: - // taxonomies, - // licenses, - // publications, - // journals, - // pubRepositories, - // dataRepositories - // registries, - // services public List searchReference(ReferenceType externalType, String query, String type) throws HugeResultSet, NoURLFound, InvalidApplicationException { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = null; - if (externalType.equals(ReferenceType.Datasets)){ - remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); - }else { - remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); - } + List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().get(externalType, externalUrlCriteria, type); List list = this.fetchFromDb(externalType, query, type, remoteRepos); - + list.addAll(remoteRepos.stream().map(FetcherReference::fromRemoteModel).toList()); list = list.stream().filter(x -> x.getName().toLowerCase().contains(query.toLowerCase())).collect(Collectors.toList()); list.sort(Comparator.comparing(FetcherReference::getName)); @@ -136,7 +210,7 @@ public class ReferenceService { if (!query.isEmpty()) criteria.setLike(query); criteria.setCreationUserId(this.userScope.getUserId()); - + if (type.equals("")) { List serviceList = (this.apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().getWithCriteria(criteria)).toList(); list = serviceList.stream().map(item -> new FetcherReference().fromService(item)).collect(Collectors.toList()); @@ -156,7 +230,7 @@ public class ReferenceService { case Licenses: break; } - + return list; } diff --git a/dmp-backend/web/src/main/resources/config/application.yml b/dmp-backend/web/src/main/resources/config/application.yml index cd7cfe9ae..39eab1c42 100644 --- a/dmp-backend/web/src/main/resources/config/application.yml +++ b/dmp-backend/web/src/main/resources/config/application.yml @@ -18,4 +18,5 @@ spring: optional:classpath:config/cors.yml[.yml], optional:classpath:config/cors-${spring.profiles.active}.yml[.yml], optional:file:../config/cors-${spring.profiles.active}.yml[.yml], optional:classpath:config/swagger.yml[.yml], optional:classpath:config/swagger-${spring.profiles.active}.yml[.yml], optional:file:../config/swagger-${spring.profiles.active}.yml[.yml], optional:classpath:config/deposit.yml[.yml], optional:classpath:config/deposit-${spring.profiles.active}.yml[.yml], optional:file:../config/deposit-${spring.profiles.active}.yml[.yml], - optional:classpath:config/errors.yml[.yml], optional:classpath:config/errors-${spring.profiles.active}.yml[.yml], optional:file:../config/errors-${spring.profiles.active}.yml[.yml] + optional:classpath:config/errors.yml[.yml], optional:classpath:config/errors-${spring.profiles.active}.yml[.yml], optional:file:../config/errors-${spring.profiles.active}.yml[.yml], + optional:classpath:config/reference-type.yml[.yml], optional:classpath:config/reference-type-${spring.profiles.active}.yml[.yml], optional:file:../config/reference-type-${spring.profiles.active}.yml[.yml] diff --git a/dmp-backend/web/src/main/resources/config/reference-type.yml b/dmp-backend/web/src/main/resources/config/reference-type.yml new file mode 100644 index 000000000..da97e5940 --- /dev/null +++ b/dmp-backend/web/src/main/resources/config/reference-type.yml @@ -0,0 +1,65 @@ +reference-type: + grant: + fields: + - code: startDate + dataType: date + - code: endDate + dataType: date + funder: + fields: + - code: uri + dataType: text + researcher: + fields: + - code: firstName + dataType: text + - code: lastName + dataType: text + - code: uri + dataType: text + service: + fields: + - code: uri + dataType: text + registry: + fields: + - code: uri + dataType: text + project: + fields: + - code: startDate + dataType: date + - code: endDate + dataType: date + organisation: + fields: + - code: pid + dataType: text + - code: uri + dataType: text + - code: pidTypeField + dataType: text + dataset: + fields: + - code: pid + dataType: text + - code: pidTypeField + dataType: text + dataRepository: + fields: + pubRepository: + fields: + journal: + fields: + publication: + fields: + - code: pid + dataType: text + - code: pidTypeField + dataType: text + licence: + fields: + - code: uri + dataType: text + taxonomy: + fields: \ No newline at end of file diff --git a/dmp-frontend/src/app/core/common/enum/reference-field-data-type.ts b/dmp-frontend/src/app/core/common/enum/reference-field-data-type.ts new file mode 100644 index 000000000..a8fc9563b --- /dev/null +++ b/dmp-frontend/src/app/core/common/enum/reference-field-data-type.ts @@ -0,0 +1,4 @@ +export enum ReferenceFieldDataType { + Text = 0, + Date = 1 +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/model/reference/reference.ts b/dmp-frontend/src/app/core/model/reference/reference.ts index a03191bea..0fdf421a7 100644 --- a/dmp-frontend/src/app/core/model/reference/reference.ts +++ b/dmp-frontend/src/app/core/model/reference/reference.ts @@ -3,13 +3,14 @@ import { IsActive } from "@app/core/common/enum/is-active.enum"; import { SourceType } from "@app/core/common/enum/source-type"; import { UUID } from "crypto"; import { DmpModel } from "../dmp/dmp"; +import { ReferenceFieldDataType } from "@app/core/common/enum/reference-field-data-type"; export interface Reference { id: UUID; label: string; type: ReferenceType; description: string; - definition: string; + definition: Definition; reference: string; abbreviation: string; source: string; @@ -20,13 +21,26 @@ export interface Reference { dmpReferences: DmpReference[]; } +export interface Definition { + fields: Field[]; +} + +export interface Field { + code: string; + dataType: ReferenceFieldDataType; + value: string; +} + export interface DmpReference { id: UUID; dmp: DmpModel; reference: Reference; data: string; + createdAt: Date; + updatedAt: Date; } +// old fetcher export interface FetcherReference { id: string; name: string; @@ -42,4 +56,29 @@ export interface FetcherReference { firstName: string; lastName: string; tag: string; +} + + +// Persist + +export interface ReferencePersist { + id: UUID; + label: string; + type: ReferenceType; + description: string; + definition: DefinitionPersist; + reference: string; + abbreviation: string; + source: string; + sourceType: SourceType; +} + +export interface DefinitionPersist { + fields?: FieldPersist[]; +} + +export interface FieldPersist { + code: string; + dataType: ReferenceFieldDataType; + value: string; } \ No newline at end of file From 9d3cc9e3d2e11f1eb5d8f49b7c8f3f8880e6f192 Mon Sep 17 00:00:00 2001 From: amentis Date: Fri, 27 Oct 2023 18:29:06 +0300 Subject: [PATCH 25/25] rename sourceType to referenceSourceType --- ...urceType.java => ReferenceSourceType.java} | 8 +++--- .../ReferenceTypeProperties.java | 9 ++++--- .../java/eu/eudat/data/ReferenceEntity.java | 14 +++++----- .../enums/ReferenceSourceTypeConverter.java | 11 ++++++++ .../converters/enums/SourceTypeConverter.java | 11 -------- .../main/java/eu/eudat/model/Reference.java | 12 ++++----- .../eudat/model/builder/ReferenceBuilder.java | 2 +- .../eudat/model/persist/ReferencePersist.java | 12 ++++----- .../java/eu/eudat/query/ReferenceQuery.java | 26 +++++++++---------- .../eudat/query/lookup/ReferenceLookup.java | 14 +++++----- .../services/references/ReferenceService.java | 1 + .../core/common/enum/reference-source-type.ts | 4 +++ .../src/app/core/common/enum/source-type.ts | 4 --- .../src/app/core/model/reference/reference.ts | 6 ++--- 14 files changed, 69 insertions(+), 65 deletions(-) rename dmp-backend/core/src/main/java/eu/eudat/commons/enums/{SourceType.java => ReferenceSourceType.java} (55%) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceSourceTypeConverter.java delete mode 100644 dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java create mode 100644 dmp-frontend/src/app/core/common/enum/reference-source-type.ts delete mode 100644 dmp-frontend/src/app/core/common/enum/source-type.ts diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceSourceType.java similarity index 55% rename from dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java rename to dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceSourceType.java index 3a9fd28ca..7c5394edc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/SourceType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/ReferenceSourceType.java @@ -4,14 +4,14 @@ import eu.eudat.data.converters.enums.DatabaseEnum; import java.util.Map; -public enum SourceType implements DatabaseEnum { +public enum ReferenceSourceType implements DatabaseEnum { Internal((short) 0), External((short) 1); private final Short value; - SourceType(Short value) { + ReferenceSourceType(Short value) { this.value = value; } @@ -20,9 +20,9 @@ public enum SourceType implements DatabaseEnum { return value; } - private static final Map map = EnumUtils.getEnumValueMap(SourceType.class); + private static final Map map = EnumUtils.getEnumValueMap(ReferenceSourceType.class); - public static SourceType of(Short i) { + public static ReferenceSourceType of(Short i) { return map.get(i); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java index 3229f73da..2f37252e3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/configurations/referencetype/ReferenceTypeProperties.java @@ -1,6 +1,7 @@ package eu.eudat.configurations.referencetype; import eu.eudat.model.persist.referencedefinition.DefinitionPersist; +import eu.eudat.model.referencedefinition.Field; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.bind.ConstructorBinding; @@ -18,7 +19,7 @@ public class ReferenceTypeProperties { private Map> project; private Map> organisation; private Map> dataset; - private Map> dataRepository; + private Map> dataRepository; private Map> pubRepository; private Map> journal; private Map> publication; @@ -30,7 +31,7 @@ public class ReferenceTypeProperties { Map> researcher, Map> service, Map> registry, Map> project, Map> organisation, Map> dataset, - Map> dataRepository, Map> pubRepository, + Map> dataRepository, Map> pubRepository, Map> journal, Map> publication, Map> licence, Map> taxonomy) { this.grant = grant; @@ -113,11 +114,11 @@ public class ReferenceTypeProperties { this.dataset = dataset; } - public Map> getDataRepository() { + public Map> getDataRepository() { return dataRepository; } - public void setDataRepository(Map> dataRepository) { + public void setDataRepository(Map> dataRepository) { this.dataRepository = dataRepository; } 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 cf45ebfda..5122f7b31 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 @@ -2,7 +2,8 @@ package eu.eudat.data; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; -import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.enums.ReferenceSourceType; +import eu.eudat.data.converters.enums.ReferenceSourceTypeConverter; import eu.eudat.data.converters.enums.ReferenceTypeConverter; import eu.eudat.data.converters.enums.IsActiveConverter; import jakarta.persistence.*; @@ -51,7 +52,8 @@ public class ReferenceEntity { public static final String _source = "source"; @Column(name = "source_type", nullable = false) - private SourceType sourceType; + @Convert(converter = ReferenceSourceTypeConverter.class) + private ReferenceSourceType referenceSourceType; public static final String _sourceType = "sourceType"; @Column(name = "is_active", nullable = false) @@ -135,12 +137,12 @@ public class ReferenceEntity { this.source = source; } - public SourceType getSourceType() { - return sourceType; + public ReferenceSourceType getReferenceSourceType() { + return referenceSourceType; } - public void setSourceType(SourceType sourceType) { - this.sourceType = sourceType; + public void setReferenceSourceType(ReferenceSourceType referenceSourceType) { + this.referenceSourceType = referenceSourceType; } public IsActive getIsActive() { diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceSourceTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceSourceTypeConverter.java new file mode 100644 index 000000000..ca2499e47 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/ReferenceSourceTypeConverter.java @@ -0,0 +1,11 @@ +package eu.eudat.data.converters.enums; + +import eu.eudat.commons.enums.ReferenceSourceType; +import jakarta.persistence.Converter; + +@Converter +public class ReferenceSourceTypeConverter extends DatabaseEnumConverter{ + public ReferenceSourceType of(Short i) { + return ReferenceSourceType.of(i); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java b/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java deleted file mode 100644 index 573921637..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/data/converters/enums/SourceTypeConverter.java +++ /dev/null @@ -1,11 +0,0 @@ -package eu.eudat.data.converters.enums; - -import eu.eudat.commons.enums.SourceType; -import jakarta.persistence.Converter; - -@Converter -public class SourceTypeConverter extends DatabaseEnumConverter{ - public SourceType of(Short i) { - return SourceType.of(i); - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java index e5a7a06c8..53a850f09 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/Reference.java @@ -2,7 +2,7 @@ package eu.eudat.model; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; -import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.model.referencedefinition.Definition; import java.time.Instant; @@ -35,7 +35,7 @@ public class Reference { private String source; public static final String _source = "source"; - private SourceType sourceType; + private ReferenceSourceType referenceSourceType; public static final String _sourceType = "sourceType"; private IsActive isActive; @@ -117,12 +117,12 @@ public class Reference { this.source = source; } - public SourceType getSourceType() { - return sourceType; + public ReferenceSourceType getReferenceSourceType() { + return referenceSourceType; } - public void setSourceType(SourceType sourceType) { - this.sourceType = sourceType; + public void setReferenceSourceType(ReferenceSourceType referenceSourceType) { + this.referenceSourceType = referenceSourceType; } public IsActive getIsActive() { diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java index c120175c6..8805531b2 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/ReferenceBuilder.java @@ -78,7 +78,7 @@ public class ReferenceBuilder extends BaseBuilder{ if (fields.hasField(this.asIndexer(Reference._abbreviation))) m.setAbbreviation(d.getAbbreviation()); if (fields.hasField(this.asIndexer(Reference._description))) m.setDescription(d.getDescription()); if (fields.hasField(this.asIndexer(Reference._source))) m.setSource(d.getSource()); - if (fields.hasField(this.asIndexer(Reference._sourceType))) m.setSourceType(d.getSourceType()); + if (fields.hasField(this.asIndexer(Reference._sourceType))) m.setReferenceSourceType(d.getReferenceSourceType()); if (fields.hasField(this.asIndexer(Reference._type))) m.setType(d.getType()); // if (!userInfoFields.isEmpty() && d.getCreatedBy() != null){ // //ToDo diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java index 12eb99430..066a631ea 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/ReferencePersist.java @@ -1,7 +1,7 @@ package eu.eudat.model.persist; import eu.eudat.commons.enums.ReferenceType; -import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.commons.validation.FieldNotNullIfOtherSet; import eu.eudat.commons.validation.ValidEnum; import eu.eudat.commons.validation.ValidId; @@ -44,7 +44,7 @@ public class ReferencePersist { private String source; @ValidEnum(message = "{validation.empty}") - private SourceType sourceType; + private ReferenceSourceType referenceSourceType; //private UserInfoPersist createdBy; ToDo @@ -113,11 +113,11 @@ public class ReferencePersist { this.source = source; } - public SourceType getSourceType() { - return sourceType; + public ReferenceSourceType getReferenceSourceType() { + return referenceSourceType; } - public void setSourceType(SourceType sourceType) { - this.sourceType = sourceType; + public void setReferenceSourceType(ReferenceSourceType referenceSourceType) { + this.referenceSourceType = referenceSourceType; } } 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 1fc160a6c..8bb09948d 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 @@ -3,7 +3,7 @@ package eu.eudat.query; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; -import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.commons.scope.user.UserScope; import eu.eudat.data.ReferenceEntity; import gr.cite.commons.web.authz.service.AuthorizationService; @@ -30,7 +30,7 @@ public class ReferenceQuery extends QueryBase { private Collection isActives; - private Collection sourceTypes; + private Collection referenceSourceTypes; private Collection referenceTypes; @@ -103,18 +103,18 @@ public class ReferenceQuery extends QueryBase { return this; } - public ReferenceQuery sourceTypes(SourceType value) { - this.sourceTypes = List.of(value); + public ReferenceQuery referenceSourceTypes(ReferenceSourceType value) { + this.referenceSourceTypes = List.of(value); return this; } - public ReferenceQuery sourceTypes(SourceType... value) { - this.sourceTypes = Arrays.asList(value); + public ReferenceQuery referenceSourceTypes(ReferenceSourceType... value) { + this.referenceSourceTypes = Arrays.asList(value); return this; } - public ReferenceQuery sourceTypes(Collection values) { - this.sourceTypes = values; + public ReferenceQuery referenceSourceTypes(Collection values) { + this.referenceSourceTypes = values; return this; } @@ -142,7 +142,7 @@ public class ReferenceQuery extends QueryBase { @Override protected Boolean isFalseQuery() { - return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.referenceTypes) || this.isEmpty(this.sourceTypes); + return this.isEmpty(this.ids) || this.isEmpty(this.isActives) || this.isEmpty(this.excludedIds) || this.isEmpty(this.referenceTypes) || this.isEmpty(this.referenceSourceTypes); } @Override @@ -165,9 +165,9 @@ public class ReferenceQuery extends QueryBase { inClause.value(item); predicates.add(inClause); } - if (this.sourceTypes != null) { - CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._sourceType)); - for (SourceType item : this.sourceTypes) + if (this.referenceSourceTypes != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(ReferenceEntity._sourceType)); + for (ReferenceSourceType item : this.referenceSourceTypes) inClause.value(item); predicates.add(inClause); } @@ -204,7 +204,7 @@ public class ReferenceQuery extends QueryBase { item.setAbbreviation(QueryBase.convertSafe(tuple, columns, ReferenceEntity._abbreviation, String.class)); item.setReference(QueryBase.convertSafe(tuple, columns, ReferenceEntity._reference, String.class)); item.setSource(QueryBase.convertSafe(tuple, columns, ReferenceEntity._source, String.class)); - item.setSourceType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._sourceType, SourceType.class)); + item.setReferenceSourceType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._sourceType, ReferenceSourceType.class)); item.setType(QueryBase.convertSafe(tuple, columns, ReferenceEntity._type, ReferenceType.class)); item.setCreatedBy(QueryBase.convertSafe(tuple, columns, ReferenceEntity._createdBy, UUID.class)); return item; diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java index 10b414b34..9566e6254 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/ReferenceLookup.java @@ -2,7 +2,7 @@ package eu.eudat.query.lookup; import eu.eudat.commons.enums.ReferenceType; import eu.eudat.commons.enums.IsActive; -import eu.eudat.commons.enums.SourceType; +import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.query.ReferenceQuery; import gr.cite.tools.data.query.Lookup; import gr.cite.tools.data.query.QueryFactory; @@ -17,7 +17,7 @@ public class ReferenceLookup extends Lookup { private List isActive; - private Collection sourceTypes; + private Collection referenceSourceTypes; private Collection referenceTypes; @@ -57,12 +57,12 @@ public class ReferenceLookup extends Lookup { this.excludedIds = excludeIds; } - public Collection getSourceTypes() { - return sourceTypes; + public Collection getReferenceSourceTypes() { + return referenceSourceTypes; } - public void setSourceTypes(Collection sourceTypes) { - this.sourceTypes = sourceTypes; + public void setReferenceSourceTypes(Collection referenceSourceTypes) { + this.referenceSourceTypes = referenceSourceTypes; } public Collection getReferenceTypes() { @@ -78,7 +78,7 @@ public class ReferenceLookup extends Lookup { if (this.like != null) query.like(this.like); if (this.isActive != null) query.isActive(this.isActive); if (this.referenceTypes != null) query.referenceTypes(this.referenceTypes); - if (this.sourceTypes != null) query.sourceTypes(this.sourceTypes); + if (this.referenceSourceTypes != null) query.referenceSourceTypes(this.referenceSourceTypes); if (this.ids != null) query.ids(this.ids); if (this.excludedIds != null) query.excludedIds(this.excludedIds); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java index c8ba55201..77955edbb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/references/ReferenceService.java @@ -127,6 +127,7 @@ public class ReferenceService { data.setReference(model.getReference()); data.setAbbreviation(model.getAbbreviation()); data.setSource(model.getSource()); + data.setReferenceSourceType(model.getReferenceSourceType()); if (isUpdate) this.entityManager.merge(data); else this.entityManager.persist(data); diff --git a/dmp-frontend/src/app/core/common/enum/reference-source-type.ts b/dmp-frontend/src/app/core/common/enum/reference-source-type.ts new file mode 100644 index 000000000..412083fce --- /dev/null +++ b/dmp-frontend/src/app/core/common/enum/reference-source-type.ts @@ -0,0 +1,4 @@ +export enum ReferenceSourceType { + Internal = 0, + External = 1 +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/common/enum/source-type.ts b/dmp-frontend/src/app/core/common/enum/source-type.ts deleted file mode 100644 index 01a5d866a..000000000 --- a/dmp-frontend/src/app/core/common/enum/source-type.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum SourceType { - Internal = 0, - External = 1 -} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/model/reference/reference.ts b/dmp-frontend/src/app/core/model/reference/reference.ts index 0fdf421a7..6063b887c 100644 --- a/dmp-frontend/src/app/core/model/reference/reference.ts +++ b/dmp-frontend/src/app/core/model/reference/reference.ts @@ -1,6 +1,6 @@ import { ReferenceType } from "@app/core/common/enum/reference-type"; import { IsActive } from "@app/core/common/enum/is-active.enum"; -import { SourceType } from "@app/core/common/enum/source-type"; +import { ReferenceSourceType } from "@app/core/common/enum/reference-source-type"; import { UUID } from "crypto"; import { DmpModel } from "../dmp/dmp"; import { ReferenceFieldDataType } from "@app/core/common/enum/reference-field-data-type"; @@ -14,7 +14,7 @@ export interface Reference { reference: string; abbreviation: string; source: string; - sourceType: SourceType; + referenceSourceType: ReferenceSourceType; isActive: IsActive; createdAt: Date; updatedAt: Date; @@ -70,7 +70,7 @@ export interface ReferencePersist { reference: string; abbreviation: string; source: string; - sourceType: SourceType; + referenceSourceType: ReferenceSourceType; } export interface DefinitionPersist {