diff --git a/dmp-backend/core/pom.xml b/dmp-backend/core/pom.xml index 6b4369902..742d5372d 100644 --- a/dmp-backend/core/pom.xml +++ b/dmp-backend/core/pom.xml @@ -14,6 +14,13 @@ UTF-8 + + + jakarta.validation + jakarta.validation-api + 2.0.2 + + 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 new file mode 100644 index 000000000..2ff1dfb63 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/audit/AuditableAction.java @@ -0,0 +1,13 @@ +package eu.eudat.audit; + +import gr.cite.tools.logging.EventId; + +public class AuditableAction { + + public static final EventId DescriptionTemplateType_Query = new EventId(1000, "DescriptionTemplateType_Query"); + + public static final EventId DescriptionTemplateType_Persist = new EventId(1001, "DescriptionTemplateType_Persist"); + + public static final EventId DescriptionTemplateType_Delete = new EventId(1002, "DescriptionTemplateType_Delete"); + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/ValidationServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/ValidationServiceImpl.java new file mode 100644 index 000000000..a3695cfe6 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/ValidationServiceImpl.java @@ -0,0 +1,36 @@ +package eu.eudat.commons.validation; + +import eu.eudat.errorcode.ErrorThesaurusProperties; +import gr.cite.tools.exception.MyValidationException; +import gr.cite.tools.validation.BaseValidationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import javax.validation.Validator; +import java.util.List; +import java.util.Map; + +@Service +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class ValidationServiceImpl extends BaseValidationService { + + private ErrorThesaurusProperties errors; + + @Autowired + public ValidationServiceImpl(Validator validator, ErrorThesaurusProperties errors){ + super(validator); + this.errors = errors; + } + + @Override + public void validateForce(T item, Class... groups) { + List>> validationErrors = this.validate(item, groups); + if (validationErrors != null && !validationErrors.isEmpty()) { + throw new MyValidationException(this.errors.getModelValidation().getCode(), + this.errors.getModelValidation().getMessage(), + validationErrors); + } + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/DescriptionTemplateTypeService.java b/dmp-backend/core/src/main/java/eu/eudat/service/DescriptionTemplateTypeService.java index 13e7edd61..4c93f85da 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/DescriptionTemplateTypeService.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/DescriptionTemplateTypeService.java @@ -1,11 +1,13 @@ package eu.eudat.service; +import eu.eudat.audit.AuditableAction; import eu.eudat.commons.enums.DescriptionTemplateTypeStatus; import eu.eudat.data.DescriptionTemplateTypeEntity; import eu.eudat.model.DescriptionTemplateType; import eu.eudat.model.builder.DescriptionTemplateTypeBuilder; import eu.eudat.query.DescriptionTemplateTypeQuery; import eu.eudat.query.lookup.DescriptionTemplateTypeLookup; +import gr.cite.tools.auditing.AuditService; import gr.cite.tools.data.builder.BuilderFactory; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; @@ -28,27 +30,38 @@ public class DescriptionTemplateTypeService { private final PlatformTransactionManager transactionManager; + private final AuditService auditService; + @PersistenceContext private EntityManager entityManager; - public DescriptionTemplateTypeService(ApplicationContext applicationContext, BuilderFactory builderFactory, PlatformTransactionManager platformTransactionManager) { + public DescriptionTemplateTypeService(ApplicationContext applicationContext, BuilderFactory builderFactory, PlatformTransactionManager platformTransactionManager, AuditService auditService) { this.applicationContext = applicationContext; this.builderFactory = builderFactory; this.transactionManager = platformTransactionManager; + this.auditService = auditService; } - public List getAll(DescriptionTemplateTypeLookup lookup) { + public List query(DescriptionTemplateTypeLookup lookup) { DescriptionTemplateTypeQuery query = applicationContext.getBean(DescriptionTemplateTypeQuery.class); - return builderFactory + List results = builderFactory .builder(DescriptionTemplateTypeBuilder.class) .build(lookup.getProject(), query.fromLookup(lookup).collect()); + + auditService.track(AuditableAction.DescriptionTemplateType_Query, "lookup", lookup); + + return results; } - public DescriptionTemplateType getById(UUID id) { + public DescriptionTemplateType get(UUID id) { DescriptionTemplateTypeQuery query = applicationContext.getBean(DescriptionTemplateTypeQuery.class); - return builderFactory + DescriptionTemplateType result = builderFactory .builder(DescriptionTemplateTypeBuilder.class) .build(null, query.ids(id).first()); + + auditService.track(AuditableAction.DescriptionTemplateType_Query, "id", id); + + return result; } public DescriptionTemplateTypeEntity getEntityByName(String name) { @@ -56,7 +69,7 @@ public class DescriptionTemplateTypeService { return query.names(name).first(); } - public DescriptionTemplateType create(DescriptionTemplateType payload) { + public DescriptionTemplateType persist(DescriptionTemplateType payload) { DescriptionTemplateTypeEntity created = new DescriptionTemplateTypeEntity(); created.setId(UUID.randomUUID()); created.setName(payload.getName()); @@ -79,6 +92,8 @@ public class DescriptionTemplateTypeService { throw ex; } + auditService.track(AuditableAction.DescriptionTemplateType_Persist, "persist", payload); + DescriptionTemplateTypeQuery query = applicationContext.getBean(DescriptionTemplateTypeQuery.class); return builderFactory .builder(DescriptionTemplateTypeBuilder.class) @@ -91,6 +106,9 @@ public class DescriptionTemplateTypeService { entity.setStatus(payload.getStatus()); entityManager.merge(entity); entityManager.flush(); + + auditService.track(AuditableAction.DescriptionTemplateType_Persist, "update", payload); + return builderFactory.builder(DescriptionTemplateTypeBuilder.class).build(null, entity); } @@ -101,6 +119,9 @@ public class DescriptionTemplateTypeService { entity.setStatus(DescriptionTemplateTypeStatus.DELETED.getValue()); entityManager.merge(entity); entityManager.flush(); + + auditService.track(AuditableAction.DescriptionTemplateType_Delete, "delete", id); + return true; } diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 5d693e51f..ae9fae260 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -314,6 +314,16 @@ exceptions 2.1.0 + + gr.cite + logging + 2.1.0 + + + gr.cite + validation + 1.0.0 + diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/AppMessageSourceConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/AppMessageSourceConfiguration.java new file mode 100644 index 000000000..d799f1047 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/AppMessageSourceConfiguration.java @@ -0,0 +1,10 @@ +package eu.eudat.configurations; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppMessageSourceConfiguration { + + + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionTemplateTypeV2Controller.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionTemplateTypeV2Controller.java index c067e6496..c38d9c5c7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionTemplateTypeV2Controller.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DescriptionTemplateTypeV2Controller.java @@ -29,19 +29,19 @@ public class DescriptionTemplateTypeV2Controller { this.descriptionTemplateTypeService = descriptionTemplateTypeService; } - @PostMapping("all") - public QueryResult getAll(@RequestBody DescriptionTemplateTypeLookup lookup, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal ignoredPrincipal) { - return extractQueryResultWithCount(descriptionTemplateTypeService::getAll, lookup); + @PostMapping("query") + public QueryResult query(@RequestBody DescriptionTemplateTypeLookup lookup, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal ignoredPrincipal) { + return extractQueryResultWithCount(descriptionTemplateTypeService::query, lookup); } @GetMapping("{id}") public QueryResult get(@PathVariable("id") UUID id, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal ignoredPrincipal) { - return new QueryResult<>(descriptionTemplateTypeService.getById(id)); + return new QueryResult<>(descriptionTemplateTypeService.get(id)); } - @PostMapping("create") - public QueryResult create(@RequestBody DescriptionTemplateType payload, @ClaimedAuthorities(claims = {Authorities.ADMIN}) Principal ignoredPrincipal) { - return new QueryResult<>(descriptionTemplateTypeService.create(payload)); + @PostMapping("persist") + public QueryResult persist(@RequestBody DescriptionTemplateType payload, @ClaimedAuthorities(claims = {Authorities.ADMIN}) Principal ignoredPrincipal) { + return new QueryResult<>(descriptionTemplateTypeService.persist(payload)); } @PostMapping("update") diff --git a/dmp-frontend/src/app/core/services/description-template-type/description-template-type.service.ts b/dmp-frontend/src/app/core/services/description-template-type/description-template-type.service.ts index bacb2c558..0428d4bca 100644 --- a/dmp-frontend/src/app/core/services/description-template-type/description-template-type.service.ts +++ b/dmp-frontend/src/app/core/services/description-template-type/description-template-type.service.ts @@ -15,18 +15,18 @@ export class DescriptionTemplateTypeService { constructor(private http: BaseHttpV2Service, private configurationService: ConfigurationService) {} - getAll(lookup: DescriptionTemplateTypeLookup): Observable> { - const url = `${this.apiBase}/all`; + query(lookup: DescriptionTemplateTypeLookup): Observable> { + const url = `${this.apiBase}/query`; return this.http.post>(url, lookup, { headers: this.headers }); } - getSingle(id: string): Observable> { + get(id: string): Observable> { const url = `${this.apiBase}/${id}`; return this.http.get>(url , { headers: this.headers }); } - create(payload: DescriptionTemplateType): Observable> { - const url = `${this.apiBase}/create`; + persist(payload: DescriptionTemplateType): Observable> { + const url = `${this.apiBase}/persist`; return this.http.post>(url, payload, { headers: this.headers }); } 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 d3ffca7d0..ad53c3431 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 @@ -617,7 +617,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent nameof(x => x.status) ] }; - this.descriptionTemplateTypeService.getAll(lookup).pipe(takeUntil(this._destroyed)) + this.descriptionTemplateTypeService.query(lookup).pipe(takeUntil(this._destroyed)) .subscribe(types => { this.descriptionTemplateTypes = types.items.filter(type => type.status === DescriptionTemplateTypeStatus.Finalized); }); diff --git a/dmp-frontend/src/app/ui/admin/description-types/editor/description-type-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-types/editor/description-type-editor.component.ts index b7f045d96..6dbd92de8 100644 --- a/dmp-frontend/src/app/ui/admin/description-types/editor/description-type-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-types/editor/description-type-editor.component.ts @@ -44,7 +44,7 @@ export class DescriptionTypeEditorComponent extends BaseComponent implements OnI if (this.descriptionTemplateTypeId != null) { this.isNew = false; - this.descriptionTemplateTypeService.getSingle(this.descriptionTemplateTypeId) + this.descriptionTemplateTypeService.get(this.descriptionTemplateTypeId) .pipe(takeUntil(this._destroyed)).subscribe( type => { this.descriptionTypeModel = new DescriptionTypeEditorModel().fromModel(type.items[0]); @@ -84,7 +84,7 @@ export class DescriptionTypeEditorComponent extends BaseComponent implements OnI onSubmit(): void { if (this.isNew) { - this.descriptionTemplateTypeService.create(this.formGroup.value) + this.descriptionTemplateTypeService.persist(this.formGroup.value) .pipe(takeUntil(this._destroyed)) .subscribe( complete => this.onCallbackSuccess(true), diff --git a/dmp-frontend/src/app/ui/admin/description-types/listing/description-types.component.ts b/dmp-frontend/src/app/ui/admin/description-types/listing/description-types.component.ts index bdeb32aa3..9843dbc4b 100644 --- a/dmp-frontend/src/app/ui/admin/description-types/listing/description-types.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-types/listing/description-types.component.ts @@ -152,7 +152,7 @@ export class DescriptionTypesDataSource extends DataSource { return result;