Merge branch 'dmp-refactoring' of https://code-repo.d4science.org/MaDgiK-CITE/argos into dmp-refactoring

This commit is contained in:
Diamantis Tziotzios 2024-04-08 18:59:48 +03:00
commit ab010026a7
10 changed files with 270 additions and 187 deletions

View File

@ -28,16 +28,16 @@ public class UpdateDescriptionTemplatePersist {
this.id = id;
}
private UUID descriptionTemplateGroupId;
private String hash;
public static final String _descriptionTemplateGroupId = "descriptionTemplateGroupId";
public static final String _hash = "hash";
public UUID getDescriptionTemplateGroupId() {
return descriptionTemplateGroupId;
public String getHash() {
return hash;
}
public void setDescriptionTemplateGroupId(UUID descriptionTemplateGroupId) {
this.descriptionTemplateGroupId = descriptionTemplateGroupId;
public void setHash(String hash) {
this.hash = hash;
}
@Component(UpdateDescriptionTemplatePersistValidator.ValidatorName)
@ -61,6 +61,10 @@ public class UpdateDescriptionTemplatePersist {
@Override
protected List<Specification> specifications(UpdateDescriptionTemplatePersist item) {
return Arrays.asList(
this.spec()
.iff(() -> this.isValidGuid(item.getId()))
.must(() -> this.isValidHash(item.getHash()))
.failOn(UpdateDescriptionTemplatePersist._hash).failWith(messageSource.getMessage("Validation_Required", new Object[]{UpdateDescriptionTemplatePersist._hash}, LocaleContextHolder.getLocale())),
this.spec()
.must(() -> this.isValidGuid(item.getId()))
.failOn(UpdateDescriptionTemplatePersist._id)

View File

@ -10,6 +10,7 @@ import gr.cite.tools.exception.MyForbiddenException;
import gr.cite.tools.exception.MyNotFoundException;
import gr.cite.tools.exception.MyValidationException;
import gr.cite.tools.fieldset.FieldSet;
import jakarta.xml.bind.JAXBException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;
@ -37,5 +38,5 @@ public interface DescriptionService {
StorageFile uploadFieldFile(DescriptionFieldFilePersist model, MultipartFile file, FieldSet fields) throws IOException;
StorageFileEntity getFieldFile(UUID descriptionId, UUID storageFileId);
void updateDescriptionTemplate(UpdateDescriptionTemplatePersist model) throws InvalidApplicationException, IOException;
void updateDescriptionTemplate(UpdateDescriptionTemplatePersist model) throws InvalidApplicationException, IOException, JAXBException;
}

View File

@ -52,6 +52,7 @@ import gr.cite.tools.fieldset.FieldSet;
import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry;
import gr.cite.tools.validation.ValidatorFactory;
import jakarta.xml.bind.JAXBException;
import org.apache.commons.io.FilenameUtils;
import org.jetbrains.annotations.NotNull;
import org.slf4j.LoggerFactory;
@ -236,7 +237,7 @@ public class DescriptionServiceImpl implements DescriptionService {
return this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(BaseFieldSet.build(fields, Description._id), data);
}
@Override
public void updateDescriptionTemplate(UpdateDescriptionTemplatePersist model) throws InvalidApplicationException, IOException {
public void updateDescriptionTemplate(UpdateDescriptionTemplatePersist model) throws InvalidApplicationException, IOException, JAXBException {
logger.debug(new MapLogEntry("update description template").And("model", model));
this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(model.getId())), Permission.EditDescription);
@ -269,6 +270,7 @@ public class DescriptionServiceImpl implements DescriptionService {
eu.eudat.commons.types.descriptiontemplate.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(eu.eudat.commons.types.descriptiontemplate.DefinitionEntity.class, latestVersionDescriptionTemplates.getFirst().getDefinition());
PropertyDefinitionEntity propertyDefinition = this.xmlHandlingService.fromXmlSafe(PropertyDefinitionEntity.class, data.getProperties());
data.setProperties(this.xmlHandlingService.toXml(this.cleanPropertyDefinitionEntity(propertyDefinition, definition)));
data.setUpdatedAt(Instant.now());
this.entityManager.merge(data);
@ -304,6 +306,50 @@ public class DescriptionServiceImpl implements DescriptionService {
}
}
private @NotNull PropertyDefinitionEntity cleanPropertyDefinitionEntity(PropertyDefinitionEntity data, eu.eudat.commons.types.descriptiontemplate.DefinitionEntity definition) {
PropertyDefinitionEntity cleanData = new PropertyDefinitionEntity();
if (data == null) return cleanData;
if (data.getFieldSets() != null && !data.getFieldSets().isEmpty()){
cleanData.setFieldSets(new HashMap<>());
for (String key: data.getFieldSets().keySet()) {
FieldSetEntity fieldSetEntity = definition != null ? definition.getFieldSetById(key).stream().findFirst().orElse(null) : null;
if (fieldSetEntity != null){
cleanData.getFieldSets().put(key, this.cleanPropertyDefinitionFieldSetEntity(data.getFieldSets().get(key), fieldSetEntity));
}
}
}
return cleanData;
}
private @NotNull PropertyDefinitionFieldSetEntity cleanPropertyDefinitionFieldSetEntity(PropertyDefinitionFieldSetEntity persist, FieldSetEntity fieldSetEntity) {
PropertyDefinitionFieldSetEntity cleanData = new PropertyDefinitionFieldSetEntity();
if (persist == null) return cleanData;
if (!this.conventionService.isListNullOrEmpty(persist.getItems())){
cleanData.setItems(new ArrayList<>());
for (PropertyDefinitionFieldSetItemEntity itemsPersist: persist.getItems()) {
cleanData.getItems().add(this.cleanPropertyDefinitionFieldSetItemEntity(itemsPersist, fieldSetEntity));
}
}
return cleanData;
}
private @NotNull PropertyDefinitionFieldSetItemEntity cleanPropertyDefinitionFieldSetItemEntity(PropertyDefinitionFieldSetItemEntity data, FieldSetEntity fieldSetEntity) {
PropertyDefinitionFieldSetItemEntity cleanData = new PropertyDefinitionFieldSetItemEntity();
if (data == null) return cleanData;
if (data.getFields() != null && !data.getFields().isEmpty()){
cleanData.setOrdinal(data.getOrdinal());
cleanData.setComment(data.getComment());
cleanData.setFields(new HashMap<>());
for (String key: data.getFields().keySet()) {
eu.eudat.commons.types.descriptiontemplate.FieldEntity fieldEntity = fieldSetEntity != null ? fieldSetEntity.getFieldById(key).stream().findFirst().orElse(null) : null;
if (fieldEntity != null){
cleanData.getFields().put(key,data.getFields().get(key));
}
}
}
return cleanData;
}
private void createDescriptionNotificationEvent(DescriptionEntity description, UserEntity user, NotificationContactType type) throws InvalidApplicationException {
NotifyIntegrationEvent event = new NotifyIntegrationEvent();
event.setUserId(this.userScope.getUserId());

View File

@ -35,6 +35,7 @@ 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.xml.bind.JAXBException;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
@ -272,7 +273,7 @@ public class DescriptionController {
@PostMapping("update-description-template")
@Transactional
@ValidationFilterAnnotation(validator = UpdateDescriptionTemplatePersist.UpdateDescriptionTemplatePersistValidator.ValidatorName, argumentName = "model")
public Boolean updateDescriptionTemplate(@RequestBody UpdateDescriptionTemplatePersist model) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, IOException {
public Boolean updateDescriptionTemplate(@RequestBody UpdateDescriptionTemplatePersist model) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, IOException, JAXBException {
logger.debug(new MapLogEntry("update description template" + Description.class.getSimpleName()).And("model", model));
this.descriptionService.updateDescriptionTemplate(model);

View File

@ -151,5 +151,5 @@ export interface DescriptionSectionPermissionResolver {
export interface UpdateDescriptionTemplatePersist {
id: Guid;
descriptionTemplateGroupId: Guid;
hash?: string;
}

View File

@ -1,23 +1,32 @@
<div class="col-md-12 d-flex justify-content-center" *ngIf="listingItems == null">
<div class="container-fluid">
<div class="row">
<div class="col-md-12 d-flex justify-content-center" *ngIf="listingItems == null">
<span class="empty-list">{{'DMP-LISTING.EMPTY-LIST' | translate}}</span>
</div>
<div *ngIf="listingItems != null" id="results" #results>
<div class="d-flex flex-direction-row pt-4">
</div>
<div *ngIf="listingItems != null" id="results" class="col-12" #results>
<div class="row pt-4">
<!-- Sort by -->
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
<mat-form-field appearance="outline" class="sort-form col-auto">
<div class="col-12 col-xl-auto d-flex align-items-center">
<span class="mb-4">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
</div>
<div class="col-12 col-xl-auto">
<mat-form-field appearance="outline" class="sort-form w-100">
<mat-select placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
<mat-option [value]="order.UpdatedAt">{{enumUtils.toRecentActivityOrderString(order.UpdatedAt)}}</mat-option>
<mat-option [value]="order.Label">{{enumUtils.toRecentActivityOrderString(order.Label)}}</mat-option>
</mat-select>
</mat-form-field>
</div>
<!-- End of Sort by -->
<!-- Search Filter-->
<mat-form-field appearance="outline" class="search-form ml-auto col-auto pr-0" floatLabel="never">
<div class="col-12 col-xl-auto ml-auto">
<mat-form-field appearance="outline" class="search-form w-100" floatLabel="never">
<mat-icon matSuffix>search</mat-icon>
<input matInput placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>
</mat-form-field>
</div>
<!-- End of Search Filter -->
</div>
<div *ngIf="listingItems && listingItems.length > 0 && pageSize > pageLessSize" class="d-flex justify-content-center">
@ -33,4 +42,6 @@
<div *ngIf="listingItems && listingItems.length > 0 && (listingItems.length >= startIndex + pageSize)" class="d-flex justify-content-center">
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
</div>
</div>
</div>
</div>

View File

@ -6,10 +6,10 @@
<div *ngIf="listingItems != null" id="results" class="col-12" #results>
<div class="row pt-4">
<!-- Sort by -->
<div class="col-12 col-xl-auto">
<span class="mb-1">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
<div class="col-12 col-xl-auto d-flex align-items-center">
<span class="mb-4">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
</div>
<div class="col-12 col-xl">
<div class="col-12 col-xl-auto">
<mat-form-field appearance="outline" class="w-100 sort-form">
<mat-select placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
<mat-option *ngIf="!publicMode" [value]="order.UpdatedAt">{{enumUtils.toRecentActivityOrderString(order.UpdatedAt)}}</mat-option>
@ -21,8 +21,8 @@
</div>
<!-- End of Sort by -->
<!-- Search Filter-->
<div class="col-12 col-xl">
<mat-form-field appearance="outline" class="w-100 search-form ml-auto pr-0" floatLabel="never">
<div class="col-12 col-xl-auto ml-auto">
<mat-form-field appearance="outline" class="w-100 search-form pr-0" floatLabel="never">
<mat-icon matSuffix>search</mat-icon>
<input matInput placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>

View File

@ -1,8 +1,13 @@
<div *ngIf="listingItems != null" id="descriptions" #descriptions>
<div class="d-flex flex-direction-row pt-4">
<div class="container-fluid">
<div class="row">
<div *ngIf="listingItems != null" id="descriptions" class="col-12" #descriptions>
<div class="row pt-4">
<!-- Sort by -->
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
<mat-form-field appearance="outline" class="sort-form col-auto">
<div class="col-12 col-xl-auto d-flex align-items-center">
<span class="mb-4">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
</div>
<div class="col-12 col-xl-auto">
<mat-form-field appearance="outline" class="sort-form w-100">
<mat-select placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
<mat-option *ngIf="!publicMode" [value]="order.UpdatedAt">{{enumUtils.toRecentActivityOrderString(order.UpdatedAt)}}</mat-option>
<!-- <mat-option *ngIf="publicMode" [value]="order.DATASETPUBLISHED">{{enumUtils.toRecentActivityOrderString(order.DATASETPUBLISHED)}}</mat-option> -->
@ -11,13 +16,16 @@
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
</mat-select>
</mat-form-field>
</div>
<!-- End of Sort by -->
<!-- Search Filter-->
<mat-form-field appearance="outline" class="search-form ml-auto col-auto pr-0" floatLabel="never">
<div class="col-12 col-xl-auto ml-auto">
<mat-form-field appearance="outline" class="search-form w-100" floatLabel="never">
<mat-icon matSuffix>search</mat-icon>
<input matInput placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>
</mat-form-field>
</div>
<!-- End of Search Filter -->
</div>
<div *ngIf="listingItems && listingItems.length > 0 && pageSize > pageLessSize" class="d-flex justify-content-center">
@ -32,4 +40,6 @@
<div *ngIf="listingItems && listingItems.length > 0 && listingItems.length >= pageSize" class="d-flex justify-content-center">
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
</div>
</div>
</div>
</div>

View File

@ -1,8 +1,13 @@
<div *ngIf="listingItems != null" id="dmps" #dmps>
<div class="d-flex flex-direction-row pt-4">
<div class="container-fluid">
<div class="row">
<div *ngIf="listingItems != null" id="dmps" class="col-12" #dmps>
<div class="row pt-4">
<!-- Sort by -->
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
<mat-form-field appearance="outline" class="sort-form col-auto">
<div class="col-12 col-xl-auto d-flex align-items-center">
<span class="mb-4">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
</div>
<div class="col-12 col-xl-auto">
<mat-form-field appearance="outline" class="sort-form w-100">
<mat-select placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
<mat-option *ngIf="!publicMode" [value]="order.UpdatedAt">{{enumUtils.toRecentActivityOrderString(order.UpdatedAt)}}</mat-option>
<!-- <mat-option *ngIf="publicMode" [value]="order.PUBLISHED">{{enumUtils.toRecentActivityOrderString(order.PUBLISHED)}}</mat-option> -->
@ -11,13 +16,16 @@
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
</mat-select>
</mat-form-field>
</div>
<!-- End of Sort by -->
<!-- Search Filter-->
<mat-form-field appearance="outline" class="search-form ml-auto col-auto pr-0" floatLabel="never">
<div class="col-12 col-xl-auto ml-auto">
<mat-form-field appearance="outline" class="search-form w-100" floatLabel="never">
<mat-icon matSuffix>search</mat-icon>
<input matInput placeholder="{{'GENERAL.CRITERIA.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>
</mat-form-field>
</div>
<!-- End of Search Filter -->
</div>
<div *ngIf="listingItems && listingItems.length > 0 && pageSize > pageLessSize" class="d-flex justify-content-center">
@ -104,4 +112,6 @@
<div *ngIf="listingItems && listingItems.length > 0 && listingItems.length >= pageSize" class="d-flex justify-content-center">
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
</div>
</div>
</div>
</div>

View File

@ -65,7 +65,7 @@ export class DescriptionBaseFieldsEditorComponent extends BaseComponent {
if(result) {
this.descriptionService.updateDescriptionTemplate({
id: this.description.id,
descriptionTemplateGroupId: this.description.descriptionTemplate.groupId
hash: this.description.hash
})
.subscribe(
result => {