MIReporter.java

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

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.message.context.ReportClaimMessageContext;
import uk.gov.dhsc.htbhf.claimant.message.context.ReportPaymentMessageContext;
import uk.gov.dhsc.htbhf.claimant.model.PostcodeData;
import uk.gov.dhsc.htbhf.claimant.model.UpdatableClaimantField;
import uk.gov.dhsc.htbhf.claimant.reporting.payload.ReportClaimPropertiesFactory;
import uk.gov.dhsc.htbhf.claimant.reporting.payload.ReportPaymentPropertiesFactory;
import uk.gov.dhsc.htbhf.claimant.repository.ClaimRepository;

import java.util.List;
import java.util.Map;

/**
 * Responsible for reporting 'events' to Google Analytics (events including new claims and payments made, etc).
 * Also responsible for obtaining postcode data used to provide location info when reporting events.
 */
@Component
@Slf4j
@AllArgsConstructor
public class MIReporter {

    private final ClaimRepository claimRepository;
    private final PostcodeDataClient postcodeDataClient;
    private final ReportClaimPropertiesFactory reportClaimPropertiesFactory;
    private final ReportPaymentPropertiesFactory reportPaymentPropertiesFactory;
    private final GoogleAnalyticsClient googleAnalyticsClient;

    public void reportClaim(ReportClaimMessageContext context) {
        Claim claim = context.getClaim();
        if (postcodeDataIsNotSet(claim) || addressHasBeenUpdated(context)) {
            retrievePostcodeDataAndSaveToClaim(claim);
        }
        Map<String, String> reportProperties = reportClaimPropertiesFactory.createReportPropertiesForClaimEvent(context);
        googleAnalyticsClient.reportEvent(reportProperties);
    }

    public void reportPayment(ReportPaymentMessageContext context) {
        Claim claim = context.getClaim();
        if (postcodeDataIsNotSet(claim)) {
            retrievePostcodeDataAndSaveToClaim(claim);
        }
        Map<String, String> reportProperties = reportPaymentPropertiesFactory.createReportPropertiesForPaymentEvent(context);
        googleAnalyticsClient.reportEvent(reportProperties);
    }

    private boolean postcodeDataIsNotSet(Claim claim) {
        return claim.getPostcodeData() == null;
    }

    private boolean addressHasBeenUpdated(ReportClaimMessageContext context) {
        List<UpdatableClaimantField> updatedClaimFields = context.getUpdatedClaimantFields();
        return updatedClaimFields != null && updatedClaimFields.contains(UpdatableClaimantField.ADDRESS);
    }

    private void retrievePostcodeDataAndSaveToClaim(Claim claim) {
        PostcodeData postcodeData = postcodeDataClient.getPostcodeData(claim);
        claim.setPostcodeData(postcodeData);
        claimRepository.save(claim);
    }
}