MessageQueueDAO.java

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

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
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.message.payload.MessagePayload;
import uk.gov.dhsc.htbhf.claimant.repository.MessageRepository;

import java.time.Duration;
import java.time.LocalDateTime;

import static uk.gov.dhsc.htbhf.claimant.message.MessageStatus.NEW;

/**
 * Responsible for building and storing the complete {@link Message} entities, which involves building the JSON String
 * from the provided object. The objects representing the payload all implement the
 * {@link uk.gov.dhsc.htbhf.claimant.message.payload.MessagePayload} marker interface.
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class MessageQueueDAO implements MessageQueueClient {

    private final MessageRepository messageRepository;
    private final ObjectMapper objectMapper;

    @Override
    public void sendMessage(MessagePayload messagePayload, MessageType messageType) {
        sendMessageWithDelay(messagePayload, messageType, Duration.ZERO);
    }

    @Override
    public void sendMessageWithDelay(MessagePayload messagePayload, MessageType messageType, Duration messageDelay) {
        try {
            messageRepository.save(buildMessage(messagePayload, messageType, messageDelay));
        } catch (JsonProcessingException e) {
            throw new MessageProcessingException("Unable to create JSON payload from object", e);
        }
    }

    private Message buildMessage(MessagePayload messagePayload, MessageType messageType, Duration messageDelay) throws JsonProcessingException {
        String json = objectMapper.writeValueAsString(messagePayload);
        LocalDateTime messageTimestamp = LocalDateTime.now().plus(messageDelay);
        return Message.builder()
                .messagePayload(json)
                .messageType(messageType)
                .processAfter(messageTimestamp)
                .status(NEW)
                .build();
    }
}