RequestNewCardMessageProcessor.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.entity.Claim;
import uk.gov.dhsc.htbhf.claimant.entity.Message;
import uk.gov.dhsc.htbhf.claimant.factory.CardRequestFactory;
import uk.gov.dhsc.htbhf.claimant.message.MessageQueueClient;
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.MessageContextLoader;
import uk.gov.dhsc.htbhf.claimant.message.context.RequestNewCardMessageContext;
import uk.gov.dhsc.htbhf.claimant.message.payload.CompleteNewCardMessagePayload;
import uk.gov.dhsc.htbhf.claimant.message.payload.MessagePayload;
import uk.gov.dhsc.htbhf.claimant.model.card.CardRequest;
import uk.gov.dhsc.htbhf.claimant.model.card.CardResponse;
import uk.gov.dhsc.htbhf.claimant.model.eligibility.EligibilityAndEntitlementDecision;
import uk.gov.dhsc.htbhf.claimant.service.CardClient;

import javax.transaction.Transactional;

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

/**
 * Responsible for processing {@link MessageType#REQUEST_NEW_CARD} messages by:
 * Creating a new card,
 * Creating a PaymentCycle for the claim,
 * Sending a MAKE_FIRST_PAYMENT message.
 */
@Component
@AllArgsConstructor
@Slf4j
public class RequestNewCardMessageProcessor implements MessageTypeProcessor {

    private MessageContextLoader messageContextLoader;
    private CardClient cardClient;
    private CardRequestFactory cardRequestFactory;
    private MessageQueueClient messageQueueClient;

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

    @Override
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public MessageStatus processMessage(Message message) {
        RequestNewCardMessageContext context = messageContextLoader.loadRequestNewCardContext(message);
        Claim claim = context.getClaim();
        CardRequest cardRequest = cardRequestFactory.createCardRequest(claim);
        CardResponse cardResponse = cardClient.requestNewCard(cardRequest);
        sendCompleteNewCardMessage(claim, cardResponse.getCardAccountId(), context.getEligibilityAndEntitlementDecision());
        return COMPLETED;
    }

    private void sendCompleteNewCardMessage(Claim claim, String cardAccountId, EligibilityAndEntitlementDecision decision) {
        MessagePayload payload = CompleteNewCardMessagePayload.builder()
                .cardAccountId(cardAccountId)
                .claimId(claim.getId())
                .eligibilityAndEntitlementDecision(decision)
                .build();
        messageQueueClient.sendMessage(payload, COMPLETE_NEW_CARD_PROCESS);
    }

}