use of net.petafuel.styx.core.xs2a.standards.berlingroup.v1_2.http.GetConsentRequest in project styx by petafuel.
the class ConsentPoll method execute.
public void execute() {
LOG.debug("Executing Task id:{} signature:{}", getId(), getSignature());
Consent currentConsent = persistentConsent.get(consent);
if (currentConsent == null) {
throw new TaskFinalFailureException("Consent queued for polling does not exist in the styx database, cannot poll", TaskFinalFailureCode.POLL_ON_NOT_EXISTING_CONSENT);
} else if (currentConsent.getState() == ConsentStatus.VALID) {
throw new TaskFinalFailureException("Consent with id " + currentConsent.getId() + " is already on state valid, no polling required", TaskFinalFailureCode.POLL_ON_ALREADY_VALID_CONSENT);
}
// TODO make the request type as a parameter
StatusConsentRequest statusConsentRequest = new StatusConsentRequest(null, consent.getId(), null, null);
statusConsentRequest.setPsu(consent.getPsu());
Iterator<Integer> retryIterator = IntStream.range(0, maxRequestRetries).iterator();
while (retryIterator.hasNext()) {
if (Thread.interrupted()) {
throw new TaskFinalFailureException("Task Thread was interrupted");
}
try {
ConsentStatus currentStatus = this.csInterface.getStatus(statusConsentRequest);
if (currentStatus == ConsentStatus.VALID) {
LOG.debug("Consent is valid, SCA was successful");
break;
} else if (!(currentStatus.equals(ConsentStatus.RECEIVED) || currentStatus.equals(ConsentStatus.PARTIALLY_AUTHORISED))) {
currentConsent.setState(currentStatus);
persistentConsent.update(currentConsent);
throw new TaskFinalFailureException("Consent cannot be polled anymore due to unrecoverable status: " + currentStatus.toString(), TaskFinalFailureCode.UNRECOVERABLE_STATUS);
}
LOG.debug("Consent status was not valid: {}", currentStatus);
} catch (BankRequestFailedException e) {
LOG.warn("Trying to poll consent resulted in an error: {} status: {} retry-iteration: {}", e.getMessage(), e.getHttpStatusCode(), retryIterator.next());
}
try {
Thread.sleep(timeoutBetweenRetries);
} catch (InterruptedException e) {
LOG.error("Task {} execution was interrupted: {}", getId(), e.getMessage());
Thread.currentThread().interrupt();
}
retryIterator.next();
}
// TODO make GetConsentRequest class as a parameter
GetConsentRequest getConsentRequest = new GetConsentRequest(null, consent.getId(), null, null);
try {
Consent aspspConsent = csInterface.getConsent(getConsentRequest);
if (!aspspConsent.getState().equals(ConsentStatus.VALID)) {
throw new TaskRetryFailureException("Upon Consent Poll completion, consent is still not authorized by PSU");
}
currentConsent.setFrequencyPerDay(aspspConsent.getFrequencyPerDay());
currentConsent.setValidUntil(aspspConsent.getValidUntil());
currentConsent.setState(aspspConsent.getState());
persistentConsent.update(currentConsent);
LOG.info("Successfully updated consent");
} catch (BankRequestFailedException e) {
LOG.error("Unable to get consent information after polling was successful -> task marked as failed");
throw new TaskRetryFailureException("Unable to get consent information after polling was successful", e);
}
}
Aggregations