From 8426d491579f580afe11e3e108832a1f0278b873 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Thu, 2 May 2024 17:37:17 +0300 Subject: [PATCH] bug fixes --- .../DescriptionTemplateController.java | 50 ++++++++++------- .../PrefillingSourceController.java | 56 ++++++++++--------- .../resources/config/field-set-expander.yml | 53 +++++++++++++++++- .../editor/description-editor.resolver.ts | 12 +++- .../prefill-description.component.ts | 2 +- 5 files changed, 120 insertions(+), 53 deletions(-) diff --git a/backend/web/src/main/java/org/opencdmp/controllers/DescriptionTemplateController.java b/backend/web/src/main/java/org/opencdmp/controllers/DescriptionTemplateController.java index 9b71ee9ec..42b5104e0 100644 --- a/backend/web/src/main/java/org/opencdmp/controllers/DescriptionTemplateController.java +++ b/backend/web/src/main/java/org/opencdmp/controllers/DescriptionTemplateController.java @@ -1,10 +1,21 @@ package org.opencdmp.controllers; import com.fasterxml.jackson.core.JsonProcessingException; +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.BaseFieldSet; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.logging.MapLogEntry; +import gr.cite.tools.validation.ValidationFilterAnnotation; +import jakarta.xml.bind.JAXBException; import org.opencdmp.audit.AuditableAction; import org.opencdmp.authorization.AuthorizationFlags; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.validation.ValidationFilterAnnotation; import org.opencdmp.data.DescriptionTemplateEntity; import org.opencdmp.model.DescriptionTemplate; import org.opencdmp.model.DmpBlueprint; @@ -17,17 +28,7 @@ import org.opencdmp.model.result.QueryResult; import org.opencdmp.query.DescriptionTemplateQuery; import org.opencdmp.query.lookup.DescriptionTemplateLookup; import org.opencdmp.service.descriptiontemplate.DescriptionTemplateService; -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.xml.bind.JAXBException; +import org.opencdmp.service.fieldsetexpander.FieldSetExpanderService; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -63,20 +64,22 @@ public class DescriptionTemplateController { private final QueryFactory queryFactory; private final MessageSource messageSource; + private final FieldSetExpanderService fieldSetExpanderService; public DescriptionTemplateController( - BuilderFactory builderFactory, - AuditService auditService, - DescriptionTemplateService descriptionTemplateTypeService, - CensorFactory censorFactory, - QueryFactory queryFactory, - MessageSource messageSource) { + BuilderFactory builderFactory, + AuditService auditService, + DescriptionTemplateService descriptionTemplateTypeService, + CensorFactory censorFactory, + QueryFactory queryFactory, + MessageSource messageSource, FieldSetExpanderService fieldSetExpanderService) { this.builderFactory = builderFactory; this.auditService = auditService; this.descriptionTemplateTypeService = descriptionTemplateTypeService; this.censorFactory = censorFactory; this.queryFactory = queryFactory; this.messageSource = messageSource; + this.fieldSetExpanderService = fieldSetExpanderService; } @PostMapping("query") @@ -99,13 +102,14 @@ public class DescriptionTemplateController { @GetMapping("{id}") public DescriptionTemplate get(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { logger.debug(new MapLogEntry("retrieving" + DescriptionTemplate.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(DescriptionTemplateCensor.class).censor(fieldSet, null); DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.DescriptionTemplate_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), @@ -120,6 +124,7 @@ public class DescriptionTemplateController { @ValidationFilterAnnotation(validator = DescriptionTemplatePersist.DescriptionTemplatePersistValidator.ValidatorName, argumentName = "model") public DescriptionTemplate persist(@RequestBody DescriptionTemplatePersist model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException { logger.debug(new MapLogEntry("persisting" + DescriptionTemplate.class.getSimpleName()).And("model", model).And("fieldSet", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); new BaseFieldSet(fieldSet.getFields()).ensure(DescriptionTemplate._id); DescriptionTemplate persisted = this.descriptionTemplateTypeService.persist(model, fieldSet); @@ -144,6 +149,7 @@ public class DescriptionTemplateController { @GetMapping("clone/{id}") public DescriptionTemplate buildClone(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { logger.debug(new MapLogEntry("clone" + DmpBlueprint.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(DmpBlueprintCensor.class).censor(fieldSet, null); @@ -162,6 +168,7 @@ public class DescriptionTemplateController { @ValidationFilterAnnotation(validator = NewVersionDescriptionTemplatePersist.NewVersionDescriptionTemplatePersistValidator.ValidatorName, argumentName = "model") public DescriptionTemplate createNewVersion(@RequestBody NewVersionDescriptionTemplatePersist model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException { logger.debug(new MapLogEntry("persisting" + NewVersionDescriptionTemplatePersist.class.getSimpleName()).And("model", model).And("fieldSet", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); DescriptionTemplate persisted = this.descriptionTemplateTypeService.createNewVersion(model, fieldSet); this.auditService.track(AuditableAction.DescriptionTemplate_PersistNewVersion, Map.ofEntries( @@ -172,7 +179,7 @@ public class DescriptionTemplateController { return persisted; } - @RequestMapping(method = RequestMethod.GET, value = {"/xml/export/{id}"}, produces = "application/xml") + @RequestMapping(method = RequestMethod.GET, value = "/xml/export/{id}", produces = "application/xml") public @ResponseBody ResponseEntity getXml(@PathVariable UUID id) throws JAXBException, ParserConfigurationException, IOException, TransformerException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { logger.debug(new MapLogEntry("export" + DescriptionTemplate.class.getSimpleName()).And("id", id)); @@ -188,6 +195,7 @@ public class DescriptionTemplateController { @RequestMapping(method = RequestMethod.POST, value = {"/xml/import/{id}", "/xml/import"}) public DescriptionTemplate importXml(@RequestParam("file") MultipartFile file, @PathVariable(value = "id", required = false) UUID id, FieldSet fieldSet) throws IOException, JAXBException, InvalidApplicationException, ParserConfigurationException, TransformerException, InstantiationException, IllegalAccessException, SAXException { logger.debug(new MapLogEntry("import" + DescriptionTemplate.class.getSimpleName()).And("file", file).And("id", id)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(DescriptionTemplateCensor.class).censor(fieldSet, null); diff --git a/backend/web/src/main/java/org/opencdmp/controllers/PrefillingSourceController.java b/backend/web/src/main/java/org/opencdmp/controllers/PrefillingSourceController.java index 49c186aec..218b8a1ad 100644 --- a/backend/web/src/main/java/org/opencdmp/controllers/PrefillingSourceController.java +++ b/backend/web/src/main/java/org/opencdmp/controllers/PrefillingSourceController.java @@ -1,23 +1,6 @@ package org.opencdmp.controllers; import com.fasterxml.jackson.core.JsonProcessingException; -import org.opencdmp.audit.AuditableAction; -import org.opencdmp.authorization.AuthorizationFlags; -import org.opencdmp.data.PrefillingSourceEntity; -import org.opencdmp.model.Description; -import org.opencdmp.model.Prefilling; -import org.opencdmp.model.PrefillingSource; -import org.opencdmp.model.builder.PrefillingSourceBuilder; -import org.opencdmp.model.censorship.DescriptionCensor; -import org.opencdmp.model.censorship.PrefillingCensor; -import org.opencdmp.model.censorship.PrefillingSourceCensor; -import org.opencdmp.model.persist.PrefillingSearchRequest; -import org.opencdmp.model.persist.DescriptionPrefillingRequest; -import org.opencdmp.model.persist.PrefillingSourcePersist; -import org.opencdmp.model.result.QueryResult; -import org.opencdmp.query.PrefillingSourceQuery; -import org.opencdmp.query.lookup.PrefillingSourceLookup; -import org.opencdmp.service.prefillingsource.PrefillingSourceService; import gr.cite.tools.auditing.AuditService; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.censor.CensorFactory; @@ -31,6 +14,24 @@ import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.validation.ValidationFilterAnnotation; import jakarta.transaction.Transactional; import jakarta.xml.bind.JAXBException; +import org.opencdmp.audit.AuditableAction; +import org.opencdmp.authorization.AuthorizationFlags; +import org.opencdmp.data.PrefillingSourceEntity; +import org.opencdmp.model.Description; +import org.opencdmp.model.Prefilling; +import org.opencdmp.model.PrefillingSource; +import org.opencdmp.model.builder.PrefillingSourceBuilder; +import org.opencdmp.model.censorship.DescriptionCensor; +import org.opencdmp.model.censorship.PrefillingCensor; +import org.opencdmp.model.censorship.PrefillingSourceCensor; +import org.opencdmp.model.persist.DescriptionPrefillingRequest; +import org.opencdmp.model.persist.PrefillingSearchRequest; +import org.opencdmp.model.persist.PrefillingSourcePersist; +import org.opencdmp.model.result.QueryResult; +import org.opencdmp.query.PrefillingSourceQuery; +import org.opencdmp.query.lookup.PrefillingSourceLookup; +import org.opencdmp.service.fieldsetexpander.FieldSetExpanderService; +import org.opencdmp.service.prefillingsource.PrefillingSourceService; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -47,7 +48,7 @@ import java.util.Map; import java.util.UUID; @RestController -@RequestMapping(path = {"api/prefilling-source"}) +@RequestMapping(path = "api/prefilling-source") public class PrefillingSourceController { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(PrefillingSourceController.class)); @@ -61,23 +62,23 @@ public class PrefillingSourceController { private final QueryFactory queryFactory; private final MessageSource messageSource; - - private final PrefillingSourceService prefillingSourceService; + private final FieldSetExpanderService fieldSetExpanderService; @Autowired public PrefillingSourceController( - BuilderFactory builderFactory, - AuditService auditService, - CensorFactory censorFactory, - QueryFactory queryFactory, - MessageSource messageSource, PrefillingSourceService prefillingSourceService) { + BuilderFactory builderFactory, + AuditService auditService, + CensorFactory censorFactory, + QueryFactory queryFactory, + MessageSource messageSource, PrefillingSourceService prefillingSourceService, FieldSetExpanderService fieldSetExpanderService) { this.builderFactory = builderFactory; this.auditService = auditService; this.censorFactory = censorFactory; this.queryFactory = queryFactory; this.messageSource = messageSource; this.prefillingSourceService = prefillingSourceService; + this.fieldSetExpanderService = fieldSetExpanderService; } @PostMapping("query") @@ -99,13 +100,14 @@ public class PrefillingSourceController { @GetMapping("{id}") public PrefillingSource get(@PathVariable("id") UUID id, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException { logger.debug(new MapLogEntry("retrieving" + PrefillingSource.class.getSimpleName()).And("id", id).And("fields", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(PrefillingSourceCensor.class).censor(fieldSet, null); PrefillingSourceQuery query = this.queryFactory.query(PrefillingSourceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); PrefillingSource model = this.builderFactory.builder(PrefillingSourceBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, PrefillingSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, PrefillingSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.PrefillingSource_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), @@ -120,6 +122,7 @@ public class PrefillingSourceController { @ValidationFilterAnnotation(validator = PrefillingSourcePersist.PrefillingSourcePersistValidator.ValidatorName, argumentName = "model") public PrefillingSource persist(@RequestBody PrefillingSourcePersist model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, JsonProcessingException, InvalidApplicationException { logger.debug(new MapLogEntry("persisting" + PrefillingSource.class.getSimpleName()).And("model", model).And("fieldSet", fieldSet)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(PrefillingSourceCensor.class).censor(fieldSet, null); PrefillingSource persisted = this.prefillingSourceService.persist(model, fieldSet); @@ -162,6 +165,7 @@ public class PrefillingSourceController { @ValidationFilterAnnotation(validator = DescriptionPrefillingRequest.DescriptionProfilingRequestValidator.ValidatorName, argumentName = "model") public Description generate(@RequestBody DescriptionPrefillingRequest model, FieldSet fieldSet) throws MyApplicationException, MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { logger.debug(new MapLogEntry("persisting" + Prefilling.class.getSimpleName()).And("model", model)); + fieldSet = this.fieldSetExpanderService.expand(fieldSet); this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null); diff --git a/backend/web/src/main/resources/config/field-set-expander.yml b/backend/web/src/main/resources/config/field-set-expander.yml index bec2f561a..f96d15cc7 100644 --- a/backend/web/src/main/resources/config/field-set-expander.yml +++ b/backend/web/src/main/resources/config/field-set-expander.yml @@ -1,6 +1,6 @@ fieldSetExpander: mappings: - - key: DescriptionEditorDescriptionTemplateLookupFields + - key: DescriptionEditorDescriptionTemplateForDescriptionLookupFields fields: - descriptionTemplate.id - descriptionTemplate.label @@ -50,4 +50,53 @@ fieldSetExpander: - descriptionTemplate.definition.pages.sections.fieldSets.fields.data.types.value - descriptionTemplate.definition.pages.sections.fieldSets.fields.data.referenceType.id - descriptionTemplate.definition.pages.sections.fieldSets.fields.data.referenceType.name - \ No newline at end of file + - key: DescriptionEditorDescriptionTemplateLookupFields + fields: + - id + - label + - version + - versionStatus + - groupId + - isActive + - definition.pages.id + - definition.pages.ordinal + - definition.pages.title + - definition.pages.sections.id + - definition.pages.sections.ordinal + - definition.pages.sections.title + - definition.pages.sections.description + - definition.pages.sections.sections + - definition.pages.sections.fieldSets.id + - definition.pages.sections.fieldSets.ordinal + - definition.pages.sections.fieldSets.title + - definition.pages.sections.fieldSets.description + - definition.pages.sections.fieldSets.extendedDescription + - definition.pages.sections.fieldSets.additionalInformation + - definition.pages.sections.fieldSets.hasCommentField + - definition.pages.sections.fieldSets.hasMultiplicity + - definition.pages.sections.fieldSets.multiplicity.min + - definition.pages.sections.fieldSets.multiplicity.max + - definition.pages.sections.fieldSets.multiplicity.placeholder + - definition.pages.sections.fieldSets.multiplicity.tableView + - definition.pages.sections.fieldSets.fields.id + - definition.pages.sections.fieldSets.fields.defaultValue.textValue + - definition.pages.sections.fieldSets.fields.defaultValue.textListValue + - definition.pages.sections.fieldSets.fields.defaultValue.dateValue + - definition.pages.sections.fieldSets.fields.defaultValue.booleanValue + - definition.pages.sections.fieldSets.fields.validations + - definition.pages.sections.fieldSets.fields.visibilityRules.target + - definition.pages.sections.fieldSets.fields.visibilityRules.textValue + - definition.pages.sections.fieldSets.fields.visibilityRules.textListValue + - definition.pages.sections.fieldSets.fields.visibilityRules.dateValue + - definition.pages.sections.fieldSets.fields.visibilityRules.booleanValue + - definition.pages.sections.fieldSets.fields.data.label + - definition.pages.sections.fieldSets.fields.data.fieldType + - definition.pages.sections.fieldSets.fields.data.options.label + - definition.pages.sections.fieldSets.fields.data.options.value + - definition.pages.sections.fieldSets.fields.data.multipleSelect + - definition.pages.sections.fieldSets.fields.data.type + - definition.pages.sections.fieldSets.fields.data.maxFileSizeInMB + - definition.pages.sections.fieldSets.fields.data.types.label + - definition.pages.sections.fieldSets.fields.data.types.value + - definition.pages.sections.fieldSets.fields.data.referenceType.id + - definition.pages.sections.fieldSets.fields.data.referenceType.name \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts b/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts index 482b8f5c1..6353213ab 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts @@ -32,14 +32,14 @@ export class DescriptionEditorResolver extends BaseEditorResolver { return [ ...DescriptionEditorResolver.descriptionLookupFields(), ...DescriptionEditorResolver.dmpLookupFields(nameof(x => x.dmp)), - ...DescriptionEditorResolver.descriptionTemplateLookupFields(nameof(x => x.descriptionTemplate)), + ...DescriptionEditorResolver.descriptionTemplateLookupFieldsForDescrption(), ] } public static cloneLookupFields(): string[] { return [ ...DescriptionEditorResolver.descriptionLookupFields(), - ...DescriptionEditorResolver.descriptionTemplateLookupFields(nameof(x => x.descriptionTemplate)), + ...DescriptionEditorResolver.descriptionTemplateLookupFieldsForDescrption(), ] } @@ -94,7 +94,13 @@ export class DescriptionEditorResolver extends BaseEditorResolver { ] } - public static descriptionTemplateLookupFields(prefix?: string): string[] { + public static descriptionTemplateLookupFieldsForDescrption(): string[] { + return [ + "DescriptionEditorDescriptionTemplateForDescriptionLookupFields" + ] + } + + public static descriptionTemplateLookupFields(): string[] { return [ "DescriptionEditorDescriptionTemplateLookupFields" ] diff --git a/dmp-frontend/src/app/ui/description/editor/prefill-description/prefill-description.component.ts b/dmp-frontend/src/app/ui/description/editor/prefill-description/prefill-description.component.ts index 06f9686f1..7b299552a 100644 --- a/dmp-frontend/src/app/ui/description/editor/prefill-description/prefill-description.component.ts +++ b/dmp-frontend/src/app/ui/description/editor/prefill-description/prefill-description.component.ts @@ -86,7 +86,7 @@ export class PrefillDescriptionDialogComponent extends BaseComponent implements next() { const formData = this.formService.getValue(this.prefillForm.value) as DescriptionPrefillingRequest; - this.prefillingSourceService.generate(formData, DescriptionEditorResolver.descriptionTemplateLookupFields(nameof(x => x.descriptionTemplate))) + this.prefillingSourceService.generate(formData, DescriptionEditorResolver.descriptionTemplateLookupFieldsForDescrption()) .pipe(takeUntil(this._destroyed)).subscribe(description => { if (description) { this.closeDialog(description);