package com.feisystems.provider.service; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.feisystems.provider.service.dto.ProviderDto; import com.feisystems.provider.service.mapper.ProviderMapper; import com.feisystems.provider.domain.Provider; import com.feisystems.provider.domain.repository.ProviderRepository; /** * SQL implementation of {@code com.feisystems.provider.domain.service.ProviderService} * * @see com.feisystems.provider.domain.service.ProviderService */ @Service public class ProviderServiceImpl implements ProviderService { public ProviderServiceImpl() { } @Autowired private ProviderRepository providerRepository; @Autowired private ProviderMapper providerMapper; @Transactional(readOnly = true) @Override public ProviderDto getProvider(String npi) { if (npi == null) { throw new IllegalArgumentException( "npi is null in getProvider(String npi)"); } return providerMapper.map(providerRepository.findOne(npi)); } @Override public Map<String, Object> getByGenderCodeAndPostalCodeAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( String genderCode, String postalCode, String taxonomy, String phone, String lastName, String firstName, String entityType, String providerOrganizationName, String pageNumber) { PageRequest page = new PageRequest(Integer.parseInt(pageNumber), 10, Direction.ASC, "providerLastName"); Page<Provider> pages = providerRepository .findAllByProviderGenderCodeLikeAndProviderBusinessPracticeLocationAddressPostalCodeLikeAndTaxonomyLikeAndProviderBusinessPracticeLocationAddressTelephoneNumberLikeAndProviderLastNameLikeAndProviderFirstNameLikeAndEntityTypeLikeAndProviderOrganizationNameLike( calculateGenderCode(genderCode), calculateZipcode(postalCode), calculateSearchString(taxonomy), calculateSearchString(phone), searchPartialString(firstName), calculateSearchString(entityType), searchPartialString(lastName), searchPartialString(providerOrganizationName), page); List<ProviderDto> results = providerMapper.mapToProviderDtoList(pages .getContent()); Map<String, Object> pageResultsMap = new HashMap<String, Object>(); pageResultsMap.put("results", results); pageResultsMap.put("totalNumberOfProviders", pages.getTotalElements()); pageResultsMap.put("totalPages", pages.getTotalPages()); pageResultsMap.put("itemsPerPage", pages.getSize()); pageResultsMap.put("currentPage", pages.getNumber()); return pageResultsMap; } @Override public Map<String, Object> getByGenderCodeAndPostalCodeAndSpecialityAndTelephoneNumberAndLastNameOrProviderOrganizationNameAndFirstNameAndEntityType( String genderCode, String postalCode, String taxonomy, String phone, String lastNameOrFacilityName, String firstName, String entityType, String pageNumber) { PageRequest page = new PageRequest(Integer.parseInt(pageNumber), 10, Direction.ASC, "providerLastName"); Page<Provider> pages = providerRepository .findAllByProviderGenderCodeLikeAndProviderBusinessPracticeLocationAddressPostalCodeLikeAndTaxonomyLikeAndProviderBusinessPracticeLocationAddressTelephoneNumberLikeAndProviderLastNameLikeAndProviderFirstNameLikeAndEntityTypeLikeAndProviderLastNameLikeOrProviderOrganizationNameLike( calculateGenderCode(genderCode), calculateZipcode(postalCode), calculateSearchString(taxonomy), calculateSearchString(phone), searchPartialString(firstName), calculateSearchString(entityType), searchPartialString(lastNameOrFacilityName), page); List<ProviderDto> results = providerMapper.mapToProviderDtoList(pages .getContent()); Map<String, Object> pageResultsMap = new HashMap<String, Object>(); pageResultsMap.put("results", results); pageResultsMap.put("totalNumberOfProviders", pages.getTotalElements()); pageResultsMap.put("totalPages", pages.getTotalPages()); pageResultsMap.put("itemsPerPage", pages.getSize()); pageResultsMap.put("currentPage", pages.getNumber()); return pageResultsMap; } @Override public Map<String, Object> getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( String genderCode, String usStateAbbreviation, String city, String taxonomy, String phone, String lastName, String firstName, String entityType, String providerOrganizationName, String pageNumber) { PageRequest page = new PageRequest(Integer.parseInt(pageNumber), 10, Direction.ASC, "providerLastName"); Page<Provider> pages = providerRepository .findAllByProviderGenderCodeLikeAndProviderBusinessPracticeLocationAddressStateNameAndProviderBusinessPracticeLocationAddressCityNameLikeAndTaxonomyLikeAndProviderBusinessPracticeLocationAddressTelephoneNumberLikeAndProviderLastNameLikeAndProviderFirstNameLikeAndEntityTypeLikeAndProviderOrganizationNameLike( calculateGenderCode(genderCode), usStateAbbreviation, calculateCity(city), calculateSearchString(taxonomy), calculateSearchString(phone), searchPartialString(firstName), calculateSearchString(entityType), searchPartialString(lastName), searchPartialString(providerOrganizationName), page); List<ProviderDto> results = providerMapper.mapToProviderDtoList(pages .getContent()); Map<String, Object> pageResultsMap = new HashMap<String, Object>(); pageResultsMap.put("results", results); pageResultsMap.put("totalNumberOfProviders", pages.getTotalElements()); pageResultsMap.put("totalPages", pages.getTotalPages()); pageResultsMap.put("itemsPerPage", pages.getSize()); pageResultsMap.put("currentPage", pages.getNumber()); return pageResultsMap; } @Override public Map<String, Object> getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameOrProviderOrganizationNameAndFirstNameAndEntityType( String genderCode, String usStateAbbreviation, String city, String taxonomy, String phone, String lastNameOrFacilityName, String firstName, String entityType, String pageNumber) { PageRequest page = new PageRequest(Integer.parseInt(pageNumber), 10, Direction.ASC, "providerLastName"); Page<Provider> pages = providerRepository .findAllByProviderGenderCodeLikeAndProviderBusinessPracticeLocationAddressStateNameAndProviderBusinessPracticeLocationAddressCityNameLikeAndTaxonomyLikeAndProviderBusinessPracticeLocationAddressTelephoneNumberLikeAndProviderLastNameLikeAndProviderFirstNameLikeAndEntityTypeLikeAndProviderLastNameLikeOrProviderOrganizationNameLike( calculateGenderCode(genderCode), usStateAbbreviation, calculateCity(city), calculateSearchString(taxonomy), calculateSearchString(phone), searchPartialString(firstName), calculateSearchString(entityType), searchPartialString(lastNameOrFacilityName), page); List<ProviderDto> results = providerMapper.mapToProviderDtoList(pages .getContent()); Map<String, Object> pageResultsMap = new HashMap<String, Object>(); pageResultsMap.put("results", results); pageResultsMap.put("totalNumberOfProviders", pages.getTotalElements()); pageResultsMap.put("totalPages", pages.getTotalPages()); pageResultsMap.put("itemsPerPage", pages.getSize()); pageResultsMap.put("currentPage", pages.getNumber()); return pageResultsMap; } private String calculateZipcode(String original) { String result = null; if (original != null) { if (SEARCH_STRING.equals(original)) { return original; } result = original.replaceAll("-", ""); if (result.length() < 9 && result.length() > 2) { result = original + SEARCH_STRING; } } return result; } private String calculateSearchString(String original) { String result = null; if (original != null) { String unmasked = original.replaceAll("_", " "); if (SEARCH_STRING.equals(unmasked)) { return unmasked; } else { if (unmasked.length() > 2) { result = unmasked + SEARCH_STRING; } } } return result; } private String calculateGenderCode(String gender) { if (gender == null || !(gender.equalsIgnoreCase("m") || gender.equalsIgnoreCase("f") || gender.equalsIgnoreCase("male") || gender.equalsIgnoreCase("female") || gender .equals("%"))) { throw new IllegalArgumentException( "Gender is null or is incorrect " + "format. Please see " + "com.feisystems.provider.domain.service.ProviderService specifications."); } if (gender.length() > 1) { return gender.substring(0, 1).toLowerCase(); } return gender.toLowerCase(); } private String calculateCity(String original) { String result = null; if (original != null) { if (SEARCH_STRING.equals(original)) { return original; } result = original.replaceAll("_", " "); } return searchPartialString(result); } /** * Allows partial searches for provider search. Used by jpa repository * findByFIELD_NAMELike method Ex: "Balt" returns "Baltimore" * * @param searchField * the search field * @return the string */ private String searchPartialString(String searchField) { return new StringBuilder().append(SEARCH_STRING).append(searchField) .append(SEARCH_STRING).toString(); } }