package at.gv.egiz.moazs.backend; import at.gv.egiz.moazs.MoaZSException; import at.gv.egiz.moazs.client.ClientFactory; import at.gv.egiz.moazs.client.TnvzHelper; import at.gv.egiz.moazs.repository.DeliveryRepository; import at.gv.egiz.moazs.scheme.Mzs2MsgConverter; import at.gv.egiz.moazs.scheme.RequestStatusResponse; import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType; import at.gv.zustellung.msg.xsd.App2ZusePort; import at.gv.zustellung.tnvz.xsd.TNVZServicePort; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.util.function.Consumer; import static at.gv.egiz.moazs.MoaZSException.moaZSExceptionBuilder; import static at.gv.egiz.moazs.scheme.RequestStatusResponse.generateErrorFromException; import static java.lang.String.format; @Component @Profile("!cluster") public class DeliveryRequestBackend implements Consumer { private static final Logger log = Logger.getLogger(DeliveryRequestBackend.class); private static final String MZS_PIPELINE_ERROR_MSG = "An error occured while processing the DeliveryRequest with AppDeliveryID=%s. "; private final DeliveryRepository repository; private final TnvzHelper tnvzHelper; private final Mzs2MsgConverter converter; private final ClientFactory clientFactory; private final Consumer signatureVerifier; @Autowired public DeliveryRequestBackend(DeliveryRepository repository, TnvzHelper tnvzHelper, Mzs2MsgConverter converter, ClientFactory clientFactory, Consumer signatureVerifier) { this.repository = repository; this.tnvzHelper = tnvzHelper; this.converter = converter; this.clientFactory = clientFactory; this.signatureVerifier = signatureVerifier; } /** * Performs all {@code DeliveryRequest}'s Back-End Tasks. * * Fetches {@code DeliveryRequest} referred by appDeliveryID from * {@code DeliveryRepository}, makes sure that all necessary * tasks (query tnvz, query msg, accept status) are executed and * stores the response back to {@code DeliveryRepository}. * @param appDeliveryID */ @Override public void accept(String appDeliveryID) { var exceptionBuilder = moaZSExceptionBuilder(); try { var mzsRequest = repository.retrieveDeliveryRequest(appDeliveryID).orElseThrow(); exceptionBuilder.withDeliverySystem(mzsRequest); at.gv.zustellung.msg.xsd.DeliveryRequestType msgRequest = buildMsgRequest(mzsRequest, exceptionBuilder); var msgClientParams = mzsRequest.getConfig().getMSGClient(); App2ZusePort client = clientFactory.create(msgClientParams, App2ZusePort.class); var status = client.delivery(msgRequest); var response = new RequestStatusResponse(status); exceptionBuilder.withAllParametersInAnswer(response.getAnswer()); verifySignedStatus(response.getResponseID(), appDeliveryID, exceptionBuilder); repository.store(response); } catch (MoaZSException exception) { log.error(format(MZS_PIPELINE_ERROR_MSG, appDeliveryID), exception); var errorResponse = generateErrorFromException(exception); repository.store(errorResponse); } } private void verifySignedStatus(String responseID, String appDeliveryID, MoaZSException.Builder exceptionBuilder) throws MoaZSException { try { var signedStatus = repository.retrieveBinaryResponse(responseID).get(); signatureVerifier.accept(signedStatus); } catch (MoaZSException ex) { throw exceptionBuilder.withMessage(format(MsgResponseBackend.MOASP_SIGNATURE_INVALID_ERROR_MSG, appDeliveryID)) .withErrorCode(MoaZSException.ERROR_MOASP_SIGNATURE_INVALID) .withCause(ex) .build(); } } private at.gv.zustellung.msg.xsd.DeliveryRequestType buildMsgRequest(DeliveryRequestType mzsRequest, MoaZSException.Builder exceptionBuilder) throws MoaZSException { if (mzsRequest.getConfig().isPerformQueryPersonRequest()) { var tnvzClientParams = mzsRequest.getConfig().getTNVZClient(); TNVZServicePort tvnzPort = clientFactory.create(tnvzClientParams, TNVZServicePort.class); var identification = tnvzHelper.performQueryPersonRequest(mzsRequest, tvnzPort, exceptionBuilder); return converter.convert(mzsRequest, identification); } else { return converter.convert(mzsRequest); } } }