Implementing validators for Deposit request models (completed)

This commit is contained in:
Thomas Georgios Giannos 2024-01-04 13:31:14 +02:00
parent c056e04a89
commit 0e1a9c88b1
3 changed files with 118 additions and 23 deletions

View File

@ -1,18 +1,31 @@
package eu.eudat.model.persist.deposit; 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.NotEmpty;
import jakarta.validation.constraints.NotNull; 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 { public class DepositAuthenticateRequest {
@NotNull(message = "{validation.empty}")
@NotEmpty(message = "{validation.empty}")
private String repositoryId; private String repositoryId;
@NotNull(message = "{validation.empty}") public static final String _repositoryId = "repositoryId";
@NotEmpty(message = "{validation.empty}")
private String code; private String code;
public static final String _code = "code";
public String getRepositoryId() { public String getRepositoryId() {
return repositoryId; return repositoryId;
} }
@ -26,4 +39,36 @@ public class DepositAuthenticateRequest {
public void setCode(String code) { public void setCode(String code) {
this.code = code; this.code = code;
} }
@Component(DepositAuthenticateRequestValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class DepositAuthenticateRequestValidator extends BaseValidator<DepositAuthenticateRequest> {
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<DepositAuthenticateRequest> modelClass() {
return DepositAuthenticateRequest.class;
}
@Override
protected List<Specification> 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()))
);
}
}
} }

View File

@ -1,26 +1,38 @@
package eu.eudat.model.persist.deposit; 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 gr.cite.tools.fieldset.BaseFieldSet;
import jakarta.validation.constraints.NotEmpty; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import jakarta.validation.constraints.NotNull; 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; import java.util.UUID;
public class DepositRequest { public class DepositRequest {
@NotNull(message = "{validation.empty}")
@NotEmpty(message = "{validation.empty}")
private String repositoryId; private String repositoryId;
@NotNull(message = "{validation.empty}")
@ValidId(message = "{validation.invalidid}") public static final String _repositoryId = "repositoryId";
private UUID dmpId; private UUID dmpId;
public static final String _dmpId = "dmpId";
private String accessToken; private String accessToken;
private BaseFieldSet project; private BaseFieldSet project;
public String getRepositoryId() { public String getRepositoryId() {
return repositoryId; return repositoryId;
} }
public void setRepositoryId(String repositoryId) { public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId; this.repositoryId = repositoryId;
} }
@ -28,6 +40,7 @@ public class DepositRequest {
public UUID getDmpId() { public UUID getDmpId() {
return dmpId; return dmpId;
} }
public void setDmpId(UUID dmpId) { public void setDmpId(UUID dmpId) {
this.dmpId = dmpId; this.dmpId = dmpId;
} }
@ -35,6 +48,7 @@ public class DepositRequest {
public String getAccessToken() { public String getAccessToken() {
return accessToken; return accessToken;
} }
public void setAccessToken(String accessToken) { public void setAccessToken(String accessToken) {
this.accessToken = accessToken; this.accessToken = accessToken;
} }
@ -46,4 +60,36 @@ public class DepositRequest {
public void setProject(BaseFieldSet project) { public void setProject(BaseFieldSet project) {
this.project = project; this.project = project;
} }
@Component(DepositRequestValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class DepositRequestValidator extends BaseValidator<DepositRequest> {
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<DepositRequest> modelClass() {
return DepositRequest.class;
}
@Override
protected List<Specification> 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()))
);
}
}
} }

View File

@ -1,7 +1,7 @@
package eu.eudat.controllers.v2; package eu.eudat.controllers.v2;
import eu.eudat.audit.AuditableAction; import eu.eudat.audit.AuditableAction;
import eu.eudat.authorization.Permission; import eu.eudat.commons.validation.ValidationFilterAnnotation;
import eu.eudat.controllers.BaseController; import eu.eudat.controllers.BaseController;
import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.ApiContext;
import eu.eudat.model.EntityDoi; 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.fieldset.FieldSet;
import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.logging.MapLogEntry;
import gr.cite.tools.validation.MyValidate;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -31,21 +30,24 @@ import java.util.Map;
@CrossOrigin @CrossOrigin
@RequestMapping(value = {"/api/deposit/"}) @RequestMapping(value = {"/api/deposit/"})
public class DepositController extends BaseController { public class DepositController extends BaseController {
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DepositController.class)); private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DepositController.class));
private final AuthorizationService authorizationService; private final AuthorizationService authorizationService;
private final DepositService depositService; private final DepositService depositService;
private final CensorFactory censorFactory; private final CensorFactory censorFactory;
private final AuditService auditService; private final AuditService auditService;
@Autowired @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); super(apiContext);
this.authorizationService = authorizationService; this.authorizationService = authorizationService;
this.depositService = depositService; this.depositService = depositService;
this.censorFactory = censorFactory; this.censorFactory = censorFactory;
this.auditService = auditService; this.auditService = auditService;
} }
@GetMapping("/repositories/available") @GetMapping("/repositories/available")
@ -58,25 +60,27 @@ public class DepositController extends BaseController {
this.auditService.track(AuditableAction.Deposit_GetAvailableRepositories, Map.ofEntries( this.auditService.track(AuditableAction.Deposit_GetAvailableRepositories, Map.ofEntries(
new AbstractMap.SimpleEntry<String, Object>("fields", fieldSet) new AbstractMap.SimpleEntry<String, Object>("fields", fieldSet)
)); ));
//this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action);
return model; return model;
} }
@PostMapping("/get-access-token") @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)); logger.debug(new MapLogEntry("get access token" + DepositAuthenticateRequest.class.getSimpleName()).And("model", model));
String accessToken = this.depositService.authenticate(model); String accessToken = this.depositService.authenticate(model);
this.auditService.track(AuditableAction.Deposit_GetAccessToken, Map.ofEntries( this.auditService.track(AuditableAction.Deposit_GetAccessToken, Map.ofEntries(
new AbstractMap.SimpleEntry<String, Object>("model", model) new AbstractMap.SimpleEntry<String, Object>("model", model)
)); ));
return accessToken; return accessToken;
} }
@PostMapping("/deposit") @PostMapping("/deposit")
@Transactional @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())); logger.debug(new MapLogEntry("persisting" + DepositRequest.class.getSimpleName()).And("model", model).And("fieldSet", model.getProject()));
this.censorFactory.censor(EntityDoiCensor.class).censor(model.getProject(), null); this.censorFactory.censor(EntityDoiCensor.class).censor(model.getProject(), null);
@ -84,7 +88,7 @@ public class DepositController extends BaseController {
this.auditService.track(AuditableAction.Deposit_Deposit, Map.ofEntries( this.auditService.track(AuditableAction.Deposit_Deposit, Map.ofEntries(
new AbstractMap.SimpleEntry<String, Object>("model", model) new AbstractMap.SimpleEntry<String, Object>("model", model)
)); ));
//this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action);
return persisted; return persisted;
} }
@ -96,7 +100,7 @@ public class DepositController extends BaseController {
this.auditService.track(AuditableAction.Deposit_GetLogo, Map.ofEntries( this.auditService.track(AuditableAction.Deposit_GetLogo, Map.ofEntries(
new AbstractMap.SimpleEntry<String, Object>("repositoryId", repositoryId) new AbstractMap.SimpleEntry<String, Object>("repositoryId", repositoryId)
)); ));
//this.auditService.trackIdentity(AuditableAction.IdentityTracking_Action);
return logo; return logo;
} }
} }