IdentityAndEligibilityService.java

package uk.gov.dhsc.htbhf.dwp.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import uk.gov.dhsc.htbhf.dwp.entity.uc.UCHousehold;
import uk.gov.dhsc.htbhf.dwp.factory.IdentityAndEligibilityResponseFactory;
import uk.gov.dhsc.htbhf.dwp.http.GetRequestBuilder;
import uk.gov.dhsc.htbhf.dwp.model.DWPEligibilityRequest;
import uk.gov.dhsc.htbhf.dwp.model.IdentityAndEligibilityResponse;
import uk.gov.dhsc.htbhf.dwp.repository.UCHouseholdRepository;

import java.util.Optional;

@Service
@Slf4j
public class IdentityAndEligibilityService {

    private static final String DWP_ENDPOINT = "/v2/dwp/benefits";
    private final String uri;
    private final UCHouseholdRepository ucHouseholdRepository;
    private final IdentityAndEligibilityResponseFactory responseFactory;
    private final RestTemplate restTemplate;
    private final GetRequestBuilder getRequestBuilder;

    public IdentityAndEligibilityService(@Value("${dwp.base-uri}") String baseUri,
                                         RestTemplate restTemplate,
                                         UCHouseholdRepository ucHouseholdRepository,
                                         IdentityAndEligibilityResponseFactory responseFactory,
                                         GetRequestBuilder getRequestBuilder) {
        this.uri = baseUri + DWP_ENDPOINT;
        this.ucHouseholdRepository = ucHouseholdRepository;
        this.responseFactory = responseFactory;
        this.restTemplate = restTemplate;
        this.getRequestBuilder = getRequestBuilder;
    }

    /**
     * Checks the identity and eligibility of the given request. First check the local database,
     * then call the dwp api if no entries are found.
     *
     * @param eligibilityRequest The eligibility request
     * @return The eligibility response
     */
    public IdentityAndEligibilityResponse checkIdentityAndEligibility(DWPEligibilityRequest eligibilityRequest) {
        String nino = eligibilityRequest.getPerson().getNino();
        Optional<UCHousehold> ucHousehold = ucHouseholdRepository.findHouseholdByAdultWithNino(nino);
        if (ucHousehold.isPresent()) {
            log.debug("Matched UC household: {}", ucHousehold.get().getId());
            return responseFactory.determineIdentityAndEligibilityResponse(ucHousehold.get(), eligibilityRequest);
        }

        log.debug("No match found in db - calling DWP to check identity and eligibility");
        HttpEntity request = getRequestBuilder.buildRequestWithHeaders(eligibilityRequest);
        ResponseEntity<IdentityAndEligibilityResponse> response = restTemplate.exchange(uri, HttpMethod.GET, request, IdentityAndEligibilityResponse.class);
        return response.getBody();
    }

}