CompletePaymentMessageProcessor.java

package uk.gov.dhsc.htbhf.claimant.message.processor;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.claimant.communications.PaymentCycleNotificationHandler;
import uk.gov.dhsc.htbhf.claimant.entity.Message;
import uk.gov.dhsc.htbhf.claimant.message.MessageStatus;
import uk.gov.dhsc.htbhf.claimant.message.MessageType;
import uk.gov.dhsc.htbhf.claimant.message.MessageTypeProcessor;
import uk.gov.dhsc.htbhf.claimant.message.context.CompletePaymentMessageContext;
import uk.gov.dhsc.htbhf.claimant.message.context.MessageContextLoader;
import uk.gov.dhsc.htbhf.claimant.message.payload.PaymentType;
import uk.gov.dhsc.htbhf.claimant.service.payments.PaymentService;

import javax.transaction.Transactional;

import static uk.gov.dhsc.htbhf.claimant.message.MessageStatus.COMPLETED;
import static uk.gov.dhsc.htbhf.claimant.message.MessageType.COMPLETE_PAYMENT;

/**
 * Processes COMPLETE_PAYMENT messages by calling the PaymentService.
 */
@Component
@AllArgsConstructor
@Slf4j
public class CompletePaymentMessageProcessor implements MessageTypeProcessor {

    private PaymentCycleNotificationHandler paymentCycleNotificationHandler;
    private PaymentService paymentService;
    private MessageContextLoader messageContextLoader;

    @Override
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public MessageStatus processMessage(Message message) {
        CompletePaymentMessageContext messageContext = messageContextLoader.loadCompletePaymentMessageContext(message);
        paymentService.completePayment(messageContext.getPaymentCycle(), messageContext.getPaymentCalculation(), messageContext.getPaymentResult());
        sendNotificationEmail(messageContext);
        return COMPLETED;
    }

    @Override
    public MessageType supportsMessageType() {
        return COMPLETE_PAYMENT;
    }

    private void sendNotificationEmail(CompletePaymentMessageContext messageContext) {
        if (messageContext.getPaymentType() == PaymentType.RESTARTED_PAYMENT) {
            paymentCycleNotificationHandler.sendNotificationEmailsForRestartedPayment(messageContext.getPaymentCycle());
        } else if (messageContext.getPaymentType() == PaymentType.REGULAR_PAYMENT) {
            paymentCycleNotificationHandler.sendNotificationEmailsForRegularPayment(messageContext.getPaymentCycle());
        }
    }

}