ClaimMessageSender.java
package uk.gov.dhsc.htbhf.claimant.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.claimant.communications.EmailMessagePayloadFactory;
import uk.gov.dhsc.htbhf.claimant.communications.TextMessagePayloadFactory;
import uk.gov.dhsc.htbhf.claimant.entity.Claim;
import uk.gov.dhsc.htbhf.claimant.message.MessageQueueClient;
import uk.gov.dhsc.htbhf.claimant.message.payload.*;
import uk.gov.dhsc.htbhf.claimant.model.UpdatableClaimantField;
import uk.gov.dhsc.htbhf.claimant.model.eligibility.EligibilityAndEntitlementDecision;
import uk.gov.dhsc.htbhf.claimant.reporting.ClaimAction;
import uk.gov.dhsc.htbhf.eligibility.model.CombinedIdentityAndEligibilityResponse;
import java.time.Duration;
import java.time.LocalDate;
import java.util.List;
import static java.util.Collections.emptyList;
import static uk.gov.dhsc.htbhf.claimant.communications.EmailMessagePayloadFactory.buildEmailMessagePayloadWithFirstAndLastNameOnly;
import static uk.gov.dhsc.htbhf.claimant.communications.LetterMessagePayloadFactory.buildLetterPayloadWithAddressAndPaymentFields;
import static uk.gov.dhsc.htbhf.claimant.communications.LetterMessagePayloadFactory.buildLetterPayloadWithAddressOnly;
import static uk.gov.dhsc.htbhf.claimant.message.MessagePayloadFactory.buildNewCardMessagePayload;
import static uk.gov.dhsc.htbhf.claimant.message.MessagePayloadFactory.buildReportClaimMessagePayload;
import static uk.gov.dhsc.htbhf.claimant.message.MessageType.*;
import static uk.gov.dhsc.htbhf.claimant.message.payload.EmailType.PENDING_DECISION;
import static uk.gov.dhsc.htbhf.claimant.message.payload.EmailType.REPORT_A_BIRTH_REMINDER;
/**
* Responsible for sending messages related to claims (new or updated).
*/
@Component
public class ClaimMessageSender {
private final MessageQueueClient messageQueueClient;
private final EmailMessagePayloadFactory emailMessagePayloadFactory;
private final TextMessagePayloadFactory textMessagePayloadFactory;
private final Integer cycleDurationInDays;
private final Duration reportABirthMessageDelay;
public ClaimMessageSender(MessageQueueClient messageQueueClient,
EmailMessagePayloadFactory emailMessagePayloadFactory,
TextMessagePayloadFactory textMessagePayloadFactory,
@Value("${payment-cycle.cycle-duration-in-days}") Integer cycleDurationInDays,
@Value("${payment-cycle.report-a-birth-message-delay}") Duration reportABirthMessageDelay) {
this.messageQueueClient = messageQueueClient;
this.emailMessagePayloadFactory = emailMessagePayloadFactory;
this.textMessagePayloadFactory = textMessagePayloadFactory;
this.cycleDurationInDays = cycleDurationInDays;
this.reportABirthMessageDelay = reportABirthMessageDelay;
}
public void sendReportClaimMessage(Claim claim, CombinedIdentityAndEligibilityResponse identityAndEligibilityResponse, ClaimAction claimAction) {
ReportClaimMessagePayload payload = buildReportClaimMessagePayload(claim, identityAndEligibilityResponse, claimAction, emptyList());
messageQueueClient.sendMessage(payload, REPORT_CLAIM);
}
public void sendReportClaimMessageWithUpdatedClaimantFields(Claim claim,
CombinedIdentityAndEligibilityResponse identityAndEligibilityResponse,
List<UpdatableClaimantField> updatedClaimantFields) {
ReportClaimMessagePayload payload = buildReportClaimMessagePayload(claim, identityAndEligibilityResponse, ClaimAction.UPDATED, updatedClaimantFields);
messageQueueClient.sendMessage(payload, REPORT_CLAIM);
}
public void sendAdditionalPaymentMessage(Claim claim) {
AdditionalPregnancyPaymentMessagePayload payload = AdditionalPregnancyPaymentMessagePayload.withClaimId(claim.getId());
messageQueueClient.sendMessage(payload, ADDITIONAL_PREGNANCY_PAYMENT);
}
public void sendNewCardMessage(Claim claim, EligibilityAndEntitlementDecision decision) {
RequestNewCardMessagePayload payload = buildNewCardMessagePayload(claim, decision);
messageQueueClient.sendMessage(payload, REQUEST_NEW_CARD);
}
public void sendInstantSuccessEmail(Claim claim, EligibilityAndEntitlementDecision decision, EmailType emailType) {
LocalDate nextPaymentDate = claim.getClaimStatusTimestamp().toLocalDate().plusDays(cycleDurationInDays);
EmailMessagePayload messagePayload = emailMessagePayloadFactory.buildEmailMessagePayload(
claim, decision.getVoucherEntitlement(), nextPaymentDate, emailType);
messageQueueClient.sendMessage(messagePayload, SEND_EMAIL);
}
public void sendReportABirthEmailMessage(Claim claim) {
MessagePayload payload = buildEmailMessagePayloadWithFirstAndLastNameOnly(claim, REPORT_A_BIRTH_REMINDER);
messageQueueClient.sendMessageWithDelay(payload, SEND_EMAIL, reportABirthMessageDelay);
}
public void sendInstantSuccessText(Claim claim, EligibilityAndEntitlementDecision decision, TextType textType) {
TextMessagePayload messagePayload = textMessagePayloadFactory.buildTextMessagePayload(
claim, decision.getVoucherEntitlement(), textType);
messageQueueClient.sendMessage(messagePayload, SEND_TEXT);
}
public void sendDecisionPendingEmailMessage(Claim claim) {
MessagePayload payload = buildEmailMessagePayloadWithFirstAndLastNameOnly(claim, PENDING_DECISION);
messageQueueClient.sendMessage(payload, SEND_EMAIL);
}
public void sendLetterWithAddressOnlyMessage(Claim claim, LetterType letterType) {
MessagePayload payload = buildLetterPayloadWithAddressOnly(claim, letterType);
messageQueueClient.sendMessage(payload, SEND_LETTER);
}
public void sendLetterWithAddressAndPaymentFieldsMessage(Claim claim, EligibilityAndEntitlementDecision decision, LetterType letterType) {
MessagePayload payload = buildLetterPayloadWithAddressAndPaymentFields(claim, decision, letterType);
messageQueueClient.sendMessage(payload, SEND_LETTER);
}
}