From 0e1a9c88b12b25e5cc700f4b6e146a21f43afc2c Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Thu, 4 Jan 2024 13:31:14 +0200 Subject: [PATCH] Implementing validators for Deposit request models (completed) --- .../deposit/DepositAuthenticateRequest.java | 53 ++++++++++++++-- .../model/persist/deposit/DepositRequest.java | 60 ++++++++++++++++--- .../controllers/v2/DepositController.java | 28 +++++---- 3 files changed, 118 insertions(+), 23 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositAuthenticateRequest.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositAuthenticateRequest.java index 9ed8c2ba6..0d160c832 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositAuthenticateRequest.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositAuthenticateRequest.java @@ -1,18 +1,31 @@ package eu.eudat.model.persist.deposit; +import eu.eudat.commons.validation.BaseValidator; +import eu.eudat.commons.validation.specification.Specification; +import eu.eudat.convention.ConventionService; +import eu.eudat.errorcode.ErrorThesaurusProperties; +import eu.eudat.model.persist.ReferencePersist; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; public class DepositAuthenticateRequest { - @NotNull(message = "{validation.empty}") - @NotEmpty(message = "{validation.empty}") private String repositoryId; - @NotNull(message = "{validation.empty}") - @NotEmpty(message = "{validation.empty}") + public static final String _repositoryId = "repositoryId"; + private String code; + public static final String _code = "code"; + public String getRepositoryId() { return repositoryId; } @@ -26,4 +39,36 @@ public class DepositAuthenticateRequest { public void setCode(String code) { this.code = code; } + + @Component(DepositAuthenticateRequestValidator.ValidatorName) + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public static class DepositAuthenticateRequestValidator extends BaseValidator { + + public static final String ValidatorName = "DepositAuthenticateRequestValidator"; + + private final MessageSource messageSource; + + protected DepositAuthenticateRequestValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { + super(conventionService, errors); + this.messageSource = messageSource; + } + + @Override + protected Class modelClass() { + return DepositAuthenticateRequest.class; + } + + @Override + protected List specifications(DepositAuthenticateRequest item) { + return Arrays.asList( + this.spec() + .must(() -> !this.isEmpty(item.getRepositoryId())) + .failOn(DepositAuthenticateRequest._repositoryId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositAuthenticateRequest._repositoryId}, LocaleContextHolder.getLocale())), + this.spec() + .must(() -> !this.isEmpty(item.getCode())) + .failOn(DepositAuthenticateRequest._code).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositAuthenticateRequest._code}, LocaleContextHolder.getLocale())) + ); + } + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java index 76dad069b..03e5f6857 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java @@ -1,26 +1,38 @@ package eu.eudat.model.persist.deposit; -import eu.eudat.commons.validation.old.ValidId; +import eu.eudat.commons.validation.BaseValidator; +import eu.eudat.commons.validation.specification.Specification; +import eu.eudat.convention.ConventionService; +import eu.eudat.errorcode.ErrorThesaurusProperties; import gr.cite.tools.fieldset.BaseFieldSet; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; +import java.util.Arrays; +import java.util.List; import java.util.UUID; public class DepositRequest { - @NotNull(message = "{validation.empty}") - @NotEmpty(message = "{validation.empty}") private String repositoryId; - @NotNull(message = "{validation.empty}") - @ValidId(message = "{validation.invalidid}") + + public static final String _repositoryId = "repositoryId"; + private UUID dmpId; + + public static final String _dmpId = "dmpId"; + private String accessToken; private BaseFieldSet project; + public String getRepositoryId() { return repositoryId; } + public void setRepositoryId(String repositoryId) { this.repositoryId = repositoryId; } @@ -28,6 +40,7 @@ public class DepositRequest { public UUID getDmpId() { return dmpId; } + public void setDmpId(UUID dmpId) { this.dmpId = dmpId; } @@ -35,6 +48,7 @@ public class DepositRequest { public String getAccessToken() { return accessToken; } + public void setAccessToken(String accessToken) { this.accessToken = accessToken; } @@ -46,4 +60,36 @@ public class DepositRequest { public void setProject(BaseFieldSet project) { this.project = project; } + + @Component(DepositRequestValidator.ValidatorName) + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public static class DepositRequestValidator extends BaseValidator { + + public static final String ValidatorName = "DepositRequestValidator"; + + private final MessageSource messageSource; + + protected DepositRequestValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { + super(conventionService, errors); + this.messageSource = messageSource; + } + + @Override + protected Class modelClass() { + return DepositRequest.class; + } + + @Override + protected List specifications(DepositRequest item) { + return Arrays.asList( + this.spec() + .must(() -> !this.isEmpty(item.getRepositoryId())) + .failOn(DepositRequest._repositoryId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._repositoryId}, LocaleContextHolder.getLocale())), + this.spec() + .must(() -> !this.isValidGuid(item.getDmpId())) + .failOn(DepositRequest._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._dmpId}, LocaleContextHolder.getLocale())) + ); + } + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DepositController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DepositController.java index fc51e801f..eed980246 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DepositController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/v2/DepositController.java @@ -1,7 +1,7 @@ package eu.eudat.controllers.v2; import eu.eudat.audit.AuditableAction; -import eu.eudat.authorization.Permission; +import eu.eudat.commons.validation.ValidationFilterAnnotation; import eu.eudat.controllers.BaseController; import eu.eudat.logic.services.ApiContext; import eu.eudat.model.EntityDoi; @@ -17,7 +17,6 @@ import gr.cite.tools.data.censor.CensorFactory; 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.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -31,21 +30,24 @@ import java.util.Map; @CrossOrigin @RequestMapping(value = {"/api/deposit/"}) public class DepositController extends BaseController { + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DepositController.class)); - private final AuthorizationService authorizationService; + private final DepositService depositService; + private final CensorFactory censorFactory; + private final AuditService auditService; @Autowired - public DepositController(ApiContext apiContext, AuthorizationService authorizationService, DepositService depositService, CensorFactory censorFactory, AuditService auditService){ + public DepositController(ApiContext apiContext, AuthorizationService authorizationService, DepositService depositService, CensorFactory censorFactory, AuditService auditService) { super(apiContext); this.authorizationService = authorizationService; this.depositService = depositService; - this.censorFactory = censorFactory; - this.auditService = auditService; + this.censorFactory = censorFactory; + this.auditService = auditService; } @GetMapping("/repositories/available") @@ -58,25 +60,27 @@ public class DepositController extends BaseController { this.auditService.track(AuditableAction.Deposit_GetAvailableRepositories, Map.ofEntries( new AbstractMap.SimpleEntry("fields", fieldSet) )); - //this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action); return model; } @PostMapping("/get-access-token") - public String getAccessToken(@MyValidate @RequestBody DepositAuthenticateRequest model) throws Exception { + @ValidationFilterAnnotation(validator = DepositAuthenticateRequest.DepositAuthenticateRequestValidator.ValidatorName, argumentName = "model") + public String getAccessToken(@RequestBody DepositAuthenticateRequest model) { logger.debug(new MapLogEntry("get access token" + DepositAuthenticateRequest.class.getSimpleName()).And("model", model)); String accessToken = this.depositService.authenticate(model); this.auditService.track(AuditableAction.Deposit_GetAccessToken, Map.ofEntries( new AbstractMap.SimpleEntry("model", model) )); + return accessToken; } @PostMapping("/deposit") @Transactional - public EntityDoi deposit(@MyValidate @RequestBody DepositRequest model) throws Exception { + @ValidationFilterAnnotation(validator = DepositRequest.DepositRequestValidator.ValidatorName, argumentName = "model") + public EntityDoi deposit(@RequestBody DepositRequest model) throws Exception { logger.debug(new MapLogEntry("persisting" + DepositRequest.class.getSimpleName()).And("model", model).And("fieldSet", model.getProject())); this.censorFactory.censor(EntityDoiCensor.class).censor(model.getProject(), null); @@ -84,19 +88,19 @@ public class DepositController extends BaseController { this.auditService.track(AuditableAction.Deposit_Deposit, Map.ofEntries( new AbstractMap.SimpleEntry("model", model) )); - //this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action); + return persisted; } @GetMapping("/repositories/{repositoryId}/logo") public String getLogo(@PathVariable("repositoryId") String repositoryId) { logger.debug(new MapLogEntry("get logo" + DepositConfiguration.class.getSimpleName()).And("repositoryId", repositoryId)); - + String logo = this.depositService.getLogo(repositoryId); this.auditService.track(AuditableAction.Deposit_GetLogo, Map.ofEntries( new AbstractMap.SimpleEntry("repositoryId", repositoryId) )); - //this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action); + return logo; } }