diff --git a/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImpl.java b/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImpl.java index 8c01262..1014498 100644 --- a/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImpl.java +++ b/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImpl.java @@ -36,7 +36,6 @@ import uk.gov.companieshouse.logging.Logger; import uk.gov.companieshouse.patch.model.PatchResult; import uk.gov.companieshouse.pscverificationapi.controller.PscVerificationController; -import uk.gov.companieshouse.pscverificationapi.enumerations.PscType; import uk.gov.companieshouse.pscverificationapi.error.RetrievalFailureReason; import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceNotFoundException; import uk.gov.companieshouse.pscverificationapi.exception.InvalidFilingException; @@ -46,8 +45,6 @@ import uk.gov.companieshouse.pscverificationapi.model.mapper.PscVerificationMapper; import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService; import uk.gov.companieshouse.pscverificationapi.service.TransactionService; -import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService; -import uk.gov.companieshouse.pscverificationapi.validator.VerificationValidationContext; import uk.gov.companieshouse.sdk.manager.ApiSdkManager; @RestController @@ -61,16 +58,14 @@ public class PscVerificationControllerImpl implements PscVerificationController private final TransactionService transactionService; private final PscVerificationService pscVerificationService; - private final VerificationValidationService validatorService; private final PscVerificationMapper filingMapper; private final Clock clock; private final Logger logger; public PscVerificationControllerImpl(final TransactionService transactionService, - final PscVerificationService pscVerificationService, final VerificationValidationService validatorService, PscVerificationMapper filingMapper, final Clock clock, final Logger logger) { + final PscVerificationService pscVerificationService, PscVerificationMapper filingMapper, final Clock clock, final Logger logger) { this.transactionService = transactionService; this.pscVerificationService = pscVerificationService; - this.validatorService = validatorService; this.filingMapper = filingMapper; this.clock = clock; this.logger = logger; @@ -90,23 +85,11 @@ public ResponseEntity createPscVerification( logMap.put("method", request.getMethod()); logger.debugRequest(request, "POST", logMap); - final var validationErrors = Optional.ofNullable(result) - .map(Errors::getFieldErrors).map(ArrayList::new) - .orElseGet(ArrayList::new); - Optional.ofNullable(result).ifPresent(PscVerificationControllerImpl::checkBindingErrors); final var requestTransaction = getTransaction(transId, transaction, logMap, getPassthroughHeader(request)); - validatorService.validate( - new VerificationValidationContext(data, validationErrors, transaction, PscType.INDIVIDUAL, - getPassthroughHeader(request))); - - if (!validationErrors.isEmpty()) { - throw new InvalidFilingException(validationErrors); - } - final var entity = filingMapper.toEntity(data); final var savedEntity = saveFilingWithLinks(entity, transId, request, logMap); diff --git a/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImpl.java b/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImpl.java index 378fe53..c1e235d 100644 --- a/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImpl.java +++ b/src/main/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImpl.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import uk.gov.companieshouse.api.model.transaction.Transaction; @@ -17,12 +16,15 @@ import uk.gov.companieshouse.api.model.validationstatus.ValidationStatusResponse; import uk.gov.companieshouse.logging.Logger; import uk.gov.companieshouse.pscverificationapi.controller.ValidationStatusController; +import uk.gov.companieshouse.pscverificationapi.enumerations.PscType; import uk.gov.companieshouse.pscverificationapi.error.ErrorType; import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceNotFoundException; import uk.gov.companieshouse.pscverificationapi.helper.LogMapHelper; import uk.gov.companieshouse.pscverificationapi.mapper.ErrorMapper; import uk.gov.companieshouse.pscverificationapi.model.entity.PscVerification; import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService; +import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService; +import uk.gov.companieshouse.pscverificationapi.validator.VerificationValidationContext; import uk.gov.companieshouse.sdk.manager.ApiSdkManager; @RestController @@ -31,15 +33,17 @@ public class ValidationStatusControllerImpl implements ValidationStatusControlle public static final String TRANSACTION_NOT_SUPPORTED_ERROR = "Transaction not supported: FEATURE_FLAG_TRANSACTIONS_CLOSABLE_250124=false"; private final PscVerificationService pscVerificationService; + private final VerificationValidationService validatorService; private final ErrorMapper errorMapper; private final Logger logger; private final boolean isTransactionsCloseableEnabled; - public ValidationStatusControllerImpl(final PscVerificationService pscVerificationService, + public ValidationStatusControllerImpl(final PscVerificationService pscVerificationService, VerificationValidationService validatorService, final ErrorMapper errorMapper, @Value("#{new Boolean('${feature.flag.transactions.closable}')}") final boolean isTransactionsClosableEnabled, final Logger logger) { this.pscVerificationService = pscVerificationService; + this.validatorService = validatorService; this.errorMapper = errorMapper; this.isTransactionsCloseableEnabled = isTransactionsClosableEnabled; this.logger = logger; @@ -49,7 +53,6 @@ public ValidationStatusControllerImpl(final PscVerificationService pscVerificati } @Override - @ResponseBody @ResponseStatus(HttpStatus.OK) @GetMapping(value = "/{filingResourceId}/validation_status", produces = {"application/json"}) public ValidationStatusResponse validate(@PathVariable("transactionId") final String transId, @@ -80,7 +83,6 @@ private ValidationStatusResponse isValid(final PscVerification pscVerification, validationStatus.setValidationStatusError(validationErrors); } else { - validationStatus.setValid(false); validationStatus.setValidationStatusError(new ValidationStatusError[]{ new ValidationStatusError(TRANSACTION_NOT_SUPPORTED_ERROR, null, null, ErrorType.SERVICE.getType())}); @@ -91,9 +93,12 @@ private ValidationStatusResponse isValid(final PscVerification pscVerification, private ValidationStatusError[] calculateIsValid(final PscVerification pscVerification, final String passthroughHeader, final Transaction transaction) { - //TODO code to be added to call some Filing Validation service final var errors = new ArrayList(); - return errorMapper.map(errors); - } + VerificationValidationContext context = new VerificationValidationContext( + pscVerification.getData(), errors, transaction, PscType.INDIVIDUAL, passthroughHeader); + + validatorService.validate(context); + return errorMapper.map(context.errors()); + } } \ No newline at end of file diff --git a/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidator.java b/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidator.java index cfa8368..ab25a26 100644 --- a/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidator.java +++ b/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidator.java @@ -26,14 +26,13 @@ public void validate(final VerificationValidationContext validationContext) { try { pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(), validationContext.passthroughHeader()); - //TODO - handle - Validation should not continue if the PSC does not exist + super.validate(validationContext); } catch (FilingResourceNotFoundException e) { validationContext.errors().add( new FieldError("object", "psc_appointment_id", validationContext.dto().pscAppointmentId(), false, - new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc_appointment_id-not-found"))); + new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc-appointment-id-not-found"))); } - super.validate(validationContext); } } diff --git a/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidator.java b/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidator.java index 2b13156..4cc859f 100644 --- a/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidator.java +++ b/src/main/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidator.java @@ -1,9 +1,11 @@ package uk.gov.companieshouse.pscverificationapi.validator; import java.util.Map; +import java.util.Optional; + import org.springframework.stereotype.Component; import org.springframework.validation.FieldError; -import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceInvalidException; +import uk.gov.companieshouse.api.model.psc.PscApi; import uk.gov.companieshouse.pscverificationapi.service.PscLookupService; @Component @@ -24,11 +26,10 @@ public PscIsActiveValidator(final Map validation, final PscLooku @Override public void validate(final VerificationValidationContext validationContext) { - try { - pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(), - validationContext.passthroughHeader()); + PscApi pscApi = pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(), + validationContext.passthroughHeader()); - } catch (FilingResourceInvalidException e) { + if (Optional.ofNullable(pscApi.getCeasedOn()).isPresent()) { validationContext.errors().add( new FieldError("object", "psc_appointment_id", validationContext.dto().pscAppointmentId(), false, new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc-is-ceased"))); diff --git a/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImplTest.java b/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImplTest.java index 0087b43..0c60a91 100644 --- a/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImplTest.java +++ b/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/PscVerificationControllerImplTest.java @@ -56,7 +56,6 @@ import uk.gov.companieshouse.pscverificationapi.model.mapper.PscVerificationMapperImpl; import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService; import uk.gov.companieshouse.pscverificationapi.service.TransactionService; -import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService; import uk.gov.companieshouse.sdk.manager.ApiSdkManager; @ExtendWith(SpringExtension.class) // JUnit 5 @@ -83,8 +82,6 @@ class PscVerificationControllerImplTest { private TransactionService transactionService; @Mock private PscVerificationService pscVerificationService; - @Mock - private VerificationValidationService validationService; @Autowired private PscVerificationMapper filingMapper; @Mock @@ -110,7 +107,7 @@ public static Stream provideCreateParams() { @BeforeEach void setUp() { testController = new PscVerificationControllerImpl(transactionService, - pscVerificationService, validationService, filingMapper, clock, logger); + pscVerificationService, filingMapper, clock, logger); verification = VerificationDetails.newBuilder() .uvid(UVID) .statements(EnumSet.of(VerificationStatementConstants.INDIVIDUAL_VERIFIED)) diff --git a/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImplTest.java b/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImplTest.java index 9505ee3..881d594 100644 --- a/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImplTest.java +++ b/src/test/java/uk/gov/companieshouse/pscverificationapi/controller/impl/ValidationStatusControllerImplTest.java @@ -17,7 +17,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.web.util.UriComponentsBuilder; import uk.gov.companieshouse.api.model.common.ResourceLinks; import uk.gov.companieshouse.api.model.transaction.Transaction; import uk.gov.companieshouse.api.model.validationstatus.ValidationStatusError; @@ -26,6 +25,7 @@ import uk.gov.companieshouse.pscverificationapi.mapper.ErrorMapper; import uk.gov.companieshouse.pscverificationapi.model.entity.PscVerification; import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService; +import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService; import uk.gov.companieshouse.sdk.manager.ApiSdkManager; @ExtendWith(MockitoExtension.class) @@ -40,6 +40,8 @@ class ValidationStatusControllerImplTest { @Mock private PscVerificationService pscVerificationService; @Mock + private VerificationValidationService validatorService; + @Mock private HttpServletRequest request; @Mock private Logger logger; @@ -53,13 +55,13 @@ class ValidationStatusControllerImplTest { @BeforeEach void setUp() { - testController = new ValidationStatusControllerImpl(pscVerificationService, errorMapper, true, logger); + testController = new ValidationStatusControllerImpl(pscVerificationService, validatorService, errorMapper, true, logger); when(request.getHeader(ApiSdkManager.getEricPassthroughTokenHeader())).thenReturn(PASSTHROUGH_HEADER); } @Test void validateWhenClosableFlagFalse() { - testController = new ValidationStatusControllerImpl(pscVerificationService, errorMapper, false, logger); + testController = new ValidationStatusControllerImpl(pscVerificationService, validatorService, errorMapper, false, logger); final var filing = PscVerification.newBuilder().build(); when(pscVerificationService.get(FILING_ID)).thenReturn(Optional.of(filing)); diff --git a/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidatorTest.java b/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidatorTest.java index 4c7c01a..e8e25e6 100644 --- a/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidatorTest.java +++ b/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscExistsValidatorTest.java @@ -78,7 +78,7 @@ void validateWhenPscDoesNotExist() { when(pscLookupService.getPsc(transaction, pscVerificationData, pscType, passthroughHeader)).thenThrow(new FilingResourceNotFoundException( "PSC Details not found for " + PSC_ID + ": 404 Not Found", errorResponseException)); - when(validation.get("psc_appointment_id-not-found")).thenReturn("not-exists default message"); + when(validation.get("psc-appointment-id-not-found")).thenReturn("not-exists default message"); testValidator.validate( new VerificationValidationContext(pscVerificationData, errors, transaction, pscType, passthroughHeader)); diff --git a/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidatorTest.java b/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidatorTest.java index c781c41..2e0b215 100644 --- a/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidatorTest.java +++ b/src/test/java/uk/gov/companieshouse/pscverificationapi/validator/PscIsActiveValidatorTest.java @@ -7,6 +7,7 @@ import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.mockito.Mockito.when; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -21,7 +22,6 @@ import uk.gov.companieshouse.api.model.pscverification.PscVerificationData; import uk.gov.companieshouse.api.model.transaction.Transaction; import uk.gov.companieshouse.pscverificationapi.enumerations.PscType; -import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceInvalidException; import uk.gov.companieshouse.pscverificationapi.service.PscLookupService; @ExtendWith(MockitoExtension.class) @@ -46,6 +46,7 @@ class PscIsActiveValidatorTest { private String passthroughHeader; private static final String PSC_ID = "67edfE436y35hetsie6zuAZtr"; + private static final LocalDate TEST_DATE = LocalDate.of(2024, 5, 5); @BeforeEach void setUp() { @@ -61,6 +62,8 @@ void setUp() { @Test void validateWhenPscIsActive() { + when(pscLookupService.getPsc(transaction, pscVerificationData, pscType, + passthroughHeader)).thenReturn(pscApi); testValidator.validate( new VerificationValidationContext(pscVerificationData, errors, transaction, pscType, passthroughHeader)); @@ -71,13 +74,13 @@ void validateWhenPscIsActive() { void validateWhenPscIsCeased() { when(pscVerificationData.pscAppointmentId()).thenReturn(PSC_ID); + when(pscApi.getCeasedOn()).thenReturn(TEST_DATE); var fieldError = new FieldError("object", "psc_appointment_id", pscVerificationData.pscAppointmentId(), false, new String[]{null, PSC_ID}, null, "is ceased default message"); when(pscLookupService.getPsc(transaction, pscVerificationData, pscType, - passthroughHeader)).thenThrow(new FilingResourceInvalidException( - "PSC is already ceased for " + PSC_ID + ": 400 Bad Request", errorResponseException)); + passthroughHeader)).thenReturn(pscApi); when(validation.get("psc-is-ceased")).thenReturn("is ceased default message"); testValidator.validate(