LetterMessageProcessor.java
package uk.gov.dhsc.htbhf.claimant.message.processor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.claimant.entity.Message;
import uk.gov.dhsc.htbhf.claimant.exception.EventFailedException;
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.LetterMessageContext;
import uk.gov.dhsc.htbhf.claimant.message.context.MessageContextLoader;
import uk.gov.dhsc.htbhf.claimant.service.audit.FailedLetterEvent;
import uk.gov.service.notify.NotificationClient;
import uk.gov.service.notify.NotificationClientException;
import uk.gov.service.notify.SendLetterResponse;
import java.util.UUID;
@Slf4j
@Component
@RequiredArgsConstructor
public class LetterMessageProcessor implements MessageTypeProcessor {
private final NotificationClient client;
private final MessageContextLoader messageContextLoader;
@Override
public MessageStatus processMessage(Message message) {
LetterMessageContext messageContext = messageContextLoader.loadLetterMessageContext(message);
String messageReference = UUID.randomUUID().toString();
try {
SendLetterResponse sendLetterResponse = client.sendLetter(
messageContext.getLetterType().getTemplateId(),
messageContext.getPersonalisation(),
messageReference
);
log.debug("{} letter sent, reference={}, id={}", messageContext.getLetterType(), messageReference, sendLetterResponse.getNotificationId());
} catch (NotificationClientException e) {
log.error("Failed to send letter message", e);
String failureMessage = String.format("Failed to send %s letter, exception is: %s", messageContext.getLetterType(), e.getMessage());
throw new EventFailedException(buildFailedLetterEvent(messageContext), e, failureMessage);
}
return MessageStatus.COMPLETED;
}
private FailedLetterEvent buildFailedLetterEvent(LetterMessageContext context) {
return FailedLetterEvent.builder()
.claimId(context.getClaim().getId())
.letterType(context.getLetterType())
.templateId(context.getLetterType().getTemplateId())
.build();
}
@Override
public MessageType supportsMessageType() {
return MessageType.SEND_LETTER;
}
}